Ho una tabella di codici postali che include il centro lat, lng per ogni codice postale. Lo uso per ottenere un elenco di codici postali entro un determinato raggio di miglio da qualsiasi punto arbitrario.
Mi è appena venuto in mente che, solo perché il punto centrale di una zip non si trova all'interno di un determinato raggio, non significa che la zip stessa non sia all'interno del raggio.
Ho usato le mie abilità artistiche super avanzate per illustrare il punto qui:
Le chiazze a strisce verdi rappresentano i codici postali A, B e C.
Le macchie rosse sono i centri geografici di ciascun codice postale
Il punto fucsia è la posizione target e ..
Il cerchio blu grumoso è un raggio di 1 miglio dalla posizione target
Se eseguo una query per tutti i codici postali entro un raggio di 1 miglio dalla sfumatura rosa, verranno restituiti solo i codici postali B e C poiché il punto centrale per la zip A non è compreso nel raggio di un miglio, anche se la macchia rosa stessa è chiaramente nel codice postale A.
SELECT *,
p.distance_unit
* DEGREES(ACOS(COS(RADIANS(p.latpoint))
* COS(RADIANS(z.y))
* COS(RADIANS(p.longpoint) - RADIANS(z.x))
+ SIN(RADIANS(p.latpoint))
* SIN(RADIANS(z.y)))) AS dist
FROM standard_zip AS z
JOIN ( /* these are the query parameters */
SELECT $lat AS latpoint, $lng AS longpoint,
$miles AS radius, 69 AS distance_unit
) AS p ON 1=1
WHERE z.y
BETWEEN p.latpoint - (p.radius / p.distance_unit)
AND p.latpoint + (p.radius / p.distance_unit)
AND z.x
BETWEEN p.longpoint - (p.radius / (p.distance_unit * COS(RADIANS(p.latpoint))))
AND p.longpoint + (p.radius / (p.distance_unit * COS(RADIANS(p.latpoint))))
ORDER BY dist
Come diamine posso scrivere una query che includerà zip A nei risultati?
Ho accesso a spazio / geometria per ogni codice postale che posso aggiungere alla tabella se necessario, ma non ho idea di come lo userei per questo scopo in MySQL.
Modifica : ho trascorso una giornata a leggere i documenti Oracle e MySQL per i dati spaziali e sono riuscito a convertire con successo i miei dati spaziali in MySQL . Come posso scrivere una query simile che utilizza la colonna geometria anziché lat e long? Sto usando i dati 2D .. la geometria è solo poligoni e multipoligoni ..
Penso di averlo capito.
select
*
from
(
select
MIN(st_distance(geom, POINT(-82.765136, 28.0914015))) * 69 as miles,
zip
from
zip_spatial
group by
zip
order by
miles asc
) d
where
d.miles < 5
Lascerò la taglia aperta per ora nel caso qualcuno abbia una soluzione migliore, più efficiente.