Determinare se un cerchio lat-long e un cerchio su una sfera si sovrappongono
-
03-07-2019 - |
Domanda
Sto creando un'applicazione con funzionalità di Geo Proximity Search utilizzando PHP come linguaggio di scripting del server e MySQL come Databse.
Prendi in considerazione una situazione:
Dove abbiamo un certo insieme di oggetti che hanno posizioni di latitudine e longitudine associate ai rispettivi oggetti. Nello specificare i dettagli della posizione come paese e / o città insieme a raggio / raggio in KM stiamo ottenendo oggetti che giacciono all'interno di quel raggio / raggio usando ad esempio la query MySQL:
SELECT [columns]
FROM [column]
WHERE 1=1
AND 3963.191 *
ACOS(
(SIN(PI() * [latitude] / 180) * SIN(PI() * [column].latitude / 180)) +
(COS(PI() * [latitude] /180) * cos(PI() * [column].latitude / 180) * COS(PI() * [column].longitude / 180 - PI() * [longitude] / 180)) )
<= 10
I calcoli sopra riportati forniranno gli oggetti che si trovano all'interno dell'area di 10 KM dal punto paese / centro città sulla terra.
Ora supponiamo che io abbia un oggetto (con latitudine e longitudine) che non si trova in questa area di 10 KM, ma ad esempio a 15 KM dal punto paese / centro città sulla terra. Questo oggetto ha un raggio di servizio di 10 KM (fornendo un servizio fino a 10 KM di area).
Ora la domanda è se sto cercando gli oggetti nel raggio di 10 KM dal punto di paese / centro città quindi l'oggetto (a 15 KM dal punto paese / centro città) con raggio di servizio di 10 KM dovrebbe essere incluso anche nella ricerca .
Come posso renderlo possibile? Ho lat paese / centro città, coordinate lunghe, intervallo / raggio (in cui dobbiamo trovare oggetti) e oggetti con raggio di consegna (ad esempio 10 KM) e le coordinate corrispondenti.
Puoi guidarmi su come farlo usando PHP, MySQL?
Soluzione
Usa le estensioni spaziali MySQL http://dev.mysql.com/doc/refman/ 5.1 / it / spazio-extensions.html
D'altra parte, se vuoi solo identificare altri cerchi che si intersecano con uno dato, sarebbero tutti questi, per i quali la distanza tra i centri del cerchio è inferiore alla somma del raggio. In altre parole, supponendo che il punto e l'intervallo originali siano indicati da triple ( x 0 , y 0 , r0 ), hai bisogno di tutto ( x n , y n , r n ) per cui
√((x0 - xn ) & # 178; + (< em> y 0 - yn ) & # 178;) & # 8804; r0 + rn