标记在其他图层上放错了位置

时间:2014-04-15 14:34:32

标签: javascript openlayers openstreetmap

我目前正在开发我的第一个OSM项目,并尝试从OpenLayers示例库中的标准示例开始,我设法在地图上放置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>

1 个答案:

答案 0 :(得分:2)

此问题与基础图层使用的投影有关。 WMS层使用EPSG的投影:4326。 此投影将地球视为椭球,并包含-180.0000,-90.0000,180.0000,90.0000

的度数界限

虽然OSM和谷歌地图等其他众所周知的地图,Bing地图使用的是EPSG:900913(官方称为EPSG:3857)。 这是墨西哥投影,它将地球视为球体而不是椭圆体,并包含以米为单位的范围,从-20037508.34到20037508.34。

因此,当您将图层从WMS更改为OSM时;投影变化为EPSG:900913和EPSG:900913,您添加的点之间的差异可以忽略不计(因为它们被视为米而不是度数)它们被预测在0,0附近。 (转到完全缩放以查看点之间的差异。)

据我所知,要解决此问题,您必须在更改基础层时通过OpenLayers.LonLat.transform方法转换您的点数。 您可以关联&#34; changebaselayer&#34;更改基础图层时引发事件的事件。

为了更加清晰,我修改了Andreas提供的jsfiddle并进行了以下更改

  1. 添加了WMS和OSM层的标签显示投影。 (仅供参考)
  2. 与地图对象相关联的changebaselayer方法

    map = new OpenLayers.Map('map', {
        eventListeners: {
            "changebaselayer": mapBaseLayerChanged
        }
    });
    
  3. 添加方法&#34;&#34;您可以通过调用transform方法编写逻辑以更改标记的投影。

    function mapBaseLayerChanged(event) {
        var currentLayer = event.layer;
        alert(currentLayer.name);
        // Write code to transform each markers.
    }
    
  4. 希望这个答案可以帮到你。