OpenLayers 2'de bir Google katmanındaki lat / lon noktalarını nasıl kaplayabilirim?


13

OpenLayers'ta bir Google katmanının üstünde lat / lon'a bir vektör noktası ekleyerek takıldım. Haritayı kaydırdığımda nokta hareket ediyor. Google katmanını WGS84'te bir katmanla değiştirirsem bu gerçekleşmez. Bunu nasıl düzeltebilirim?

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

Http://docs.openlayers.org/library/spherical_mercator.html ' ı takip etmeyi denedim ama başarılı olamadım.


Benim sorunum aynı sayfada Jquery kullanımı ile ilgili. Jquery için tüm başvuruları alırsanız iyi çalışıyor.

Yanıtlar:


11

Gerekli sonuçları almak için birkaç değişiklik eklemeniz gerekir:

  1. Vektör katmanlarının Google temel katmanınızın üstünde doğru bir şekilde gösterilmesi için sphericalMercator: true özelliğini Google katmanınıza ekleyin (kaydırma geometrisinin nedeni budur).
  2. Google katmanınızın maxExtent özelliğini ekleyin, aksi takdirde haritanın merkezi doğru şekilde ayarlanmaz. Aşağıda gösterilen kapsam Mercator koordinatlarında dünyanın kapsamıdır.
  3. User1795'in belirttiği gibi, harita üzerinde doğru görünmesi için nokta geometrinizin 4326'dan Web Mercator'a yeniden yönlendirilmesi gerekir.
  4. Bu setCenter LonLat için de geçerlidir, bu yüzden bunu da dönüştürmeniz gerekir.

Aşağıdaki çalışma kodu:

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

Harika çalışıyor! Dönüşümler söz konusu olduğunda OpenLayers'ın gerçekten sezgisel olmadığı anlaşılıyor. Yeniden projeksiyonları mümkün kılan 'spericalMercator' seçeneği mi?
underdark

1
Sezgisel olmadığını kabul edin ... sphericalMercator seçeneği, diğer projeksiyonlardaki verilerle çalışmasına izin veren aşağıdaki işlevleri ekler - dev.openlayers.org/docs/files/OpenLayers/Layer/…
geographika

4

Bu bir projeksiyon problemidir, noktanın projeksiyonunu taban katmanının projeksiyonuna dönüştürmeniz gerekir (google map burada). Aşağıdaki kod çalışmalıdır

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

Bunun nedeni, google haritasının (küresel mercator) varsayılan projeksiyonunun 900913 ve 4326'da lonlat'ta basit bir noktanın olmasıdır.

Lütfen noktanın (enlem, boylam) olarak değil (boylam, enlem) olarak ayarlandığından emin olun.


Dönüşümü eklemek haritadaki noktayı ortadan kaldırıyor. Fark yaratırsa OpenLayers sürümüm 2.9.1'dir.
underdark

Point.transform benim için hile yaptı!
Stefan

1

Google Maps JS API ile çalışırken sürüme dikkat etmelisiniz. Geliştirme sürümü Google JS Maps API ile gitmek için varsayılan var. Sayfayı kontrol edin: http://code.google.com/apis/maps/documentation/javascript/basics.html#Versioning

Google Maps JS ekibi de hataları düzeltiyor. Http://code.google.com/p/gmaps-api-issues/wiki/JavascriptMapsAPIv3Changelog'u kontrol edin

Gelecekte, sorudaki Google Haritalar API'sından bahsedin. v3.3, Openlayers ile çoğunlukla geliştiriciler tarafından kullanılan bir sorunla karşılaşmadı.


Merhaba Senthil, Google Maps JS API sürümlerinin OpenLayers ile olan sorunumu nasıl etkilediğinden emin değilim.
underdark

Merhaba Underdark, ben Openlayers ile kullanılan ve daha sonra özellikle 3.3 kullanarak v3.4 ile ilgili bir sorun vardı ve google haritalar gövde sürümü kullanırken, sonuçları geliştirme devam olarak tahmin edilemez. Sürüm oluşturmayı denediniz mi? Openlayers kullanıyor olsanız bile, Google bunun altında yatan API'ları eşler.
Senthil

0

Bence bu bir projeksiyon konusu.

Harita tarandığında noktanın centroidini bildirmeyi denediniz mi? Bir şeyin değişip değişmediğini görebilirsiniz.

Ama ne kod cna görmek, farklı bir corordsys WGS84 noktası eklemek istiyorsunuz


Bu arada, haritanın izdüşümünü sorgulamayı denediniz mi, sadece gerçekte ne olarak ayarlandığını görmek için?
Kıllı

ve son olarak, üzgünüm, ancak projeksiyon sorunları yaşıyorsanız, noktanızı dönüştürmenin bir yolu var: var a = new OpenLayers.LonLat (3,53) .transform (ll, new OpenLayers.Projection ('EPSG: 900913')) ;
Tüylü
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.