Circle Radii için Geodezik Ölçümler mi Kullanıyorsunuz?


15

Şu anda bir OpenLayers haritalama sitesi geliştiriyorum. Ölçümler bir çizgi aracı ve bir alan aracı kullanılarak yapılabilir. Bunların her ikisi de şu anda OpenLayers API'sinde belirtildiği gibi jeodezik ölçümleri hesaplamak üzere ayarlanmıştır .

Kullanıcı testleri sırasında insanların zaten bildikleri mesafeler için (şehirler arasında sürüş gibi) aracın ölçümlerini sorguladığı için düzlemsel ölçümler yerine jeodezik ölçümler kullanıyorum.

Sitenin yeni bir özelliği, kullanıcının ayarlanan yarıçapın haritasında bir daire çizebilmesidir. OpenLayers yalnızca düzlemsel mesafeler kullanarak daire çizmeye izin verir, bu nedenle kullanıcı daireyi jeodezik ölçüm aracıyla ölçtüğünde değerler eşleşmez. Daire düzlemsel yarıçapının altındaki görüntüde 10km, ancak çap için jeodezik hat ölçümü 12km'dir.

Açıkçası bu bir kullanıcının (ve kendimin) hangisinin doğru olduğunu merak etmesini sağlayacaktır.

alternatif metin

Bu cevaba bakıldığında, çoğu masaüstü CBS sisteminin bu sorunu "yok saydığı" ve düzlemsel ölçümleri ve mesafeleri döndürdüğü anlaşılıyor. Peki, düzlemsel ve jeodezik ölçümlerle başa çıkmak için kullanıcı arayüzü ve doğruluk açısından en iyi uygulama nedir?

Güncelleme

Yarıçaplar ve Mercator projeksiyonu sorununu gösteren bu Google örneğini buldum:

http://maps.forum.nu/gm_sensitive_circle2.html

Çemberi çizmek için kullanılan JavaScript kodu şöyledir:

    var lat1 = (PI/180)* center.lat(); // radians
    var lng1 = (PI/180)* center.lng(); // radians

    for (var a = 0 ; a < 361 ; a++ ) {
        var tc = (PI/180)*a;
        var y = asin(sin(lat1)*cos(d)+cos(lat1)*sin(d)*cos(tc));
        var dlng = atan2(sin(tc)*sin(d)*cos(lat1),cos(d)-sin(lat1)*sin(y));
        var x = ((lng1-dlng+PI) % (2*PI)) - PI ; // MOD function
        var point = new GLatLng(parseFloat(y*(180/PI)),parseFloat(x*(180/PI)));
        circlePoints.push(point);
        bounds.extend(point);
    }

Bu daire dünyanın eğriliğini dikkate alıyor mu?

Son Güncelleme

Http://geographika.co.uk/creating-a-geodesic-circle-in-openlayers adresinde yayınlanan çalışma kodu


1
burada bir şeyler yanlış olmalı. fark, düz çizgi ile sferoidi takip eden çizgi arasındaki bu kısa mesafe üzerinde% 20 olamaz. başka bir şey olmalı.
Nicklas Avén

4
Projeksiyon büyük olasılıkla ekvatorda sadece gerçek ölçeğe sahip olan Mercator'dur (genellikle, başka bir yerde (tek bir enlemde) gerçek ölçeğe sahip Mercator projeksiyonlarına sahip olmak mümkündür, ancak çoğu küresel parametre belirleme ekvatoru kullanır). Ve Mercator için ölçek hataları, gerçek ölçek enleminden kuzeye / güneye doğru ilerledikçe gerçekten çok yüksektir (sonsuz, aslında kutuplarda).
Paul Ramsey

Ölçümler 52 derece kuzeyde alınmıştır ve gerçekten de Mercator projeksiyonundadır. Yani bu Mercator'da çizilen herhangi bir istemci tarafı özelliğinin ekvatorun yakınında olmadığı sürece çok yanlış alanlar ve uzunluklar döndüreceği anlamına mı geliyor?
geographika

1
Evet, durum budur, verileri metre veya feet cinsinden yerel bir ızgaraya yansıtın ve her şey iyi olacak.
Ian Turton

2
@ Paul İyi çağrı. Ancak bu veriler yalnızca projeksiyonun Mercator'ın biri olduğu silindirik olduğunu gösterir. Gerçek silindirik projeksiyonlarda yatay bozulma sn (enlem) değerine eşittir. Bu formül ile 20 / 12.13 çarpıklığı 52.66 derecelik bir enlemde ortaya çıkar; işte tam Limerick enlemi.
whuber

Yanıtlar:


8

Tarayıcıda evde demleme yapıyorsanız, bir "daire" elde edebilirsiniz (projeksiyonunuz nedeniyle ekranda yuvarlak olmayacaktır; çizmeye önem verdiğiniz kadar çok noktaya sahip bir çokgenle yaklaşık olarak tahmin edilir), kullanın a jeodezik hesaplamaların doğrudan bir formu: bir nokta, bir yön (azimut) ve sonuç noktasını size veren bir mesafe verildi. Kanlı detaylar: http://en.wikipedia.org/wiki/Vincenty%27s_formulae#Direct_Method

Birisi javascript için zaten bir çeviri yapmış gibi görünüyor: http://www.movable-type.co.uk/scripts/latlong-vincenty-direct.html . Seni şanslı!

İşleri bitirmek için:

  • Son sonuca ne kadar istekli olduğunuzu (köşe sayısı, n olarak adlandırın) karar verin.
  • 360 derece n parçaya bölün.
  • Tarafından bir çokgen oluşturun (aralık (n) içindeki i için: polygon.add (vincenty_direct (başlangıç_ noktası, i * 360 / n, mesafe)))
  • Aslında, muhtemelen bazı projeksiyon ve planarizasyon tahrişlerini düzeltin:
    • Neredeyse kesinlikle olduğunuz tipik web haritası projeksiyonunu kullanıyorsanız, ortaya çıkan çokgen, bir direğe yakınsa, büyük ölçüde dikey olarak gerilecektir.
    • Benzer şekilde, sonuç çokgeni uluslararası tarih çizgisini geçerse, gerçekten doludur.

Şerefe!


1
Vincenty yöntemi OpenLayers'a zaten adils - dev.openlayers.org/apidocs/files/OpenLayers/… adındaki OpenLayers'a eklenmiş ve açıklamanız, özellikle taşıyıcı parametresi bunu temizlemiştir. Teşekkürler!
geographika

:) 'Tahrişlerin' ne kadar sinir bozucu olduğunu bana bildirin. İdeal olarak, sabitleme zaten OpenLayers'ın bir parçası olurdu ve Just Work olurdu, ama emin değilim.
Dan S.

3

OpenLayers yalnızca düzlemsel mesafeler kullanarak daire çizmeye izin verir

Bir jeodezik daire elde etmek için , ESRI'nin geometri hizmetinde arabellek işlemini kullanabilirsiniz .

... birim ayak veya metre gibi doğrusal ise, jeodezik tamponlama yapılır

Burada serbestçe erişilebilir bir tane var .


Yararlı bağlantı için teşekkürler - Hizmeti arayabilir ve özelliği JavaScript'te güncelleyip güncelleyemeyeceğimi göreceğim. Benim tek endişem herhangi bir zamanda kapatılabilir bir web hizmetine güvenmek olacaktır. Jeodezik tamponlu noktanın doğru / gerçek 10 km'lik daire olacağını varsayıyorum?
geographika

Çember doğru olmalı, ancak ölçüm aracınızı kullanarak kontrol ederim. Geometri hizmetinin standart bir arcgis sunucu kurulumunun bir parçası olduğunu düşünüyorum, bu yüzden emekli olursa, web'de aralarından seçim yapabileceğiniz çok daha fazlası olmalı. google.com/…
Kirk Kuykendall
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.