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.

podmrok
źródło
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]);
geografia
źródło
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ść).

Vikash Talanki
źródło
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.

Senthil
źródło
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

Włochaty
źródło
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