Saya memiliki tabel kode pos yang mencakup pusat lat, lng untuk setiap kode pos. Saya menggunakannya untuk mendapatkan daftar kode pos dalam radius mil tertentu dari titik arbitrer.
Baru terpikir oleh saya bahwa, hanya karena titik pusat zip tidak dalam radius yang diberikan, tidak berarti bahwa zip itu sendiri tidak berada dalam radius.
Saya menggunakan keterampilan seni super canggih saya untuk menggambarkan hal ini di sini:
Gumpalan garis-garis hijau mewakili kode pos A, B dan C.
Noda merah adalah pusat geografis untuk setiap kode pos
Titik fuchsia adalah lokasi target, dan ..
Lingkaran biru kental adalah radius 1 mil dari lokasi target
Jika saya menjalankan kueri untuk semua kode pos dalam radius 1 mil dari noda merah muda, hanya kode pos B dan C yang akan dikembalikan karena titik pusat untuk zip A tidak berada dalam radius satu mil, meskipun noda merah muda itu sendiri jelas dalam kode pos 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
Bagaimana cara saya menulis kueri yang akan memasukkan zip A dalam hasil?
Saya memiliki akses ke spasial / geometri untuk setiap kode pos yang dapat saya tambahkan ke tabel jika diperlukan, tetapi saya tidak tahu bagaimana saya akan menggunakannya untuk tujuan ini di MySQL.
Sunting : Saya menghabiskan satu hari membaca dokumen Oracle dan MySQL untuk data spasial dan berhasil mengubah data spasial saya menjadi MySQL . Bagaimana cara menulis kueri serupa yang menggunakan kolom geometri, bukan lat dan panjang? Saya menggunakan data 2D .. geometri adalah poligon dan multipoligon saja ..
Saya pikir saya semacam mengatasinya ..
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
Saya akan membiarkan karunia terbuka untuk saat ini jika seseorang memiliki solusi yang lebih baik, lebih efisien.