2014-04-15 2 views
0

현재 첫 번째 OSM 프로젝트를 개발 중이며 OpenLayers Examples lib의 표준 예제로 시작하려고했지만 Map에 3 개의 마커를 배치하고 다른 레이어도 표시했습니다 (Google Streetmap, Mapnik).)마커가 다른 레이어에 잘못 배치 됨

하지만 (예 : WSM에서 Mapnik으로) 레이어를 변경하면 마커가 스팟 0,0으로 재설정됩니다. 나는 투영력을 바꾸지 않는다.

내가 누락 된 자료가 있습니까?

<script defer="defer" type="text/javascript"> 
    var map, layer; 

    function init(){ 
     OpenLayers.ProxyHost="/proxy/?url="; 
     map = new OpenLayers.Map('map'); 
     layer = new OpenLayers.Layer.WMS("OpenLayers WMS", 
      "http://vmap0.tiles.osgeo.org/wms/vmap0", {layers: 'basic'}); 
     map.addLayer(layer); 

     var osm = new OpenLayers.Layer.OSM();    
     var gmap = new OpenLayers.Layer.Google("Google Streets"); 
     map.addLayers([osm, gmap]); 

     map.setCenter(new OpenLayers.LonLat(0, 0), 0); 

     var markers = new OpenLayers.Layer.Markers("Markers"); 
     map.addLayer(markers); 

     var size = new OpenLayers.Size(21,25); 
     var offset = new OpenLayers.Pixel(-(size.w/2), -size.h); 
     var icon = new OpenLayers.Icon('http://www.openlayers.org/dev/img/marker.png',size,offset); 
     var halfIcon = icon.clone(); 

     markers.addMarker(new OpenLayers.Marker(new OpenLayers.LonLat(10,10),icon)); 
     markers.addMarker(new OpenLayers.Marker(new OpenLayers.LonLat(0,45),halfIcon)); 

     marker = new OpenLayers.Marker(new OpenLayers.LonLat(90,10),icon.clone()); 
     marker.setOpacity(0.9); 
     marker.events.register('mousedown', marker, function(evt) { alert(this.icon.url); OpenLayers.Event.stop(evt); }); 
     markers.addMarker(marker); 
     map.addControl(new OpenLayers.Control.LayerSwitcher()); 
     map.zoomToMaxExtent(); 

     halfIcon.setOpacity(0.5); 
    } 
</script> 
+0

Google지도가 아닌 OpenLayers입니다. 귀하의 태그를 수정했습니다 ... – scai

+0

나는 이것을 위해 jsfiddle을 만들려고했습니다 : http://jsfiddle.net/aA9yL/ –

답변

2

이 문제는 기본 레이어에서 사용하는 투영과 관련이 있습니다. WMS 계층에서 EPSG : 4326의 투영법을 사용하고 있습니다. 900913 (공식적으로 EPSG로 알려진 : OSM 및 Google지도와 같은 다른 잘 알려진지도, 빙지도 EPSG를 사용하지만 이 투영 90.0000

, 타원체로 지구를 고려하고 -180.0000의 정도, -90.0000, 180.0000 바운드 포함 3857). 이것은 지구를 타원체 대신 구형으로 간주하고 -20037508.34에서 20037508.34까지 미터 단위의 경계를 포함하는 mercator 투영법입니다.

그래서 WMS에서 OSM으로 레이어를 변경할 때; 투사가 EPSG : 900913 및 EPSG : 900913으로 변경되면 추가 된 점의 차이가 너무 작아서 (0이 아닌 미터로 간주 됨) 0,0 근처에 투영됩니다. 점 사이의 차이를 보려면 전체 확대/축소로 이동하십시오.

이 문제를 해결하려면 기본 레이어가 변경 될 때 OpenLayers.LonLat.transform 방법을 통해 포인트를 변환해야합니다. 기본 레이어가 변경되면 "changebaselayer"이벤트를 연결하여 이벤트를 발생시킬 수 있습니다.

보다 명확하게하기 위해 I 및 OSM은 WMS 층 투영 표시 다음 변경

  1. 라이트 라벨 안드레아스 의해 제공 jsfiddle을 수정했다. 지도 객체

    map = new OpenLayers.Map('map', { 
        eventListeners: { 
         "changebaselayer": mapBaseLayerChanged 
        } 
    }); 
    
  2. 추가 방법 "을

  3. 관련 changebaselayer 방법 (참조에만 해당)"하는 당신이 방법을 변환 호출하여 marksers의 투사를 변경하는 로직을 작성할 수 있습니다. 이 대답은 당신을 도와줍니다

    function mapBaseLayerChanged(event) { 
        var currentLayer = event.layer; 
        alert(currentLayer.name); 
        // Write code to transform each markers. 
    } 
    

희망.

+0

매우 상세한 답변을 많이 주셔서 감사합니다. 많이 도와 줬어! – danielwinter