Web Mercator Projeksiyonunda Daha İyi Mesafe Ölçümleri


10

Katmanlarımı bir sql-uzamsal etkin-SDE-coğrafi veritabanında (Geometri türü, Web Mercator-3857) depolayan bir ESRI yığını ile çalışıyorum.

Ben bir web haritalama uygulaması inşa ediyorum, bu yüzden varsayılan olarak, fayans 3857 web mercator da bulunmaktadır.

Saklanan procs aracılığıyla, bir kullanıcının konumundan (web mercator da Koordinatlar) çeşitli katmanlara mesafeleri sorgulamak için STDistance kullanın.

Sorun, web mercatorunun bozulmasından dolayı, mesafe kireçlerimin gittikçe azalması, ekvatordan daha uzak hale getirilmesidir.

Katmanlarımı sql-uzamsal-coğrafya (geometri yerine) tipinde saklamayı düşündüm, ancak:

  • Mesafe sorgularımın daha uzun süreceğini tahmin ediyorum (küresel yüzeyde mesafe kireçlenmeleri)
  • çok fazla veriyi yeniden içe aktarmam gerekecek
  • arcgis hizmetleri anında projeksiyon yapmaları gerektiği kadar hızlı olmayacak

Google haritalarına gidersem ve bir mesafe hesaplaması yaparsam, geri gönderilen mesafe, Kuzey / güney bölgelerinde bile çok daha doğru olur, bu nedenle Google'ın web mercator projeksiyonunun neden olduğu bozulmayı düzeltmesi gerektiğini varsayıyorum.

O zaman sorum: "Doğru" mesafeyi elde etmek için web mercator projeksiyonunda yapılan mesafe hesaplarına uygulanabilecek basit bir faktör değeri var mı?

Yanıtlar:


12

Kısa mesafeler için, hesaplanan mesafeyi cos(lat)çarpan projeksiyonunun ölçeği enlemin sekantıyla orantılı olduğundan (sekant 1/cos) hesaplayabilirsiniz . Ayrıca bkz. Http://en.wikipedia.org/wiki/Mercator_projection#Mathematics_of_the_projection


@ Jeremiah-england sayesinde Zeyilname : yukarıdaki düzeltme gerçek Mercator projeksiyonları söz konusu olduğunda doğru olsa da, Web Mercator (EPSG: 3857) bir Mercator değildir. EPSG buna "Sözde Mercator" diyor. Sorun, eliptik bir model olan WGS84'ü kullanması ve küresel mercator hesaplamaları (Google'ın daha hızlı oldukları için kullandığı) kullanarak yansıtmasıdır. Mesafelerinizi 1/cos(phi)web Mercator ile ölçeklendirirseniz , ekvatorda yaklaşık% 0,6 indirim yapacaksınız. Daha fazla bilgi için Noel Zinn'in Web Mercator'daki sunumuna bakın.

Yukarıda belirtilen sunuma göre, web mercator koordinatlarından daha doğru mesafeleri hesaplamak için aşağıdaki yöntem kullanılabilir. Verilen dx- yatay koordinat farkı (WE yönü) ve dy- dikey koordinat farkı (SN yönü):

e = 0.081819191
adjustedX = dx * cos(lat) / sqrt(1 - e^2 * sin(lat)^2)
adjustedY = dy * cos(lat) * (1 - e^2) / pow(1 - e^2 * sin(lat)^2, 3/2)
adjustedDistance = hypot(adjustedX, adjustedY)

Bu ayar ile oran arasındaki oran ekvatordan kutuplara cos(lat)kadar SN yönünde daha büyüktür . WE yönü oranı ekvatorda başlar ve kutuplarda büyür .0.99331.003411.0034

Bu düzeltmenin hala sadece Dünya yüzeyinin düzlemsel geometrisinin kabul edilebildiği kısa mesafeler için oldukça iyi çalıştığını unutmayın.


1
Ve daha uzun mesafeler için, iki uç noktanın ortalama enlemini kullanabilirsiniz: cos((l1 + l2)/2)bu, size büyük daire mesafesi yerine düz çizgi / sabit rota mesafesi verecektir.
MerseyViking

sadece sferoidi değiştirir, ancak lokal bir projeksiyonla aynı hassasiyeti vermez.
falcacibar

1
@falcibar - Ortalama enlem seçiminin sferoidi nasıl değiştirdiğini
görmüyorum

@MerseyViking: teşekkürler, hesaplama için kullanılacak en iyi enlemin karşılaştırılan iki noktanın ortalaması olacağını belirtmeyi unuttum.
mkadunc

1
Cevap için +1. @Mersey: Ortalama enlem düzeltmesi neden işe yarıyor? Sonuçta, Mercator'daki çarpıklıklar keyfi olarak büyüyebilir ve loxodromların jeodeziklerden ayrılması da büyük olabilir. Basit bir düzeltmenin güvenilmez olacağı potansiyel olarak muazzam hatalar olduğu anlaşılıyor.
whuber

6

GEOGRAPHYKüresel veriler üzerinde doğru sonuçlar arıyorsanız , verilerinizi tekrar formatta saklama seçeneğinizi düşünürüm .

Bir tabloda iki uzamsal alana sahip olmanızı engelleyen hiçbir şey yoktur - biri Mercator'da bir GEOMETRYtür ve diğeri WGS84'te bir GEOGRAPHYtür olarak (en azından SQL Server'da, ArcSDE hakkında emin değilim).

Her iki alanı da orijinal verilerinizle dolduracak basit bir coğrafi işlem komut dosyası oluşturabilmeniz gerekir. Düzenleme ve sık güncellemeler varsa, bu bir seçenek olmayabilir.

İki alana sahip olduğunuzda, hızlı görüntüleme için Mercator'unuzu kullanmaya devam edebilir ve mesafeler için kullanıcı tarafından girilen noktaları Enlem / Boylam'a dönüştürebilirsiniz.

Bunun iki büyük avantajı vardır:

  • ayrıca kullanıcı sorgularına dayalı olarak daha doğru alanlar ve uzunluklar elde edebilirsiniz
  • ölçümlerle ilgilenen her sorgu için özel kod eklemeyi unutma konusunda endişelenmenize gerek yoktur

Sorgu hızları daha karmaşık olacaktır, ancak bir kullanıcı tarafından fark edilmeyebilir. Bir çözüme karar vermeden önce bir özellik sınıfıyla test etmek isteyebilirsiniz. Ayrıca kullanıcı tarafından girilen noktaları Mercator'dan dönüştürmeniz gerekir (bu önemsiz olmalı ve tarayıcıda yapılabilir).

Coğrafya türüyle bile, yine de bir hata payı var:

Coğrafya yöntemleri için hata toleransı 1.0e-7 * kapsamları kadar büyük olabilir

Gönderen MSDN


Ne yazık ki SDE yalnızca bir uzamsal sütuna izin verecek: help.arcgis.com/en/arcgisdesktop/10.0/help/index.html#//… - Bir görünüm oluşturmaya ve onu SDE'ye kaydetmeye çalışmadım , ancak bu olası bir yaklaşım olabilir.
Allan Adair

@Allan - bilmek güzel. SDE kullanmak için bir başka olumlu! Sadece 4326 geometrisine sahip bir tablo ve orijinal tabloya + uzamsal görünüme geri birleştirme aynı amaca ulaşmalıdır
geographika

3

ESRI'dan alternatif bir öneri, geometrileri bir ArcGIS Sunucusuna göndermeyi ve sonucun geri verilmesini içeren bir "Geometri servisi" kullanmaktır. Bir web hizmeti kullanarak herhangi bir darboğaz sorunu beklemiyorsanız, bu çok etkili bir yaklaşım olabilir. Aynı yaklaşımı bir Silverlight uygulamasında kullandım.

İşte ESRI'dan orijinal bir blog girişi: http://blogs.esri.com/Dev/blogs/arcgisserver/archive/2010/03/05/Measuring-distances-and-areas-when-your-map-uses-the -Mercator-projection.aspx

Blogda basitleştirilmiş bir JavaScript örneği var ve burada da tam bir örnek uygulama var: http://serverapps.esri.com/javascript_examples/compare_measurements.htm


0

Google Earth'ün yaptığı gibi, geometriyi yerel WGS84 bölge projeksiyonuna veya Güney Amerika'daki SIRGAS gibi gelişmiş bir WGS84 projeksiyonuna dönüştürebilirsiniz.

Hemen hemen tüm "bölgelendirilmiş" projeksiyonun koordinatları için http://www.spatialreference.org adresine bakabilir ve bunları dönüştürmek için bir tablo vb. Yapabilirsiniz.

Bir masa bölgeleri hayal ediyoruz

|   minx     |    miny    |    maxx    |   maxy     |  srid  |
+------------+------------+------------+------------+--------+
|234567.34314|234567.34334|234567.34334|234567.34334|  1234  |

Küresel Mercator'da (Web Mercator) saklanan tüm minx, miny, maxx, maxy değerleri. bu yüzden postgis'i örnek olarak kullanacağım.

SELECT ST_Distance(
         ST_Transform( -- transform/reproject
            ST_SetSRID(geom_line, 3857) -- geom_line with forced srid assignation to web mercator
            , ( -- here we get the first SRID from the spatial position of geom_line
                 SELECT  srid
                 FROM    zones
                 WHERE   ST_Contains(
                           ST_MakeBox2d(ST_Point(minx,miny),ST_Point(maxx,maxy))
                           , geom_line
                         )
                 LIMIT 1
            ))

Umarım bu faydalı olur, iyi günler.


Emin olamıyorum, ama Blomster'ın “STDistance” ı sorusuna dayanarak PostGIS kullanmadığı anlaşılıyor. Blomster SQL Server kullanıyorsa ST_Transform işlevselliği yoktur.
Allan Adair

Süreci ve çözebileceğim en iyi yolu veriyorum, geri kalanıyla başa çıkabilirdi, yine de bir yazılım yeniden projesini kullanabilirdi, ama gerçekten bir SQL Server'ın projeksiyonlarla uğraşmaması üzücü.
falcacibar

belki CLR etkin ve .net kütüphane nettopologysuite yardımcı olabilir?
falcacibar

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.