我正在使用 OpenLayers 地图,我想在其中使用不同的地图服务器,这些地图服务器使用不同的坐标系。OpenLayers 可以将其集成到同一张地图中并自动转换坐标系吗?
3 回答
根据图层的不同,您将始终拥有某种无法真正转换的基础图层(地图)。如果您想在该地图上添加数据(标记、geo json 内容等),您必须将其转换为 baselayer 正在使用的投影。
对于标记,这可以通过以下方式轻松完成:
// defining our coordinate systems
var google = new OpenLayers.Projection("EPSG:900913"),
latlon = new OpenLayers.Projection("EPSG:4326");
// transforming the location to the right coordinate system
var location = new OpenLayers.LonLat( 10, 10 ).transform( latlon, google );
// assuming you made an icon and marker layer
var marker = new OpenLayers.Marker( location, icon );
markerLayer.addMarker( marker );
查看有关将位置从一个系统转换到另一个系统的 Openlayers 文档。
如果地图服务器提供不同的栅格,那么您可能不走运。
但是,如果他们提供矢量(例如 KML 文件)或 JavaScript 编写的地图对象(例如 Dre 的答案),那么您可以在不同的投影之间进行转换,以便所有数据都出现在与底图相同的投影和坐标系上. OpenLayers 有这个钩子(参见 Dre 的答案),但您可能必须包含提供该功能的 Proj4JS 库。
或者您可以自己使用 Proj4JS 在绘图之前转换坐标。
这是一个老问题,但我从搜索中发现了这个问题,并认为我可能会插话,以防这对其他人有帮助。
这可能与提出的问题所面临的情况有所不同,但我最近遇到了类似的情况。就我而言,我需要在一张地图上显示来自两个不同 WMS 提供商的输出。一个在 EPSG:900913 中提供服务,另一个在 EPSG:3857 中提供服务。知道这些在功能上是等效的,我想如果我可以以使服务正常工作的方式请求它们,那么地图将能够与输出一起工作。我的地图位于 900913 中(因此其他服务默认要求使用此投影)。
我如何能够正确请求其他服务如下(填写您的信息):
var myLayer = new OpenLayers.Layer.WMS(
"Name",
"URL", {
"layer": "layer"
});
myLayer.projection = "EPSG:3857";
通常附加?request=getCapabilities
到服务 URL 后,您可以在所需层的 CRS 标记中查看服务中可用的投影。