OpenLayersでのベースレイヤーの再投影


9

ArcGIS Server RESTサービスとして公開された北米のいくつかの場所のベクター/トポ/画像タイルマップがあります。これらのマップ(A)はEPSG:26912投影に基づいています。次に、これらをOpenLayers Webアプリのベースマップとして使用します。さらに、OpenStreetmap、Googleマップ、ESRIなど、他のベースマップソース(B)も使用したいと思います。これらのマップのほとんどはEPSG:900913にあります。 OpenLayersマップコンポーネントへのベースマップレイヤー、グループAとグループBは正しくオーバーレイされません。つまり、それらは別々のマップとして表示されます。

これは投影に関連していることを知っており、proj4jsでいくつかのコードが必要になる可能性がありますが、初心者として、何から始めればよいのか本当にわかりません。

基本的に、OSM / Googleマップを全世界のベースマップとしてTier 1に配置し、北米の一部の場所のEPSG:26912ベースマップをTier 2に配置し、他のWMSまたはWFSを最上層に配置します。

EPSG:26912をEPSG:900913またはその逆に変換する必要がありますか?ベースプロジェクションとしてEPSG:900913を使用する必要があると思います。


1
以下の@iantの回答にコメントしたように、Esriソフトウェアはwkid 900913をサポートしていませんが、wkid EPSG:3857またはESRI:102100と同じ座標系をサポートしています。
mkennedy 2011

回答:


7

OpenLayersは(WFSのような)ベクターレイヤーを変換できます。ベクターレイヤーがEPSG:900913またはEPSG:4326にある場合、OpenLayersは変換自体を処理できます。それ以外の場合は、Proj4jsを含める必要があります。

OpenLayersをProj4jsで使用する方法の例があります。

ラスターレイヤーはOpenLayersでは変換できません。それらを別のプロジェクションに含める必要がある場合は、自分で再投影するか、GeoWebCacheなどの再投影 WMSプロキシを使用する必要があります。


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);

ただし、緯度、経度を使用して地図の中心を設定する場合は、その座標をWGSからGoogleMercatorにこのように投影する必要があります(上記のwgs84および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);
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.