目前,我正在使用Mono4Droid实现一个地图App,并且我使用WebView来呈现由我自己的tileserver提供的地图。 我正在使用OpenLayers来显示此地图,现在我想使用文本图层来显示一些自定义POI。 不幸的是,地图使用90013投影:
map = new OpenLayers.Map ("map", {
controls:[
new OpenLayers.Control.Navigation(),
new OpenLayers.Control.PanZoomBar(),
new OpenLayers.Control.Permalink(),
new OpenLayers.Control.ScaleLine({geodesic: true}),
new OpenLayers.Control.Permalink('permalink'),
new OpenLayers.Control.MousePosition(),
new OpenLayers.Control.Attribution()],
//maxExtent: new OpenLayers.Bounds(-20037508.34,-20037508.34,20037508.34,20037508.34),
maxResolution: 156543.0339,
numZoomLevels: 19,
units: 'm',
projection: new OpenLayers.Projection("EPSG:900913"),
displayProjection: new OpenLayers.Projection("EPSG:900913")
} );
因此,当我想显示TextLayer提供的Markes时,我必须使用正确格式的坐标。要使地图居中很容易:
var lonLat = new OpenLayers.LonLat(lon, lat).transform(new OpenLayers.Projection("EPSG:4326"), map.getProjectionObject());
map.setCenter (lonLat, zoom);
但是如何自动为TextLayer进行此转换?我想根据着名的EPSG4326将lat lon值放入文本层数据文件(列lat长),而不是根据900913的值(我现在正在做的工作)。
有没有办法让OpenLayers自动将文本图层的坐标转换为地图中使用的格式?也许一个回调函数可以像onShow一样覆盖?
感谢您的帮助! 否则我将不得不自己翻译lat lon值并将计算出的值放在文本文件中,这将使性能受损......
答案 0 :(得分:4)
最后,我自己找到了答案,我必须说我印象非常深刻! OpenLayers非常强大! 这是我的解决方案: 在map-object的选项中,你必须将displayOptions设置为图层的投影,在我的例子中,它支持EPSG:4326:
displayProjection: new OpenLayers.Projection("EPSG:4326")
然后你只需要注意图层使用这个投影(如果它不是默认值)。在我的例子中,文本层在Android上(在WebView中)无法正常工作:当从文本文件中单击标记的图像时,我无法打开弹出窗口。相反,我根据sundials-Example:
使用了矢量图层new OpenLayers.Layer.Vector("TextLayer", {
projection: map.displayProjection,
strategies: [new OpenLayers.Strategy.Fixed()],
protocol: new OpenLayers.Protocol.HTTP({
url: "layerdata/chargingstationsmaptxtlayer.txt",
format: new OpenLayers.Format.Text({
extractStyles: true,
extractAttributes: true
})
})
});
在文本文件中,我现在可以使用EPSG-4326格式的LatLon值。它很容易;-)