Ponowne rzutowanie warstw podstawowych w OpenLayers


9

Mam mapy kafelkowe wektorowe / topo / graficzne dla niektórych miejsc w Ameryce Północnej, które zostały opublikowane jako usługa REST ArcGIS Server. Te mapy (A) są oparte na odwzorowaniu EPSG: 26912. Teraz chcę użyć ich jako mapy bazowej dla mojej aplikacji internetowej OpenLayers; poza tym chcę również zużywać inne źródła map podstawowych (B), np. OpenStreetmap, Google Maps, ESRI itp. Ponieważ większość z tych map jest w EPSG: 900913, co jest moją sferyczną projekcją Mercatora, jeśli dodam te podstawowe warstwy mapy w składniku mapy OpenLayers, grupa A i grupa B nie nakładają się poprawnie, co oznacza, że ​​są wyświetlane jako osobne mapy.

Wiem, że jest to coś związanego z projekcją i może potrzebuję trochę kodu do proj4js, jednak jako początkujący nie wiem od czego zacząć.

Zasadniczo chcę umieścić mapy OSM / Google jako mapę bazową dla całego świata na poziomie 1, a następnie umieścić mapy podstawowe EPSG: 26912 dla niektórych miejsc w Ameryce Północnej na poziomie 2, a inne WMS lub WFS na najwyższym poziomie.

czy muszę przekształcić EPSG: 26912 na EPSG: 900913 lub odwrotnie? Chyba powinienem użyć EPSG: 900913 jako projekcji bazowej.


1
Jak skomentowałem poniżej odpowiedź @ iant, oprogramowanie Esri nie obsługuje wkid 900913, ale obsługuje ten sam układ współrzędnych, co wkid EPSG: 3857 lub ESRI: 102100.
mkennedy,

Odpowiedzi:


7

OpenLayers mogą przekształcać warstwy wektorowe (jak WFS). Jeśli twoja warstwa wektorowa jest w formacie EPSG: 900913 lub EPSG: 4326 OpenLayers może obsłużyć samą transformację, w przeciwnym razie wymaga włączenia Proj4js.

Istnieją przykłady użycia OpenLayers z Proj4js.

Warstwy rastrowe nie mogą być przekształcane przez OpenLayers. Jeśli chcesz uwzględnić je w innej projekcji, musisz je ponownie wykonać samodzielnie lub użyć serwera proxy WMS, takiego jak GeoWebCache .


4

Każdy dobry WMS powinien być w stanie zrobić dla ciebie reprojection. Nie mam jednak pojęcia, czy ArcGIS Server to dobry WMS. Jeśli nie jest w stanie podać warstwy w 900913, rozważ użycie GeoServer lub MapServer jako kaskadowego WMS do obsługi ponownej rzutowania.


3
ArcGIS Server nie może dostarczyć warstw w 900913, ponieważ ten wkid nie jest obsługiwany. 3857, z drugiej strony ...!
mkennedy,

potrzebujesz docs.openlayers.org/library/… następnie
Ian Turton

2

Nie jestem guru OpenLayers, ale musisz określić rzutowanie obiektu mapy. Myślę, że domyślnie jest to WGS84 ... Mogę się mylić, może nawet będę źródłem pierwszej warstwy dodanej do mapy.

W każdym razie spróbuj czegoś takiego (Zmień odpowiednio granice)

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

Pamiętaj jednak, że kiedy chcesz ustawić centrum mapy za pomocą lat, lon musisz rzutować tę współrzędną z WGS na GoogleMercator w ten sposób (używając zmiennej wgs84 i googleMercator z góry).

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

1

Pierwszą rzeczą jest zdefiniowanie projekcji mapy i wyświetlenie w następujący sposób:

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

Dodawanie konwersji współrzędnych

Kiedy zaczniesz używać różnych rzutów, musisz zacząć myśleć o możliwości przekształcenia współrzędnych z jednego rzutu na drugi, albo podczas wyświetlania tych współrzędnych, albo podczas odczytu danych wektorowych w innym układzie współrzędnych niż na mapie. Jak wspomniano wcześniej, ta logika konwersji nie jest udostępniana przez OL, więc musisz użyć Proj4js, który musisz umieścić na swojej stronie:

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

po definicji możesz to zrobić metodą transformacji:

var lonlat = new OpenLayers.LonLat(-3.57138, 39.8384);
lonlat.transform(map.displayProjection, map.baseLayer.projection);
map.setCenter(lonlat, 5);
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.