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.
Każda próba włączenia A będzie prawdopodobnie obejmować D, E, F, G. Problemu nie da się rozwiązać bez dokładnej ścieżki określającej każdy obszar kodu pocztowego.
Znajdź taką bazę danych, a następnie zbuduj
SPATIAL
indeks przy użyciu takich dowolnych wielokątów.źródło
Robisz to źle. Najpierw, jeśli to możliwe, użyj PostGIS - który jest wiodącym RDMBS z rozwiązaniem przestrzennym.
Następnie chcesz wykonać następujące kroki.
shp2pgsql
Indeksuj zaimportowaną geometrię.
Uruchom zapytanie o punkt zainteresowania (POI) przeciwko plikom kształtów. Punktem zainteresowania w twoim przypadku są przewody wejściowe, będzie to wyglądać tak,
ℹ 1609.344 Metry = 1 Mila
MySQL
Z MySQL będziesz mieć
Użyj,
MBRIntersects
aby wykorzystać indeks przestrzenny. Końcowe zapytanie powinno wyglądać mniej więcej takźródło
ST_DWithin
zMBRIntersects
Sprawdź ten zestaw danych z GreatData.com (pamiętaj, że nie jest to oprogramowanie typu open source, ale usługa płatna).
Używają gęstości zaludnienia zamiast środka zamka błyskawicznego.
I jak używać typu danych przestrzennych serwera SQL, aby uzyskać szybkie prawidłowe wyniki.
Mam nadzieję że to pomoże.
źródło