OpenLayers의지도 투영


22

OpenLayers의 Google지도 레이어에서 투영이 WGS-84 인 일부 데이터를 오버레이하고 싶습니다. 그러나 나는 그들을 올바른 장소에서 만들 수 없습니다. 나는 다음과 같이했다 :

map = new OpenLayers.Map('map', {           
        numZoomLevels: 20,
        projection: new OpenLayers.Projection("EPSG:900913"),
        displayProjection: new OpenLayers.Projection("EPSG: 4326")
        });
googlelayer = new OpenLayers.Layer.Google("Google street", {sphericalMercator: true});
map.addLayer(googlelayer);
veclayer = new OpenLayers.Layer.Vector("vector", {
                                    projection: map.displayProjection
                                    };
var geojson_format = new OpenLayers.Format.GeoJSON();
veclayer.addFeatures(geojson_format.read(jsonData));

veclayer4326 프로젝션에 할당 되었지만 여전히 900913으로 해석되며 디스플레이 조정 시스템도 900913이지만 displayProjection을 4326으로 ​​설정했습니다. 어떤 실수를합니까?

답변:


16

나는 "preFeatureInsert"의 큰 팬입니다 ....

var veclayer = new OpenLayers.Layer.Vector("vector", {
           projection: map.displayProjection,
           preFeatureInsert: function(feature) {
           feature.geometry.transform(projWGS84,proj900913);
           }
        });

아하! 대단히 감사합니다. 하지만 preFeatureInsert어쨌든 그 속성이 무엇을 의미 하는지 궁금 합니다. 공식 API 문서에서 찾을 수 없습니다 ~
ChanDon

1
한국인 IM 걱정으로,이 기능은 ... 삽입 좋고 일반 전에 정의하지 않고, 변환 함수 등을 필요로 변환 돌기
CatchingMonkey

6

콜론 뒤에 공백이 있습니다. Projection("EPSG: 4326")실제로 Projection("EPSG:4326")공간이 없어야합니다 4326.


하하 정말 작동합니다! 디스플레이 프로젝션을 의미합니다. 그러나 중첩 된 데이터는 여전히 올바른 위치에 있지 않습니다 (이전과 같은 잘못된 위치). 어떤 아이디어?
ChanDon

2
               map = new OpenLayers.Map('map',
                { numZoomLevels: 19,
                  units: 'm',
                  eventListeners: {"moveend": update_movend},
                  projection: new OpenLayers.Projection("EPSG:900913"),
                  displayProjection: new OpenLayers.Projection("EPSG:4326")

                });

        OpenLayers.Projection.addTransform("EPSG:4326", "EPSG:900913", OpenLayers.Layer.SphericalMercator.projectForward);
        OpenLayers.Projection.addTransform("EPSG:900913", "EPSG:4326", OpenLayers.Layer.SphericalMercator.projectInverse);


        var layerMapnik = new OpenLayers.Layer.OSM.Mapnik("Mapnik");
        var layerTah = new OpenLayers.Layer.OSM.Osmarender("Osmarender");

        var gphy = new OpenLayers.Layer.Google(
            "Google Physical",
            {
                type: google.maps.MapTypeId.TERRAIN
            }
        );
//        gphy = map.projection;

        var gmap = new OpenLayers.Layer.Google(
            "Google Streets",
            {
                numZoomLevels: 20,
            }
        );
        //gmap = map.projection;

        layerMapnik.projection = map.projection;
        layerTah.projection = map.projection;

        vectors = new OpenLayers.Layer.Vector("Vector Layer");

          var help_layer = new OpenLayers.Layer.Vector("Waypoints", {
             projection: map.displayProjection,
             strategies: [new OpenLayers.Strategy.Fixed()],
         });

이전 코드 스 니펫을 게시했습니다. 나는 clou가 예상에 있다는 것을 기억합니다. addTransform이 문제를 해결해야합니다. (proj4)


도와 주셔서 감사합니다. 하지만 작동하지 않는 것 같습니다
ChanDon

1

다른 기본 레이어에서는 좋으며 EPSG : 4326을 EPSG : 900913 또는 EPSG : 3857로 변환해도 모든 것이 해결되지는 않지만 Google지도에서 약간 오프셋 된 벡터 표현을 찾고 있기 때문에 문제가 발생할 수 있습니다.

Google지도에는 아직 OpenLayers지도 객체가 표시되지 않은 경우 div 크기가 제대로 평가되지 않는 버그가 있습니다. 따라서 transform () & redraw () 호출 후 myMapObject.updateSize();화면에서지도의 실제 비율을 Google에 알려야 할 수 있습니다.

한 투영에서 다른 투영으로 레이어를 변환하는 일반적인 솔루션을 찾고 있다면이 함수를 사용할 수 있습니다.

var myMap = new OpenLayers.Map('mapDiv');

function mapBaseLayerChanged(evtObj) {
  var mapProj, baseProj, map_this, newBase;
  map_this = this;
  newBase = evtObj.layer;
  mapProj = (map_this.projection && map_this.projection instanceof OpenLayers.Projection) ?
            map_this.projection : new OpenLayers.Projection(map_this.projection);
  baseProj = newBase.projection;
  if (!(baseProj.equals(mapProj))) {
     var center, maxExt;
     center = map_this.getCenter().transform(mapProj, baseProj);
     maxExt = newBase.maxExtent;
     map_this.projection = baseProj;
     map_this.maxExtent = maxExt;
     map_this.setCenter(center, map_this.getZoom(), false, true);
     // Transforms all sub-layers
     for (var i = 0; i < map_this.layers.length; i++) {
        if (map_this.layers[i].isBaseLayer == false) {
           map_this.layers[i].addOptions({projection: baseProj}, true);
           // Transforms all features of the vectors
           for (var j = 0; j < map_this.layers[i].features.length; j++) {
              map_this.layers[i].features[j].geometry.transform(mapProj, baseProj);
           }
           map_this.layers[i].redraw();
        }
     }
     //Solves Google's problem (and mine at the same occasion)
     map_this.updateSize();
  }
}
myMap.events.register('changebaselayer', myMap, mapBaseLayerChanged);

vo!


0

Yahoo의 경우 다음 옵션을 시도 할 수 있습니다.

baseLayerOptions:{
  sphericalMercator: true,
  maxExtent:new OpenLayers.Bounds(-20037508.34,-20037508.34,20037508.34,20037508.34)
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.