การปฏิเสธเลเยอร์ฐานใน OpenLayers


9

ฉันมีแผนที่แบบเวกเตอร์ / โทโป / ภาพสำหรับบางแห่งในอเมริกาเหนือซึ่งเผยแพร่เป็นบริการ ArcGIS Server REST แผนที่เหล่านี้ (A) ใช้การประมาณการ EPSG: 26912 ตอนนี้ฉันต้องการใช้สิ่งเหล่านี้เป็นแผนที่พื้นฐานสำหรับแอป OpenLayers บนเว็บของฉัน นอกจากนี้ฉันยังต้องการที่จะใช้แหล่งแผนที่ฐานอื่น ๆ (B) เช่น OpenStreetmap, Google Maps, ESRI เป็นต้นเนื่องจากแผนที่ส่วนใหญ่อยู่ในรูปแบบ EPSG: 900913 ซึ่งเป็นแผนที่ทรงกลม Mercator ที่รู้ของฉันถ้าฉันเพิ่งเพิ่มสิ่งเหล่านี้ เลเยอร์แผนที่พื้นฐานลงในองค์ประกอบแผนที่ OpenLayers กลุ่ม A และกลุ่ม B ไม่ซ้อนทับอย่างถูกต้องซึ่งหมายความว่าพวกเขาจะแสดงเป็นแผนที่แยกต่างหาก

ฉันรู้ว่านี่เป็นสิ่งที่เกี่ยวข้องกับการฉายภาพและอาจต้องใช้รหัสกับ proj4js อย่างไรก็ตามในฐานะมือใหม่ฉันไม่รู้จริงๆว่าจะเริ่มต้นด้วยอะไร

โดยพื้นฐานแล้วฉันต้องการใส่ OSM / Google maps เป็นแผนที่พื้นฐานสำหรับทั้งโลกในระดับ 1 จากนั้นใส่แผนที่พื้นฐาน EPSG: 26912 สำหรับบางสถานที่ในอเมริกาเหนือในระดับ 2 และวาง WMS หรือ WFS อื่น ๆ ไว้ในระดับสูงสุด

ฉันต้องแปลง EPSG: 26912 เป็น EPSG: 900913 หรือตรงกันข้าม ฉันเดาว่าฉันควรใช้ EPSG: 900913 เป็นเส้นโครงพื้นฐาน


1
ตามที่ฉันแสดงความคิดเห็นกับคำตอบของ @ iant ด้านล่างซอฟต์แวร์ Esri ไม่รองรับ wkid 900913 แต่รองรับระบบพิกัดเดียวกันกับ wkid EPSG: 3857 หรือ ESRI: 102100
mkennedy

คำตอบ:


7

OpenLayers สามารถแปลงเลเยอร์เวกเตอร์ (เช่น WFS) หากเลเยอร์เวกเตอร์ของคุณอยู่ใน EPSG: 900913 หรือ EPSG: 4326 OpenLayers สามารถจัดการการเปลี่ยนแปลงได้เองมิฉะนั้นจะต้องมี Proj4j

มีตัวอย่างของวิธีการใช้ OpenLayers กับ Proj4js

OpenLayers เลเยอร์ Raster ไม่สามารถแปลงได้ หากคุณต้องการที่จะรวมไว้ในประมาณการที่แตกต่างกันคุณต้อง reproject พวกเขาด้วยตัวเองหรือใช้พร็อกซี่ reprojecting WMS เช่นGeoWebCache


4

WMS ที่ดีใด ๆ จะสามารถทำการคัดค้านให้คุณได้ อย่างไรก็ตามฉันไม่รู้ว่า ArcGIS Server เป็นWMS ที่ดีหรือไม่ หากไม่สามารถจัดหาเลเยอร์ใน 900913 ให้พิจารณาใช้ GeoServer หรือ MapServer เป็น WMS แบบเรียงซ้อนเพื่อจัดการกับการคัดลอกสำหรับคุณ


3
ArcGIS Server ไม่สามารถให้เลเยอร์ได้ใน 900913 เพราะ wkid นั้นไม่รองรับ 3857 ตรงกันข้าม ... !
mkennedy

คุณต้องการdocs.openlayers.org/library/…จากนั้น
Ian Turton

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

แต่จำไว้เมื่อคุณต้องการตั้งศูนย์กลางแผนที่โดยใช้ lat คุณจะต้องฉายภาพที่ประสานงานจาก 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";

หลังจาก definition คุณสามารถทำได้โดยวิธีการแปลง:

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.