我目前正在开发我的第一个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>
答案 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并进行了以下更改
与地图对象相关联的changebaselayer方法
map = new OpenLayers.Map('map', {
eventListeners: {
"changebaselayer": mapBaseLayerChanged
}
});
添加方法&#34;&#34;您可以通过调用transform方法编写逻辑以更改标记的投影。
function mapBaseLayerChanged(event) {
var currentLayer = event.layer;
alert(currentLayer.name);
// Write code to transform each markers.
}
希望这个答案可以帮到你。