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

Javascript 标记在其他图层上放错了位置,javascript,openlayers,openstreetmap,Javascript,Openlayers,Openstreetmap,我目前正在开发我的第一个OSM项目,并试图从OpenLayers示例库中的标准示例开始,我设法在地图上放置3个标记,并显示其他图层(Google Streetmap,Mapnik) 但如果我继续更改图层(例如从WSM更改为Mapnik),我的标记将重置为点0,0。我不会马上改变投影 有什么我遗漏的吗 <script defer="defer" type="text/javascript"> var map, layer; function init(){

我目前正在开发我的第一个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>

var映射,层;
函数init(){
OpenLayers.ProxyHost=“/proxy/?url=”;
map=newOpenLayers.map('map');
层=新的OpenLayers.layer.WMS(“OpenLayers WMS”,
"http://vmap0.tiles.osgeo.org/wms/vmap0“,{层:'基本'});
map.addLayer(层);
var osm=新的OpenLayers.Layer.osm();
var gmap=newopenlayers.Layer.Google(“谷歌街道”);
addLayers([osm,gmap]);
setCenter(新OpenLayers.LonLat(0,0,0);
var markers=新的OpenLayers.Layer.markers(“markers”);
添加图层(标记);
var size=新的OpenLayers.size(21,25);
var偏移=新的OpenLayers.Pixel(-(大小为w/2),-size.h);
var icon=新的OpenLayers.icon('http://www.openlayers.org/dev/img/marker.png,大小,偏移量);
var halfIcon=icon.clone();
markers.addMarker(newopenlayers.Marker(newopenlayers.LonLat(10,10),icon));
markers.addMarker(新OpenLayers.Marker(新OpenLayers.LonLat(0,45),半图标));
marker=newopenlayers.marker(newopenlayers.LonLat(90,10),icon.clone());
标记物:毛不透明度(0.9);
marker.events.register('mousedown',marker,function(evt){alert(this.icon.url);OpenLayers.Event.stop(evt);});
标记。添加标记(标记);
addControl(新的OpenLayers.Control.LayerSwitcher());
zoomToMaxExtent();
半图标设置不透明度(0.5);
}

此问题与基层使用的投影有关。 WMS层使用EPSG:4326的投影。 该投影将地球视为椭球体,并包含-180万,-90.000,180,90</p>的界。 虽然OSM和谷歌地图等其他知名地图使用的是EPSG:900913(官方名称为EPSG:3857)。 这是墨卡托投影,它把地球看作是球体而不是椭球体,它包含从-200到370到20037508.34到34的米。 因此,当您将图层从WMS更改为OSM时;投影更改为EPSG:900913,在EPSG:900913中,您添加的点之间的差异可以忽略不计(因为它们被视为米而不是度),它们投影到0,0附近。(进行完全缩放以查看点之间的差异。)

根据我的说法,要解决这个问题,你必须通过改变基础层的方法来变换你的点。 当基础层发生更改时,您可以将“changebaselayer”事件关联到引发事件

为了更清楚,我对Andreas提供的内容进行了以下修改

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

    map = new OpenLayers.Map('map', {
        eventListeners: {
            "changebaselayer": mapBaseLayerChanged
        }
    });
    
  • 添加了方法“”,在该方法中,您可以通过调用transform方法编写逻辑来更改标记器的投影

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

  • 希望这个答案对您有所帮助。

    这是OpenLayers,而不是谷歌地图。我修复了你的标签…我试着为此制作了一个JSFIDLE:非常感谢你提供了非常详细的答案。帮了我很多忙!