Distanza di misurazione in Mercator sferico vs UTM suddiviso in zone


11

Ho punti in WGS84 lat / long e mi piacerebbe misurare distanze "piccole" (meno di 5 km) tra di loro.

Posso usare la formula haversine di http://www.movable-type.co.uk/scripts/latlong.html e funziona molto bene.

Mi piacerebbe usare le librerie di Python Shapely, così da poter fare più operazioni oltre alla semplice distanza, e poiché alla scala con cui sto lavorando, una terra piatta è un'approssimazione abbastanza buona. Per proiettare in modo affidabile i coordini geografici su un coord cartesiano, sto usando quelli di Python proj4, ma sembra che si verifichino errori maggiori di quelli che vorrei.

Se uso la zona UTM locale, ottengo differenze tra le curve di un paio di metri, il che va bene. Ma non voglio elaborare la zona UTM (i punti potrebbero essere in tutto il mondo), quindi ho provato con "Mercator sferico", ma ora le differenze tra le distanze haversine e quelle previste sono ben oltre il 100%. È davvero giusto per Mercator sferico? Tutto quello che voglio davvero è una proiezione cartesiana praticabile per due punti entro 5 km l'uno dall'altro in qualsiasi parte del mondo.

from shapely.geometry import Point
from pyproj import Proj

proj = Proj(proj='utm',zone=27,ellps='WGS84')
#proj = Proj(init="epsg:3785")  # spherical mercator, should work anywhere...

point1_geo = (-21.9309694, 64.1455718)
point2_geo = (-21.9372481, 64.1478206)
point1 = proj(point1_geo[0], point1_geo[1])
point2 = proj(point2_geo[0], point2_geo[1])

point1_cart = Point(point1)
point2_cart = Point(point2)

print "p1-p2 (haversine)", hdistance(point1_geo, point2_geo)
print "p1-p2 (cartesian)", point1_cart.distance(point2_cart)

A questo punto, la distanza haversine tra loro è 394m, e usando la zona utm 27, 395m. Ma se uso Mercator sferico, la distanza cartesiana è di 904 m, che è molto lontana.


La zona UTM è facile da "elaborare" in base alle longitudini. Scegli una tipica lambda di longitudine, -180 <= lambda <180, e usala per calcolare il numero di zona come Int ((180 + lambda) / 6) +1. Usa il segno della latitudine per decidere tra nord e sud. Non è necessario utilizzare le speciali zone polari ad alte latitudini; infatti, molto vicino a un palo puoi usare quasi tutte le zone UTM.
whuber

Risposte:


17

Sì, otterrai questo tipo di errori con una proiezione globale di Mercatore: è precisa all'equatore e la distorsione aumenta esponenzialmente con la latitudine lontano dall'equatore. La distorsione della distanza è esattamente 2 (100%) a 60 gradi di latitudine. Alle vostre latitudini di prova (64.14 gradi) computo una distorsione di 2.294, in accordo con il rapporto 904/394 = 2.294. (In precedenza ho calcolato 2.301 ma che era basato su una sfera, non sull'ellissoide WGS84. La differenza (dello 0,3%) ci dà un senso dell'accuratezza che potresti ottenere dall'uso di una proiezione basata su ellissoide rispetto alla formula Haversine basata su sfera. )

Non esiste una proiezione globale che produca distanze altamente accurate ovunque. Questo è uno dei motivi per cui viene utilizzato il sistema di zone UTM!

Una soluzione consiste nell'utilizzare la geometria sferica per tutti i tuoi calcoli, ma tu l'hai respinto (il che è ragionevole se eseguirai operazioni complesse, ma la decisione potrebbe valere la pena di essere rivisitata).

Un'altra soluzione è quella di adattare la proiezione ai punti confrontati . Ad esempio, potresti tranquillamente usare un Mercatore trasversale (come nel sistema UTM) con un meridiano che si trova vicino al centro della regione di interesse. Spostare il meridiano è una cosa semplice da fare: basta sottrarre la longitudine del meridiano da tutte le longitudini e utilizzare una singola proiezione TM centrata sul meridiano principale (con un fattore di scala di 1, anziché lo 0,9996 del sistema UTM). Per il tuo lavoro questo tenderà ad essere di piùpreciso rispetto all'utilizzo dell'UTM stesso. Fornirà gli angoli corretti (TM è conforme) e sarà straordinariamente preciso per i punti separati da poche decine di chilometri: aspettarsi una precisione superiore a sei cifre. In effetti, sarei propenso ad attribuire eventuali piccole differenze tra queste distanze TM adattate e le distanze Haversine alla differenza tra l'ellissoide (usato per la proiezione TM) e la sfera (usata da Haversine), piuttosto che alla distorsione nella proiezione.


Sembra abbastanza perfetto, suppongo che dovrei creare la mia stringa init per proj4 allora, piuttosto che essere in grado di usare una qualsiasi delle stringhe EPSG esistenti?
Karl P,

1
+1 adatta la proiezione ai punti. Preferisco carrée a piastra trasversale rispetto a Mercator trasversale, ma su aree sufficientemente piccole ("su larga scala"), quasi ogni proiezione "centrata" vicino alla regione di interesse darà una buona precisione.
David Cary,

@David Idea interessante. Sulla sfera il piatto trasversale Carree (Cassini) sarà vicino alla formula approssimativa che ho dato a gis.stackexchange.com/posts/2964/edit (che potrebbe essere una soluzione accettabile qui). Le formule per TM e TPC sono simili sulla sfera; su un ellissoide, TPC è leggermente più semplice. TM è probabilmente supportato da più software.
whuber

@Karl Se lo desideri, puoi utilizzare una qualsiasi delle zone TM. Basta spostare tutte le longitudini in modo che un punto centrale nella propria regione di interesse coincida con il meridiano centrale della zona scelta. Moltiplica tutte le distanze per 1 / 0.9996 (e moltiplica tutte le aree per il quadrato di questo fattore), non cambiare angoli o cuscinetti e, se i tuoi calcoli producono nuovi punti, sposta le loro longitudini indietro al sistema di coordinate originale .
whuber

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.