Tái định nghĩa các lớp cơ sở trong OpenLayers


9

Tôi có các bản đồ lát gạch vector / topo / hình ảnh cho một số nơi ở Bắc Mỹ đã được xuất bản dưới dạng dịch vụ ArcGIS Server REST. Các bản đồ này (A) dựa trên phép chiếu EPSG: 26912. Bây giờ tôi muốn sử dụng chúng làm bản đồ cơ sở cho ứng dụng web OpenLayers của mình; ngoài ra, tôi cũng muốn sử dụng các nguồn bản đồ cơ sở khác (B), ví dụ: OpenStreetmap, Google Maps, ESRI, v.v. Vì hầu hết các bản đồ này đều nằm trong EPSG: 900913, đó là phép chiếu Mercator hình cầu theo kiến ​​thức của tôi, nếu tôi chỉ thêm những thứ này các lớp bản đồ cơ sở thành thành phần bản đồ OpenLayers, nhóm A và nhóm B sẽ không phủ chính xác, có nghĩa là chúng được hiển thị dưới dạng các bản đồ riêng biệt.

Tôi biết đây là một cái gì đó liên quan đến phép chiếu và có thể cần một số mã với proj4js, tuy nhiên, là một người mới, tôi thực sự không biết phải bắt đầu với cái gì.

Về cơ bản, tôi muốn đặt bản đồ OSM / Google làm bản đồ cơ sở cho toàn thế giới ở tầng 1, sau đó đặt bản đồ cơ sở EPSG: 26912 cho một số địa điểm ở Bắc Mỹ trong tầng 2 và đưa WMS hoặc WFS khác lên tầng trên cùng.

Tôi có cần chuyển đổi EPSG: 26912 thành EPSG: 900913 hoặc ngược lại không? Tôi đoán tôi nên sử dụng EPSG: 900913 làm hình chiếu cơ sở.


1
Như tôi đã nhận xét về câu trả lời của @ iant bên dưới, phần mềm Esri không hỗ trợ wkid 900913 nhưng hỗ trợ hệ thống tọa độ tương tự như wkid EPSG: 3857 hoặc ESRI: 102100.
mkennedy

Câu trả lời:


7

OpenLayers có thể biến đổi các lớp vectơ (như WFS). Nếu lớp vectơ của bạn nằm trong EPSG: 900913 hoặc EPSG: 4326 OpenLayers có thể tự xử lý việc chuyển đổi, nếu không, nó cần có Proj4js đi kèm.

Có các ví dụ về cách sử dụng OpenLayers với Proj4js.

Các lớp raster không thể được chuyển đổi bởi OpenLayers. Nếu bạn cần đưa chúng vào một phép chiếu khác, bạn phải tự mình điều chỉnh lại chúng hoặc sử dụng proxy WMS từ chối như GeoWebCache .


4

Bất kỳ WMS tốt nào cũng có thể thực hiện việc từ chối cho bạn. Tuy nhiên tôi không biết ArcGIS Server có phải là một WMS tốt hay không . Nếu nó không thể cung cấp lớp trong 900913 thì hãy xem xét sử dụng GeoServer hoặc MapServer làm WMS xếp tầng để xử lý việc từ chối cho bạn.


3
ArcGIS Server không thể cung cấp các lớp trong 900913 vì wkid không được hỗ trợ. 3857, mặt khác ...!
mkennedy


2

Tôi không phải là chuyên gia về OpenLayers, nhưng bạn cần chỉ định hình chiếu của đối tượng bản đồ. Tôi nghĩ rằng nó mặc định là WGS84 .... Tôi có thể sai tôi thậm chí có thể là nguồn của lớp đầu tiên được thêm vào bản đồ.

Dù sao, hãy thử một cái gì đó như thế này (Thay đổi giới hạn cho phù hợp)

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

Nhưng sau đó hãy nhớ khi bạn muốn đặt trung tâm bản đồ bằng cách sử dụng lat, bạn phải chiếu phối hợp từ WGS sang GoogleMercator như thế này (sử dụng biến wss84 và googleMercator từ phía trên).

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

1

Điều đầu tiên là xác định phép chiếu bản đồ và phép chiếu hiển thị của bạn như sau:

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

Thêm chuyển đổi tọa độ

Khi bạn bắt đầu sử dụng các phép chiếu khác nhau, bạn phải bắt đầu suy nghĩ về khả năng chuyển đổi tọa độ từ hình chiếu này sang hình chiếu khác, khi hiển thị các tọa độ đó hoặc khi đọc dữ liệu vectơ trong hệ tọa độ khác từ bản đồ. Như đã nêu trước đây, logic chuyển đổi này không được cung cấp bởi OL, vì vậy bạn phải sử dụng Proj4js, mà bạn sẽ phải đưa vào trang của mình:

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

sau khi định nghĩa bạn có thể làm điều đó bằng phương thức biến đổi:

var lonlat = new OpenLayers.LonLat(-3.57138, 39.8384);
lonlat.transform(map.displayProjection, map.baseLayer.projection);
map.setCenter(lonlat, 5);
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.