Her posta kodu için orta lat, lng içeren posta kodları bir tablo var. Herhangi bir keyfi noktadan belirli bir mil yarıçapı içinde posta kodları listesi almak için kullanın.
Sadece bir fermuarın merkez noktasının belirli bir yarıçap içinde olmaması nedeniyle fermuarın yarıçap içinde olmadığı anlamına gelmedi.
Süper gelişmiş sanat becerilerimi buradaki konuyu göstermek için kullandım:
Yeşil çizgili lekeler A, B ve C posta kodlarını temsil eder.
Kırmızı lekeler, her posta kodu için coğrafi merkezlerdir
Fuşya noktası hedef konumdur ve ..
Topaklı mavi daire, hedef konumdan 1 mil yarıçaptır
Pembe lekeden 1 mil yarıçap içindeki tüm posta kodları için bir sorgu çalıştırırsam, pembe lekenin kendisi olsa bile, A zipinin merkez noktası bir mil yarıçapı içinde olmadığından, yalnızca B ve C posta kodları döndürülür. açıkça A kodunda.
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
Sonuçlarda zip A'yı içeren bir sorguyu nasıl yazarım?
Gerekirse tabloya ekleyebileceğiniz her posta kodu için uzamsal / geometriye erişimim var, ancak MySQL'de bu amaç için nasıl kullanacağım hakkında hiçbir fikrim yok.
Düzenleme : Mekansal veriler için Oracle ve MySQL belgelerini okumak için bir gün geçirdim ve uzamsal verilerimi MySQL'e başarıyla dönüştürmeyi başardım . Lat ve long yerine geometri sütununu kullanan benzer bir sorguyu yazmaya nasıl devam edebilirim? 2D veri kullanıyorum .. geometri sadece çokgenler ve çokgenler ..
Sanırım bir türlü çözdüm ..
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
Birisinin daha iyi, daha verimli bir çözümü olması durumunda şimdilik ödülü açık bırakacağım.