ฉันมีตารางรหัสไปรษณีย์ซึ่งมี lat lat ตรงกลาง lng สำหรับรหัสไปรษณีย์แต่ละอัน ฉันใช้มันเพื่อรับรายการรหัสไปรษณีย์ภายในรัศมีไมล์ที่กำหนดจากจุดใด ๆ
มันเกิดขึ้นกับฉันว่าเพียงเพราะจุดศูนย์กลางของซิปไม่ได้อยู่ในรัศมีที่กำหนดไม่ได้หมายความว่าซิปนั้นไม่ได้อยู่ในรัศมี
ฉันใช้ทักษะศิลปะขั้นสูงขั้นสูงของฉันเพื่อแสดงจุดที่นี่
Blobs Stripy สีเขียวแสดงรหัสไปรษณีย์ A, B และ C
รอยเปื้อนสีแดงเป็นศูนย์กลางทางภูมิศาสตร์สำหรับรหัสไปรษณีย์แต่ละอัน
จุดสีแดงม่วงคือตำแหน่งเป้าหมายและ ..
วงกลมสีน้ำเงินที่เป็นก้อนนั้นมีรัศมี 1 ไมล์จากตำแหน่งเป้าหมาย
หากฉันเรียกใช้แบบสอบถามสำหรับรหัสไปรษณีย์ทั้งหมดที่อยู่ในรัศมี 1 ไมล์จากรอยเปื้อนสีชมพูรหัสไปรษณีย์ B และ C เท่านั้นที่จะถูกส่งคืนเนื่องจากจุดศูนย์กลางสำหรับรหัสไปรษณีย์ A ไม่ได้อยู่ในรัศมีหนึ่งไมล์แม้ว่ารอยเปื้อนสีชมพูจะเกิดขึ้นเอง ชัดเจนในรหัสไปรษณีย์ 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
ฉันจะเขียนคำสืบค้นที่จะรวม zip A ในผลลัพธ์ได้อย่างไร
ฉันสามารถเข้าถึงเชิงพื้นที่ / รูปทรงเรขาคณิตสำหรับรหัสไปรษณีย์แต่ละรหัสที่ฉันสามารถเพิ่มลงในตารางได้หากจำเป็น แต่ฉันไม่รู้ว่าจะใช้เพื่อจุดประสงค์นี้ใน MySQL ได้อย่างไร
แก้ไข : ฉันใช้เวลาหนึ่งวันในการอ่านเอกสาร Oracle และ MySQL สำหรับข้อมูลเชิงพื้นที่และจัดการเพื่อแปลงข้อมูลเชิงพื้นที่ของฉันเป็น MySQLได้สำเร็จ ฉันจะเขียนเคียวรีที่คล้ายกันซึ่งใช้คอลัมน์รูปทรงเรขาคณิตแทนที่จะเป็นละติจูดและลองจิจูดได้อย่างไร ฉันใช้ข้อมูล 2 มิติ .. เรขาคณิตเป็นรูปหลายเหลี่ยมและมีหลายรูปแบบเท่านั้น ..
ฉันคิดว่าฉันคิดออก ..
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
ฉันจะปล่อยให้เงินรางวัลเปิดตอนนี้ในกรณีที่ใครบางคนมีทางออกที่ดีกว่าและมีประสิทธิภาพมากขึ้น