Memproyeksikan ulang lapisan dasar di OpenLayers


9

Saya memiliki peta ubin vektor / topo / gambar untuk beberapa tempat di Amerika Utara yang diterbitkan sebagai layanan ArcGIS Server REST. Peta-peta ini (A) didasarkan pada proyeksi EPSG: 26912. Sekarang saya ingin menggunakan ini sebagai peta dasar untuk aplikasi web OpenLayers saya; selain itu, saya juga ingin mengkonsumsi sumber peta dasar lainnya (B), misalnya, OpenStreetmap, Google Maps, ESRI, dll. Karena sebagian besar peta ini ada di EPSG: 900913 yang merupakan proyeksi Mercator berbentuk bola sesuai pengetahuan saya, jika saya menambahkan ini dasar layer peta ke komponen peta OpenLayers, grup A dan grup B tidak akan overlay dengan benar, yang berarti mereka ditampilkan sebagai peta yang terpisah.

Saya tahu ini adalah sesuatu yang berhubungan dengan proyeksi, dan mungkin memerlukan beberapa kode dengan proj4js, namun, sebagai seorang pemula, saya tidak benar-benar tahu harus memulai apa.

Pada dasarnya, saya ingin meletakkan peta OSM / Google sebagai peta dasar untuk seluruh dunia di tingkat 1, kemudian menempatkan peta dasar EPSG: 26912 untuk beberapa tempat di Amerika Utara di tingkat 2, dan menempatkan WMS atau WFS lain di tingkat atas.

apakah saya perlu mengubah EPSG: 26912 menjadi EPSG: 900913 atau sebaliknya? Saya kira saya harus menggunakan EPSG: 900913 sebagai proyeksi dasar.


1
Seperti yang saya komentari pada jawaban @ant di bawah ini, perangkat lunak Esri tidak mendukung wkid 900913 tetapi mendukung sistem koordinat yang sama dengan wkid EPSG: 3857 atau ESRI: 102100.
mkennedy

Jawaban:


7

OpenLayers dapat mengubah layer vektor (seperti WFS). Jika layer vektor Anda berada di EPSG: 900913 atau EPSG: 4326 OpenLayers dapat menangani transformasi itu sendiri, jika tidak, ia perlu menyertakan Proj4js.

Ada contoh cara menggunakan OpenLayers dengan Proj4js.

Layers Raster tidak dapat diubah oleh OpenLayers. Jika Anda perlu memasukkan mereka dalam proyeksi yang berbeda, Anda harus memproyeksikan ulang sendiri atau menggunakan proksi WMS yang memproyeksikan ulang seperti GeoWebCache .


4

WMS yang baik harus dapat melakukan proyeksi ulang untuk Anda. Namun saya tidak tahu apakah ArcGIS Server adalah WMS yang baik . Jika tidak dapat menyediakan layer di 900913 maka pertimbangkan untuk menggunakan GeoServer atau MapServer sebagai WMS cascading untuk menangani proyeksi ulang untuk Anda.


3
ArcGIS Server tidak dapat menyediakan lapisan di 900913 karena wkid itu tidak didukung. 3857, di sisi lain ...!
mkennedy


2

Saya bukan guru OpenLayers, tetapi Anda harus menentukan proyeksi objek peta. Saya pikir itu default ke WGS84 .... Saya bisa salah saya bahkan mungkin menjadi sumber lapisan pertama yang ditambahkan ke peta.

Pokoknya coba sesuatu seperti ini (Ubah batas yang sesuai)

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

Tetapi ingat ketika Anda ingin mengatur pusat peta dengan menggunakan lat, jika Anda harus memproyeksikan yang mengkoordinasikan dari WGS ke GoogleMercator seperti ini (menggunakan variabel wgs84 dan googleMercator dari atas).

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

1

Hal pertama yang menentukan proyeksi peta Anda dan menampilkan proyeksi sebagai berikut:

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

Menambahkan konversi koordinat

Setelah Anda mulai menggunakan proyeksi yang berbeda, Anda harus mulai berpikir tentang kemungkinan konversi koordinat dari satu proyeksi ke yang lain, baik ketika menampilkan koordinat tersebut, atau ketika membaca data vektor dalam sistem koordinat yang berbeda dari peta. Seperti yang dinyatakan sebelumnya, logika konversi ini tidak disediakan oleh OL, jadi Anda harus menggunakan Proj4js, yang harus Anda sertakan di halaman Anda:

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

setelah definisi Anda dapat melakukannya dengan mengubah metode:

var lonlat = new OpenLayers.LonLat(-3.57138, 39.8384);
lonlat.transform(map.displayProjection, map.baseLayer.projection);
map.setCenter(lonlat, 5);
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.