Jak nakładać punkty lat / lon na warstwie Google w OpenLayers 2?


13

Utknąłem dodając punkt wektorowy w linii Lat / Lon na warstwie Google w OpenLayers. Punkt przesuwa się, kiedy przesuwam mapę. Nie stanie się tak, jeśli zastąpię warstwę Google warstwą w WGS84. Jak mogę to naprawić?

map = new OpenLayers.Map('map');
map.addControl(new OpenLayers.Control.LayerSwitcher());

var gmap = new OpenLayers.Layer.Google(
            "Google Streets", 
            {numZoomLevels: 20}
           );
var pointLayer = new OpenLayers.Layer.Vector("Point Layer");

map.addLayers([gmap,pointLayer]);
map.setCenter(new OpenLayers.LonLat(16.373056, 48.208333), 5);

var point = new OpenLayers.Geometry.Point(16.373056, 48.208333);
var pointFeature = new OpenLayers.Feature.Vector(point,null,null);
pointLayer.addFeatures([pointFeature]);

Próbowałem śledzić http://docs.openlayers.org/library/spherical_mercator.html, ale bez powodzenia.


Mój problem dotyczy używania Jquery na tej samej stronie. Działa dobrze, jeśli odzyskam wszystkie odniesienia do Jquery.

Odpowiedzi:


11

Musisz dodać kilka zmian, aby uzyskać wymagane wyniki:

  1. Dodaj właściwość sphericalMercator: true do swojej warstwy Google, aby warstwy wektorowe były poprawnie wyświetlane na wierzchniej warstwie podstawowej Google (jest to przyczyną przesunięcia geometrii).
  2. Dodaj właściwość maxExtent warstwy Google, w przeciwnym razie środek mapy nie zostanie ustawiony poprawnie. Zasięg pokazany poniżej to zasięg świata we współrzędnych Mercatora.
  3. Jak stwierdził użytkownik 1795, geometria punktu musi zostać przerzucona z 4326 do Web Mercator, aby poprawnie wyświetlać się na mapie.
  4. Dotyczy to również setCenter LonLat, więc musisz to również przekształcić.

Działający kod poniżej:

            map = new OpenLayers.Map('map');
            map.addControl(new OpenLayers.Control.LayerSwitcher());

            var proj = new OpenLayers.Projection("EPSG:4326");

            var gmap = new OpenLayers.Layer.Google("Google Streets", {
                sphericalMercator: true,
                'maxExtent': new OpenLayers.Bounds(-20037508.34, -20037508.34, 20037508.34, 20037508.34)
            });
            var pointLayer = new OpenLayers.Layer.Vector("Point Layer");

            map.addLayers([gmap, pointLayer]);
            var lonlat = new OpenLayers.LonLat(16.373056, 48.208333);
            lonlat.transform(proj, map.getProjectionObject());
            map.setCenter(lonlat, 5);

            var point = new OpenLayers.Geometry.Point(16.373056, 48.208333);
            point = point.transform(proj, map.getProjectionObject());
            //console.log(point);
            var pointFeature = new OpenLayers.Feature.Vector(point, null, null);
            pointLayer.addFeatures([pointFeature]);

To działa świetnie! Wygląda na to, że OpenLayers nie jest tak naprawdę intuicyjny, jeśli chodzi o transformacje. Czy jest to opcja „spericalMercator”, która faktycznie umożliwia ponowne odrzucenie?
podmrok

1
Zgadzam się, że to nie jest intuicyjne .. opcja sphericalMercator dodaje następujące funkcje, które pozwalają mu pracować z danymi w innych projekcjach - dev.openlayers.org/docs/files/OpenLayers/Layer/…
geographika

4

Jest to problem z rzutowaniem, musisz przekształcić rzut punktu w rzut warstwy bazowej (tutaj mapa Google). Poniższy kod powinien działać

    map = new OpenLayers.Map('map');
    map.addControl(new OpenLayers.Control.LayerSwitcher());

    var gmap = new OpenLayers.Layer.Google(
        "Google Streets", 
        {numZoomLevels: 20}
    );
    var pointLayer = new OpenLayers.Layer.Vector("Point Layer");

    map.addLayers([gmap,pointLayer]);
    map.setCenter(new OpenLayers.LonLat(16.373056, 48.208333), 5);

    var point = new OpenLayers.Geometry.Point(16.373056, 48.208333);
    point.transform(new OpenLayers.Projection("EPSG:4326"),new OpenLayers.Projection("EPSG:900913"));
    var pointFeature = new OpenLayers.Feature.Vector(point,null,null);
    pointLayer.addFeatures([pointFeature])

Wynika to z tego, że domyślna projekcja mapy google (merkator sferyczny) to 900913 i zwykłego punktu w lonlat w 4326.

Upewnij się, że punkt jest ustawiony jako (długość, szerokość), a nie jako (szerokość, długość).


Dodanie transformacji powoduje zniknięcie punktu na mojej mapie. Moja wersja OpenLayers to 2.9.1, jeśli to robi różnicę.
podmrok

Point.transform załatwiło sprawę dla mnie!
Stefan

1

Podczas pracy z interfejsem API JS Google Maps należy zachować ostrożność przy wersji. Domyślnie jest używana wersja API Google JS Maps w wersji rozwojowej. Sprawdź stronę: http://code.google.com/apis/maps/documentation/javascript/basics.html#Versioning

Zespół Google Maps JS też naprawia błędy. Sprawdź http://code.google.com/p/gmaps-api-issues/wiki/JavascriptMapsAPIv3Changelog

W przyszłości w pytaniu należy wspomnieć o wersji interfejsu API Map Google. Wersja 3.3 nie miała żadnych problemów z Openlayers używanymi głównie przez programistów.


Cześć, Senthil, nie jestem pewien, jak wersje Google Maps JS API wpływają na mój problem z OpenLayers.
podmroku

Cześć Podmrok, miałem problem z wersją 3.4, kiedy korzystałem z Openlayers, a następnie konkretnie korzystałem z wersji 3.3, a gdy korzystam z wersji trunk map Google, wyniki są nieprzewidywalne w miarę rozwoju. Próbowałeś z wersjonowaniem? Nawet jeśli używasz Openlayers, Google mapuje interfejs API leżący u podstaw tego.
Senthil

0

Myślę, że to kwestia projekcji.

Czy próbowałeś zgłosić środek ciężkości punktu, gdy mapa się przesuwa? Możesz zobaczyć, czy coś się zmienia.

Ale z tego, co widzę w twoim kodzie, dodałeś punkt WGS84 do innego corordsys


Nawiasem mówiąc, czy próbowałeś zapytać o rzut mapy, którą masz, tylko po to, aby zobaczyć, jak jest ona ustawiona?
Hairy

i na koniec przepraszam, ale istnieje sposób na przekształcenie punktu, jeśli masz problemy z projekcją: var a = new OpenLayers.LonLat (3,53) .transform (ll, new OpenLayers.Projection ('EPSG: 900913')) ;
Hairy
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.