Usando le misure geodetiche per i raggi del cerchio?


15

Attualmente sto sviluppando un sito di mappatura OpenLayers. Le misurazioni possono essere effettuate utilizzando uno strumento linea e uno strumento area. Entrambi sono attualmente impostati per calcolare le misurazioni geodetiche come indicato nell'API OpenLayers .

Uso misurazioni geodetiche piuttosto che misurazioni planari poiché durante i test degli utenti le persone hanno messo in dubbio le misurazioni dello strumento per le distanze che già conoscevano (come guidare tra le città).

Una nuova funzionalità del sito è che un utente sia in grado di disegnare un cerchio sulla mappa di un raggio impostato. OpenLayers consente solo di disegnare cerchi usando distanze planari, quindi quando un utente misura il cerchio con lo strumento di misurazione geodetica i valori non corrispondono. Nell'immagine sotto il raggio planare del cerchio è di 10 km, ma la misura della linea geodetica per il diametro è di 12 km.

Chiaramente questo lascerà un utente (e me stesso) a chiedersi quale sia corretto.

testo alternativo

Guardando questa risposta sembra che la maggior parte dei sistemi GIS desktop "ignori" questo problema e restituisca misurazioni e distanze planari. Quindi qual è la migliore pratica in termini di interfaccia utente e accuratezza per gestire misurazioni planari e geodetiche?

Aggiornare

Ho trovato questo esempio di Google che illustra il problema dei raggi e la proiezione di Mercatore:

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

Il codice JavaScript per disegnare il cerchio è il seguente:

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

Questo cerchio tiene conto della curvatura della terra?

Aggiornamento finale

Codice di lavoro pubblicato su http://geographika.co.uk/creating-a-geodesic-circle-in-openlayers


1
qualcosa deve essere sbagliato qui. la differenza non può essere del 20% su una distanza così breve tra la linea retta e la linea che segue lo sferoide. qualcos'altro deve essere coinvolto.
Nicklas Avén,

4
È molto probabile che la proiezione di Mercatore, che abbia una scala reale all'equatore (generalmente, in realtà è possibile avere proiezioni di Mercatore con scala reale altrove (a una singola latitudine), ma la maggior parte delle parametrizzazioni globali usano l'equatore). E gli errori di scala per Mercator sono davvero molto alti (infiniti, in effetti, ai poli) che aumentano man mano che ci si sposta a nord / sud dalla latitudine della scala reale.
Paul Ramsey,

Le misure sono state prese a 52 gradi a nord e sono effettivamente nella proiezione di Mercatore. Quindi questo significa che qualsiasi caratteristica lato client disegnata in Mercator restituirà aree e lunghezze molto imprecise se non vicino all'equatore?
geographika,

1
Sì, è praticamente il caso, proiettare i dati su una griglia locale in metri o piedi e tutto andrà bene.
Ian Turton

2
@Paul Buona chiamata. Ma questi dati indicano solo che la proiezione è cilindrica, di cui il Mercatore è uno. Nelle vere sporgenze cilindriche la distorsione orizzontale equivale a sec (latitudine). Con questa formula la distorsione di 20 / 12.13 si risolve a una latitudine di 52,66 gradi; questa è esattamente la latitudine di Limerick.
whuber

Risposte:


8

Se stai preparando una birra nel tuo browser, puoi ottenere un "cerchio" (non sarà rotondo sullo schermo a causa della tua proiezione; piuttosto approssimato da un poligono con quanti punti vuoi disegnare), usa una forma diretta di calcoli geodetici: dato un punto, una direzione (azimut) e una distanza che ti dà il punto risultante. Dettagli gory: http://en.wikipedia.org/wiki/Vincenty%27s_formulae#Direct_Method

Sembra che qualcuno abbia già fatto una traduzione in javascript: http://www.movable-type.co.uk/scripts/latlong-vincenty-direct.html . Sei fortunato!

Per finire le cose:

  • Decidi quanto grosso (# di vertici, chiamalo n) sei disposto ad avere il risultato finale.
  • Dividi 360 gradi in n pezzi.
  • Costruisci un poligono di (per i nell'intervallo (n): polygon.add (vincenty_direct (punto_inizio, i * 360 / n, distanza)))
  • Dopo tutto, forse aggiustare alcune irritazioni di proiezione e planarizzazione:
    • Se stai usando la tipica proiezione della mappa web, che quasi sicuramente sei, il poligono risultante verrà enormemente allungato verticalmente se si avvicina a un palo.
    • Allo stesso modo, se il poligono del risultato attraversa la linea della data internazionale, sarà davvero ottimizzato.

Saluti!


1
Il metodo Vincenty è già stato aggiunto a OpenLayers nello spazio dei nomi utils - dev.openlayers.org/apidocs/files/OpenLayers/… con questo e la tua spiegazione, in particolare il parametro cuscinetto, chiariscilo. Grazie!
geographika,

:) Fammi sapere quanto sono irritanti le "irritazioni". Idealmente, il fissaggio sarebbe già parte di OpenLayers e avrebbe funzionato, ma non ne sono sicuro.
Dan S.

3

OpenLayers consente solo di disegnare cerchi usando distanze piane

Per ottenere un cerchio geodetico, è possibile utilizzare l' operazione buffer nel servizio geometria ESRI.

... se l'unità è lineare come piedi o metri, viene eseguito il buffering geodetico

Uno liberamente accessibile è disponibile qui .


Grazie per l'utile link: vedrò se posso chiamare il servizio e aggiornare la funzione in JavaScript. La mia unica preoccupazione sarebbe affidarmi a un servizio web che potesse essere disattivato in qualsiasi momento. Presumo che il punto bufferizzato geodetico sarebbe il cerchio preciso / reale di 10 km?
geographika,

Il cerchio dovrebbe essere preciso, tuttavia, lo verificherei usando il tuo strumento di misura. Penso che il servizio di geometria sia parte di un'installazione standard del server arcgis, quindi se uno si ritira dovrebbe essercene molti altri sul web tra cui scegliere. google.com/…
Kirk Kuykendall il
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.