在OpenLayers中重新投影基础层


9

我在北美的某些地方有矢量/地形/图像平铺地图,这些地图已发布为ArcGIS Server REST服务。这些地图(A)基于EPSG:26912投影。现在,我想将这些用作我的OpenLayers Web应用程序的底图;此外,我还想使用其他基础地图资源(B),例如OpenStreetmap,Google Maps,ESRI等。由于这些地图大多数位于EPSG:900913中,据我所知,这是球形墨卡托投影,如果我添加这些如果将基本地图图层放入OpenLayers地图组件,则A组和B组将无法正确覆盖,这意味着它们将显示为单独的地图。

我知道这与投影有关,可能需要用proj4js编写一些代码,但是,作为一个新手,我真的不知道从什么开始。

基本上,我想将OSM / Google地图作为第1层的整个世界的基础地图,然后将EPSG:26912北美某些地方的基础图放在第2层,然后将其他WMS或WFS放在顶层。

我需要将EPSG:26912转换为EPSG:900913还是相反?我想我应该使用EPSG:900913作为基本投影。


1
正如我在下面的@iant答案中评论的那样,Esri软件不支持wkid 900913,但支持与wkid EPSG:3857或ESRI:102100相同的坐标系。
mkennedy 2011年

Answers:



4

任何好的WMS都应该能够为您进行重新投影。但是我不知道ArcGIS Server是不是一个好的 WMS。如果无法在900913中提供图层,请考虑使用GeoServer或MapServer作为级联WMS为您处理重新投影。


3
由于不支持该wkid,因此ArcGIS Server无法在900913中提供图层。另一方面,3857 ...!
mkennedy 2011年


2

我不是OpenLayers专家,但是您需要指定地图对象的投影。我认为它默认为WGS84。...我可能是错误的,甚至可能是添加到地图的第一层的来源。

无论如何,请尝试这样的操作(适当更改范围)

var googleMercator = new OpenLayers.Projection("EPSG:900913");
var wgs84 = new OpenLayers.Projection("EPSG:4326");
var options = {
    projection: googleMercator,
    units: "m",
    numZoomLevels: 18,
    maxResolution: 156543.0339,
    maxExtent: new OpenLayers.Bounds(-20037508, -20037508, 20037508, 20037508.34),
    displayProjection: wgs84,
    controls:[new OpenLayers.Control.Navigation()]}

map = new OpenLayers.Map('div', options);

但是请记住,当您想使用纬度来设置地图中心时,必须像这样(从上方使用wgs84和googleMercator变量)来投影从WGS到GoogleMercator的坐标。

 var mapCenter = new OpenLayers.LonLat(148,-36);
 mapCenter.transform(wgs84, googleMercator);
 map.setCenter(mapCenter,8);

1

首先要定义地图投影并显示投影,如下所示:

map.projection = "EPSG:23030";
map.displayProjection = new OpenLayers.Projection("EPSG:4326");

添加坐标转换

一旦开始使用不同的投影,就必须考虑将坐标从一个投影转换为另一种投影的可能性,无论是在显示这些坐标时,还是在从地图的不同坐标系中读取矢量数据时。如前所述,OL不提供此转换逻辑,因此您必须使用Proj4js,您必须将其包含在页面中:

<script src="http://proj4js.org/lib/proj4js-compressed.js"></script>

Proj4js.defs["EPSG:23030"] = "+proj=utm +zone=30 +ellps=intl +towgs84=-131,-100.3,-163.4,-1.244,-0.020,-1.144,9.39 +units=m +no_defs";

定义后,可以通过transform方法实现:

var lonlat = new OpenLayers.LonLat(-3.57138, 39.8384);
lonlat.transform(map.displayProjection, map.baseLayer.projection);
map.setCenter(lonlat, 5);
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.