Mam tabelę kodów pocztowych, która zawiera środkową długość, długość każdego kodu pocztowego. Używam go, aby uzyskać listę kodów pocztowych w promieniu mili z dowolnego dowolnego punktu.
Właśnie przyszło mi do głowy, że to, że punkt środkowy zamka nie znajduje się w danym promieniu, nie oznacza, że sam zamek nie mieści się w promieniu.
Użyłem moich super zaawansowanych umiejętności plastycznych, aby zilustrować tę kwestię:
Zielone paski BLOB reprezentują kody pocztowe A, B i C.
Czerwone smugi są geograficznymi centrami każdego kodu pocztowego
Kropka fuksji to miejsce docelowe i ..
Nierówny niebieski okrąg znajduje się w promieniu 1 mili od miejsca docelowego
Jeśli uruchomię zapytanie dla wszystkich kodów pocztowych w promieniu 1 mili od różowej plamy, tylko kody pocztowe B i C zostaną zwrócone, ponieważ punkt środkowy dla suwaka A nie znajduje się w promieniu jednej mili, mimo że różowa plama sama jest wyraźnie w kodzie pocztowym 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
Jak do cholery mam napisać zapytanie, które będzie zawierać zip A w wynikach?
Mam dostęp do danych przestrzennych / geometrycznych dla każdego kodu pocztowego, który mogę dodać do tabeli, jeśli zajdzie taka potrzeba, ale nie mam pojęcia, jak mógłbym go użyć w tym celu w MySQL.
Edycja : spędziłem dzień czytając dokumenty Oracle i MySQL dla danych przestrzennych i udało mi się pomyślnie przekonwertować moje dane przestrzenne na MySQL . Jak przejść do pisania podobnego zapytania, które używa kolumny geometrii zamiast szerokości i długości? Używam danych 2D .. geometria to tylko wielokąty i multipoligony ..
Myślę, że to wymyśliłem ...
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
Zostawię nagrodę na razie otwartą na wypadek, gdyby ktoś miał lepsze, bardziej wydajne rozwiązanie.