ฉันกำลังแก้ไขปัญหากล่องขอบเขตเป็นปัญหาด้านข้างเพื่อค้นหาจุดทั้งหมดภายในรัศมี SrcRad ของ LAT คงที่จุดยาว มีการคำนวณค่อนข้างน้อยที่ใช้
maxLon = $lon + rad2deg($rad/$R/cos(deg2rad($lat)));
minLon = $lon - rad2deg($rad/$R/cos(deg2rad($lat)));
เพื่อคำนวณขอบเขตลองจิจูด แต่ฉันพบว่าสิ่งนี้ไม่ได้ให้คำตอบทั้งหมดที่ต้องการ เพราะสิ่งที่คุณอยากทำจริงๆคือ
(SrcRad/RadEarth)/cos(deg2rad(lat))
ฉันรู้ฉันรู้ว่าคำตอบควรจะเหมือนกัน แต่ฉันพบว่ามันไม่ใช่ ดูเหมือนว่าโดยไม่แน่ใจว่าฉันกำลังทำ (SRCrad / RadEarth) ก่อนแล้วจึงหารด้วยส่วน Cos ฉันจึงทิ้งตำแหน่งบางจุดไว้
หลังจากที่คุณได้รับจุดขอบเขตของกรอบทั้งหมดแล้วหากคุณมีฟังก์ชันที่คำนวณระยะทางของจุดต่อจุดที่กำหนดให้ lat long มันเป็นเรื่องง่ายที่จะได้รับเฉพาะจุดที่เป็นรัศมีระยะทางหนึ่งจากจุดคงที่ นี่คือสิ่งที่ฉันทำ ฉันรู้ว่าต้องใช้ขั้นตอนเพิ่มเติมเล็กน้อย แต่ก็ช่วยฉันได้
-- GLOBAL Constants
gc_pi CONSTANT REAL := 3.14159265359; -- Pi
-- Conversion Factor Constants
gc_rad_to_degs CONSTANT NUMBER := 180/gc_pi; -- Conversion for Radians to Degrees 180/pi
gc_deg_to_rads CONSTANT NUMBER := gc_pi/180; --Conversion of Degrees to Radians
lv_stat_lat -- The static latitude point that I am searching from
lv_stat_long -- The static longitude point that I am searching from
-- Angular radius ratio in radians
lv_ang_radius := lv_search_radius / lv_earth_radius;
lv_bb_maxlat := lv_stat_lat + (gc_rad_to_deg * lv_ang_radius);
lv_bb_minlat := lv_stat_lat - (gc_rad_to_deg * lv_ang_radius);
--Here's the tricky part, accounting for the Longitude getting smaller as we move up the latitiude scale
-- I seperated the parts of the equation to make it easier to debug and understand
-- I may not be a smart man but I know what the right answer is... :-)
lv_int_calc := gc_deg_to_rads * lv_stat_lat;
lv_int_calc := COS(lv_int_calc);
lv_int_calc := lv_ang_radius/lv_int_calc;
lv_int_calc := gc_rad_to_degs*lv_int_calc;
lv_bb_maxlong := lv_stat_long + lv_int_calc;
lv_bb_minlong := lv_stat_long - lv_int_calc;
-- Now select the values from your location datatable
SELECT * FROM (
SELECT cityaliasname, city, state, zipcode, latitude, longitude,
-- The actual distance in miles
spherecos_pnttopntdist(lv_stat_lat, lv_stat_long, latitude, longitude, 'M') as miles_dist
FROM Location_Table
WHERE latitude between lv_bb_minlat AND lv_bb_maxlat
AND longitude between lv_bb_minlong and lv_bb_maxlong)
WHERE miles_dist <= lv_limit_distance_miles
order by miles_dist
;