Javascript 标记在其他图层上放错了位置
我目前正在开发我的第一个OSM项目,并试图从OpenLayers示例库中的标准示例开始,我设法在地图上放置3个标记,并显示其他图层(Google Streetmap,Mapnik) 但如果我继续更改图层(例如从WSM更改为Mapnik),我的标记将重置为点0,0。我不会马上改变投影 有什么我遗漏的吗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(){
<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提供的内容进行了以下修改
map = new OpenLayers.Map('map', {
eventListeners: {
"changebaselayer": mapBaseLayerChanged
}
});
function mapBaseLayerChanged(event) {
var currentLayer = event.layer;
alert(currentLayer.name);
// Write code to transform each markers.
}
希望这个答案对您有所帮助。这是OpenLayers,而不是谷歌地图。我修复了你的标签…我试着为此制作了一个JSFIDLE:非常感谢你提供了非常详细的答案。帮了我很多忙!