Calcolo delle coordinate di quadrati x miglia dal punto centrale?


11

Sto cercando di creare un quadrato (o un cerchio) di miglio attorno ad un punto centrale, dove tutti i lati del quadrato sarebbero x miglia dal centro. Ho bisogno delle 4 coordinate d'angolo.

Mi sta confondendo il cervello cercando di farmi girare la testa? Posso calcolare la distanza tra due punti usando la formula haversine ma la matematica non è seriamente il mio punto di forza e non capisco peccato, cos ecc. E provare a risolverlo mi ha perso!

Mi sono imbattuto nel calcolo di latitudine / longitudine X miglia dal punto? ma non capisco!

Qualcuno sarebbe abbastanza gentile da spiegare come faccio in termini di mele e pere?

Per spiegare esattamente cosa sto cercando di fare;

Ho un sito Web, in cui gli utenti possono cercare edifici in un'area specifica. Entreranno in una città o in un luogo (di cui conoscerò il lat long) e cercheranno entro un raggio specifico di dire 10 miglia dal luogo.

Devo trovare il lat / long min / max del raggio di 10 miglia in modo da poter interrogare il mio database usando una clausola where simile a:

Where buildingLat <= maxLat 
  and buildingLat <= minLat 
  and buildingLong >= minLong 
   or buildingLong >= maxLong

Ho bisogno di una specie di formula!

Le mie coordinate sono in gradi decimali

Risposte:


10

A tale scopo le approssimazioni semplici sono più che sufficienti. Nord o sud, un grado è di circa 69 miglia ma est o ovest, è solo 69 * cos (latitudine) miglia. Poiché le latitudini non cambiano molto nell'arco di dieci miglia, puoi tranquillamente usare il coseno della latitudine centrale del "quadrato". Pertanto le coordinate desiderate per i vertici quadrati a distanza r miglia da una posizione centrale (f, l), dati quale lat-lon, sono calcolati come

df = r/69        // North-south distance in degrees
dl = df / cos(f) // East-west distance in degrees
{(f-df,l-dl), (f+df,l-dl), (f+df,l+dl), (f-df,l+dl)} // List of vertices

Ad esempio, supponiamo che r = 10 miglia e la posizione centrale sia a latitudine 50 gradi nord, longitudine 1 grado ovest, in modo che (f, l) = (50, -1) gradi. Poi

df = 10/69 = 0.145
dl = 0.145 / cos(50 degrees) = 0.145 / 0.6428 = 0.225
f - df = 50 - 0.145 = 49.855 (southernmost latitude)
f + df = 50 + 0.145 = 50.145 (northernmost latitude)
l - dl = -1 - 0.225 = -1.225 (western longitude)
l + dl = -1 + 0.225 = -0.775 (eastern longitude)

e le coordinate sono (49.855, -1.225), (50.145, -1.225), (50.145, -0.775) e (49.855, -0.775) mentre marcia in senso orario attorno alla piazza a partire dal suo angolo sud-occidentale.

Non usare questa approssimazione vicino ai poli o per quadrati più grandi di qualche grado su un lato. Inoltre, a seconda delle limitazioni del GIS, potrebbe essere necessaria una certa cura in tutto il taglio globale in longitudine, generalmente a + -180 gradi.


4

Prendi la coordinata X del centro e sottrai x miglia da essa, questo è il lato sinistro del tuo quadrato. Quindi prendi la coordinata Y del centro e sottrai X miglia da essa, questa è la parte inferiore del tuo quadrato. Ripetere questi passaggi ma aggiungendo invece di sottrarre per ottenere la mano destra e i bordi superiori. Ora puoi costruire i quattro angoli del tuo quadrato.

Nota quanto sopra presuppone che il punto centrale sia in miglia. Se non è prima riproiettarlo. In ogni caso, tutte le scommesse sono disattivate e il tuo quadrato non sarà quadrato.


Ti riferisci alla pagina di esempio? Come posso sottrarre miglia da una coordinata e non ho bisogno di prendere in considerazione la curvatura della terra?
Bex,

No, è così semplice che non è necessario avere un esempio funzionante. Forse devi specificare quale software stai usando? Come ho detto, la mia soluzione presuppone che tu abbia proiettato le tue coordinate su un SRS locale (se non lo hai fatto, quella dovrebbe essere la tua prima domanda)
Ian Turton

Sono davvero confuso ora! Ho aggiornato la mia domanda per dire esattamente cosa sto cercando di fare. Ho bisogno di creare un rettangolo di selezione in modo da poter trovare il lat min e max e il long.
Bex,

3
proj4js ( proj4js.org ) dovrebbe aiutare allora
Ian Turton

1
Le mie coordinate si presentano così: 51.498485, -0.129089 cioè gradi non è vero?
Bex,

4

Finalmente la mia risposta è: (in c #)

Probabilmente non ho bisogno delle 4 coordinate ma penso che siano abbastanza precise.

 public static void GetBoundingCoords(double centerLat, double centerLong,  double distance)
    {
     Coordinate top=   MaxLatLongOnBearing(centerLat, centerLong,45,10);
     Coordinate right = MaxLatLongOnBearing(centerLat, centerLong, 135, 10);
     Coordinate bottom = MaxLatLongOnBearing(centerLat, centerLong, 225, 10);
     Coordinate left = MaxLatLongOnBearing(centerLat, centerLong, 315, 10);
    }

    public static Coordinate MaxLatLongOnBearing(double centerLat, double centerLong, double bearing, double distance)
    {

        var lonRads = ToRadian(centerLong);
        var latRads = ToRadian(centerLat);
        var bearingRads = ToRadian(bearing);
        var maxLatRads = Math.Asin(Math.Sin(latRads) * Math.Cos(distance / 6371) + Math.Cos(latRads) * Math.Sin(distance / 6371) * Math.Cos(bearingRads));
        var maxLonRads = lonRads + Math.Atan2((Math.Sin(bearingRads) * Math.Sin(distance / 6371) * Math.Cos(latRads)), (Math.Cos(distance / 6371) - Math.Sin(latRads) * Math.Sin(maxLatRads)));

        var maxLat = RadiansToDegrees(maxLatRads);
        var maxLong = RadiansToDegrees(maxLonRads);

        return new Coordinate(){Latitude=maxLat, Longitude=maxLong};
    }

MODIFICARE

Avendo appena realizzato se ho impostato gli angoli del mio quadrato x miglia dal punto centrale, i bordi del mio quadrato non saranno gli stessi x miglia. (detto che la matematica non era il mio punto di forza) Quindi per ottenere la distanza dei punti d'angolo dal punto centrale se voglio che i bordi dei miei quadrati siano x miglia ho usato il Teorema di Pitagora per calcolare la distanza della diagonale. (su un triangolo ad angolo retto, il quadrato sull'ipotenusa (la diagonale) è uguale al quadrato degli altri due lati)


quello non sarà un quadrato.
Ian Turton

Ho modificato i miei cuscinetti, era un diamante .. ora è quadrato
Bex,

Per quanto riguarda la modifica, il Teorema di Pitagora va bene per i piccoli quadrati, ma in generale non vale per i triangoli sferici di destra. È strano, quindi, che il tuo codice usi la trigonometria sferica insieme a questa approssimazione basata sulla geometria del piano.
whuber

La mia distanza non sarà mai più di 100 miglia, quindi non penso che sia importante. Poiché le imprecisioni saranno piccole con quella distanza minore.
Bex,

1
Penso che il punto che @whuber sta facendo sia che non vi è alcun vantaggio nell'usare un calcolo complesso della distanza lungo Lat e Long, dato che poi si combinano quelli con il teorema di Pitagora. Potresti invece utilizzare un calcolo molto più semplice, come ha fatto whuber o come fa Ewan Todd . Usa semplici formule lineari per convertire la longitudine in miglia e la latitudine in miglia o viceversa. L'unica parte "difficile" è sapere che la formula della longitudine ha bisogno di essere modificata * cos(lat)quando si convertono i gradi in miglia e / cos(lat)quando si convertono miglia in gradi.
ToolmakerSteve

0

Se si utilizza un database spazialmente consapevole, è possibile convertire l'area di interesse nello stesso sistema di coordinate in cui sono archiviati i dati e quindi eseguire un confronto da mele a mele.

Per esempio:

  1. L'utente sceglie una posizione, risultando in lat / lon.
  2. Chiedere al database spaziale di convertire questo punto in un sistema di coordinate proiettato appropriato all'area (unità di piedi o metri, ecc.).
  3. Costruisci la tua area di interesse attorno al punto previsto.
  4. Chiedere al database spaziale di convertire questa area di interesse in lat / lon.
  5. Fai qualunque confronto tu debba fare.

0

Ho usato cosa c'è in questa pagina

Distanza del punto di destinazione data e direzione dal punto iniziale

Formula:
lat2 = asin (sin (lat1) * cos (d / R) + cos (lat1) * sin (d / R) * cos (θ))
lon2 = lon1 + atan2 (sin (θ) * sin (d / R) * cos (lat1), cos (d / R) −sin (lat1) * sin (lat2))

θ è il rilevamento (in radianti, in senso orario da nord); d / R è la distanza angolare (in radianti), dove d è la distanza percorsa e R è il raggio terrestre

Per θ ho usato -45 gradi (in radianti) per il "punto in alto a sinistra" e 135 gradi per quello "in basso a destra"

(Di recente ho posto la stessa domanda nel sito di matematica )


Il problema con questa soluzione è che devi prima capire la distanza per le diagonali del quadrato. È più facile invece spostarsi lungo la geodetica dal centro verso i punti medi dei lati e quindi, ruotando di 90 gradi, spostarsi lungo i lati del quadrato.
whuber

@whuber, Se la distanza è abbastanza piccola, non puoi usare la semplice trigonometria? (d = lato opposto / sin (lato adiacente). Lo faccio perché non ho bisogno che quella distanza sia esatta. Altrimenti, potresti applicare questa formula due volte per fare esattamente quello che dici (prima con θ = 0 poi con θ = -90 per esempio in alto a sinistra)
juan

È corretto, Juan. Ma resta da chiedersi perché usi le formule più complicate della geometria sferica quando inizi con un'approssimazione che suppone che le formule euclidee funzionino in primo luogo. Non c'è niente di sbagliato nell'usare le formule sferiche, ma è inutile e computazionalmente inefficiente.
whuber

@whuber, per il secondo caso non è approssimativo (applicando la formula due volte per ogni lato). Hai ragione, però, non avrebbe senso mescolarli. In realtà l'ho implementato, ma lo cambierò (oh, e il motivo è perché non sono così bravo in matematica :))
juan
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.