OpenLayers에서 기본 레이어 재 투영


9

ArcGIS Server REST 서비스로 게시 된 북미의 일부 장소에 대한 벡터 / 토포 / 이미지 타일 맵이 있습니다. 이지도 (A)는 EPSG : 26912 투영을 기반으로합니다. 이제 이것을 OpenLayers 웹 앱의 기본 맵으로 사용하고 싶습니다. 또한 OpenStreetmap, Google Maps, ESRI 등과 같은 다른 기본 맵 소스 (B)도 사용하고 싶습니다. 이러한 맵의 대부분은 EPSG : 900913에 있으므로 구식 메르카토르가 내 지식에 투영합니다. 기본지도 레이어를 OpenLayers지도 구성 요소에 추가하면 그룹 A와 그룹 B가 올바르게 오버레이되지 않으므로 별도의지도로 표시됩니다.

나는 이것이 투영과 관련이 있다는 것을 알고 있으며, proj4js가있는 코드가 필요할 수 있지만 초보자로서 나는 무엇을 시작 해야할지 정말로 모른다.

기본적으로 OSM / Google지도를 1 단계에서 전 세계의 기본지도로 설정 한 다음 북미의 일부 장소에 대해 EPSG : 26912 기본지도를 2 단계에서 배치하고 다른 WMS 또는 WFS를 최상위 계층에 배치하고 싶습니다.

EPSG : 26912를 EPSG : 900913로 또는 그 반대로 변환해야합니까? EPSG : 900913을 기본 투영법으로 사용해야한다고 생각합니다.


1
아래 @iant의 답변에 대해 언급했듯이 Esri 소프트웨어는 wkid 900913을 지원하지 않지만 wkid EPSG : 3857 또는 ESRI : 102100과 동일한 좌표계를 지원합니다.
mkennedy

답변:


7

OpenLayer는 WFS와 같은 벡터 레이어를 변환 할 수 있습니다. 벡터 레이어가 EPSG : 900913 또는 EPSG : 4326 인 경우 OpenLayers가 변환 자체를 처리 할 수 ​​있습니다. 그렇지 않으면 Proj4js가 포함되어야합니다.

Proj4js와 함께 OpenLayers를 사용하는 방법에 대한 예가 있습니다.

래스터 레이어는 OpenLayers로 변환 할 수 없습니다. 다른 투영에 포함해야하는 경우 직접 투영하거나 GeoWebCache 와 같은 재 투영 WMS 프록시를 사용해야합니다 .


4

좋은 WMS라면 재 투영이 가능해야합니다. 그러나 ArcGIS Server가 좋은 WMS 인지는 모릅니다 . 900913에서 계층을 제공 할 수 없으면 GeoServer 또는 MapServer를 계단식 WMS로 사용하여 재 투영을 처리하는 것이 좋습니다.


3
wkid가 지원되지 않기 때문에 ArcGIS Server는 900913에서 레이어를 제공 할 수 없습니다. 반면에 3857 ...!
mkennedy


2

저는 OpenLayers 전문가가 아니지만 맵 객체의 투영을 지정해야합니다. 나는 그것이 기본적으로 WGS84로 생각합니다 ....지도에 추가 된 첫 번째 레이어의 소스 일 수도 있습니다.

어쨌든 이와 같은 것을 시도하십시오 (적절한 범위를 변경하십시오)

var googleMercator = new OpenLayers.Projection("EPSG:900913");
var wgs84 = new OpenLayers.Projection("EPSG:4326");
var options = {
    projection: googleMercator,
    units: "m",
    numZoomLevels: 18,
    maxResolution: 156543.0339,
    maxExtent: new OpenLayers.Bounds(-20037508, -20037508, 20037508, 20037508.34),
    displayProjection: wgs84,
    controls:[new OpenLayers.Control.Navigation()]}

map = new OpenLayers.Map('div', options);

그러나 위도, 경도를 사용하여지도 중심을 설정하려면 위의 wgs84 및 googleMercator 변수를 사용하여 WGS에서 GoogleMercator로 좌표를 투영해야합니다.

 var mapCenter = new OpenLayers.LonLat(148,-36);
 mapCenter.transform(wgs84, googleMercator);
 map.setCenter(mapCenter,8);

1

먼저 다음과 같이 맵 투영과 디스플레이 투영을 정의합니다.

map.projection = "EPSG:23030";
map.displayProjection = new OpenLayers.Projection("EPSG:4326");

좌표 변환 추가

다른 투영법을 사용하기 시작하면 해당 좌표를 표시 할 때 또는지도와 다른 좌표계의 벡터 데이터를 읽을 때 좌표를 한 투영에서 다른 투영으로 변환 할 수있는 가능성에 대해 생각해야합니다. 앞에서 언급했듯이이 변환 로직은 OL에서 제공하지 않으므로 Proj4js를 사용해야합니다.이 페이지에 포함해야합니다.

<script src="http://proj4js.org/lib/proj4js-compressed.js"></script>

Proj4js.defs["EPSG:23030"] = "+proj=utm +zone=30 +ellps=intl +towgs84=-131,-100.3,-163.4,-1.244,-0.020,-1.144,9.39 +units=m +no_defs";

정의 후 변환 방법으로 수행 할 수 있습니다.

var lonlat = new OpenLayers.LonLat(-3.57138, 39.8384);
lonlat.transform(map.displayProjection, map.baseLayer.projection);
map.setCenter(lonlat, 5);
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.