OpenLayers'ta temel katmanları yeniden oluşturma


9

ArcGIS Server REST hizmeti olarak yayınlanan Kuzey Amerika'daki bazı yerler için vektör / topo / resim döşemeli haritalara sahibim. Bu haritalar (A) EPSG: 26912 projeksiyonuna dayanmaktadır. Şimdi bunları OpenLayers web uygulamam için temel harita olarak kullanmak istiyorum; ayrıca, diğer temel harita kaynaklarını (B), örneğin, OpenStreetmap, Google Maps, ESRI, vb. tüketmek istiyorum. Bu haritaların çoğu EPSG: 900913'te olduğu için, eğer bunları eklersem, harita katmanlarını OpenLayers harita bileşenine yerleştirirseniz, A grubu ve B grubu doğru şekilde yer paylaşmaz, yani ayrı haritalar olarak görüntülenirler.

Bu projeksiyon ile ilgili bir şey olduğunu biliyorum ve proj4js ile bazı kod gerekebilir, ancak, bir acemi olarak, ne ile başlamak için gerçekten bilmiyorum.

Temel olarak, Seviye 1'de tüm dünya için temel harita olarak OSM / Google haritalarını koymak, sonra Seviye 2'de Kuzey Amerika'daki bazı yerler için EPSG: 26912 temel haritaları koymak ve diğer WMS veya WFS'yi en üst seviyeye koymak istiyorum.

: 26912'yi EPSG: 900913 veya tersine dönüştürmem gerekir mi? Temel projeksiyon olarak EPSG: 900913 kullanmalıyım.


1
Aşağıdaki @ iant'ın cevabına yorum yaptığım gibi, Esri yazılımı wkid 900913'ü desteklemiyor, ancak wkid EPSG: 3857 veya ESRI: 102100 ile aynı koordinat sistemini destekliyor.
mkennedy

Yanıtlar:


7

OpenLayers vektör katmanlarını (WFS gibi) dönüştürebilir. Vektör katmanınız EPSG: 900913 veya EPSG: 4326 ise, OpenLayers dönüşümü kendisi halledebilir, aksi takdirde dahil Proj4js gerekir.

OpenLayers'ın Proj4js ile nasıl kullanılacağına dair örnekler vardır.

Raster Katmanlar OpenLayers tarafından dönüştürülemez. Bunları farklı bir projeksiyona dahil etmeniz gerekiyorsa, bunları kendiniz yeniden oluşturmanız veya GeoWebCache gibi yeniden projelendiren bir WMS proxy'si kullanmanız gerekir .


4

Herhangi bir iyi WMS sizin için yeniden projeksiyon yapmalıdır. Ancak ArcGIS Server'ın iyi bir WMS olup olmadığı hakkında hiçbir fikrim yok . Katmanı 900913'te sağlayamıyorsa, GeoServer veya MapServer'ı sizin için yeniden projeksiyonu işlemek için basamaklı bir WMS olarak kullanmayı düşünün.


3
Wkid desteklenmediği için ArcGIS Server 900913'te katman sağlayamıyor. 3857 Öte yandan ...!
mkennedy


2

Ben OpenLayers gurusu değilim ama harita nesnesinin izdüşümünü belirtmeniz gerekiyor. Bence varsayılan WGS84 .... Ben yanlış olabilir ben bile haritaya eklenen ilk katmanın kaynağı olabilir.

Neyse böyle bir şey deneyin (Sınırları uygun şekilde değiştirin)

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

Ancak, bir lat kullanarak harita merkezini ne zaman ayarlamak istediğinizi hatırlayın, bu WGS'den GoogleMercator'a bu koordinatı yansıtmalısınız (wgs84 ve googleMercator değişkenini yukarıdan kullanarak).

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

1

İlk şey, harita projeksiyonunuzu ve ekran projeksiyonunuzu aşağıdaki gibi tanımlamaktır:

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

Koordinat dönüşümü ekleme

Farklı projeksiyonlar kullanmaya başladığınızda, bu koordinatları görüntülerken veya haritadaki farklı bir koordinat sisteminde vektör verilerini okurken koordinatları bir projeksiyondan diğerine dönüştürme olasılığını düşünmeye başlamanız gerekir. Daha önce belirtildiği gibi, bu dönüşüm mantığı OL tarafından sağlanmadığından, sayfanıza dahil etmeniz gereken Proj4js'yi kullanmanız gerekir:

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

tanımdan sonra dönüştürme yöntemi ile yapabilirsiniz:

var lonlat = new OpenLayers.LonLat(-3.57138, 39.8384);
lonlat.transform(map.displayProjection, map.baseLayer.projection);
map.setCenter(lonlat, 5);
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.