Tôi đang giải quyết vấn đề hộp giới hạn như một vấn đề phụ để tìm tất cả các điểm trong bán kính SrcRad của một điểm LAT, LONG tĩnh. Đã có khá nhiều phép tính sử dụng
maxLon = $lon + rad2deg($rad/$R/cos(deg2rad($lat)));
minLon = $lon - rad2deg($rad/$R/cos(deg2rad($lat)));
để tính toán giới hạn kinh độ, nhưng tôi thấy điều này không đưa ra tất cả các câu trả lời cần thiết. Bởi vì những gì bạn thực sự muốn làm là
(SrcRad/RadEarth)/cos(deg2rad(lat))
Tôi biết, tôi biết câu trả lời phải giống nhau, nhưng tôi thấy rằng không phải. Có vẻ như do không chắc chắn rằng tôi đang thực hiện (SRCrad / RadEarth) Đầu tiên và sau đó chia cho phần Cos, tôi đã bỏ qua một số điểm vị trí.
Sau khi bạn nhận được tất cả các điểm hộp giới hạn của mình, nếu bạn có một chức năng tính toán Khoảng cách từ điểm đến điểm đã cho, thì rất dễ dàng để chỉ lấy những điểm có bán kính khoảng cách nhất định từ điểm cố định. Đây là những gì tôi đã làm. Tôi biết phải mất thêm một vài bước nhưng nó đã giúp tôi
-- 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
;