Saya mencoba menerapkan pemeriksaan yang sangat efisien untuk melihat apakah dua poin berada dalam jarak satu sama lain, atau tidak.
Pendekatan saya saat ini adalah menghitung jarak Haversine , dan kemudian memeriksa untuk melihat apakah jaraknya kurang dari satu mil.
Efisiensi penting dalam kasus ini karena saya harus menghitung tanda ya / tidak untuk set rekaman besar.
Saya hanya peduli apakah jaraknya satu mil - tidak ada yang lain tentang jarak yang penting bagi saya.
Jadi, apa cara paling efisien untuk mengetahui apakah dua titik lat / panjang berada dalam jarak satu mil dari satu sama lain?
Menanggapi komentar, saya melakukan ini di SQL Server. Kode saya di bawah.
CREATE FUNCTION dbo.USR_UFN_HAVERSINE_DISTANCE
(
@LAT1 FLOAT(18)
,@LONG1 FLOAT(18)
,@LAT2 FLOAT(18)
,@LONG2 FLOAT(18)
,@UnitOfMeasure NVARCHAR(10) = 'KILOMETERS'
)
RETURNS FLOAT(18)
AS
BEGIN
DECLARE
@R FLOAT(8)
,@DLAT FLOAT(18)
,@DLON FLOAT(18)
,@A FLOAT(18)
,@C FLOAT(18)
,@D FLOAT(18)
;
SET @R =
CASE @UnitOfMeasure
WHEN 'MILES' THEN 3956.55
WHEN 'KILOMETERS' THEN 6367.45
WHEN 'FEET' THEN 20890584
WHEN 'METERS' THEN 6367450
ELSE 6367.45 --km
END
SET @DLAT = RADIANS(@LAT2 - @LAT1);
SET @DLON = RADIANS(@LONG2 - @LONG1);
SET @A = SIN(@DLAT / 2)
* SIN(@DLAT / 2)
+ COS(RADIANS(@LAT1))
* COS(RADIANS(@LAT2))
* SIN(@DLON / 2)
* SIN(@DLON / 2);
SET @C = 2 * ASIN(MIN(SQRT(@A)));
SET @D = @R * @C;
RETURN @D;
END;
distance
sql-server
algorithm
software-recommendations
JosephStyons
sumber
sumber
Jawaban:
Coba metode ini-mungkin bukan yang terbaik tetapi bisa membatasi ruang pencarian Anda untuk beberapa dan dengan demikian membantu Anda mempercepat proses.
Pastikan Anda telah membangun indeks spasial dan memverifikasi apakah prosedur ini telah meningkatkan waktu respons kueri Anda. Anda juga bisa memperbaiki pendekatan dengan membangun tabel dekat (ESRI ArcGIS memiliki alat) dengan kriteria 1 mil sebagai kriteria.
sumber
Jika Anda bekerja pada tingkat global, Anda dapat menghindari penghitungan banyak dosa dan cos dengan pengujian langsung sederhana:
Tes pertama untuk menyaring poin sebelum menghitung haversine adalah dengan mengecualikan titik di mana @DLAT> 0,015 derajat (bisa lebih tepat, tapi saya lebih suka keamanan).
Pada langkah kedua, Anda juga dapat melakukan ini dengan @DLON dalam rentang garis lintang tertentu dengan nilai konservatif (misalnya antara -60 dan 60 derajat, tidak termasuk @DLON> 0,03 (= 0,015 / cos (60)).
Karena 1 mil cukup kecil, Anda hanya perlu jarang menghitung Haversine dengan dua aturan ini (kecuali jika Anda bekerja di daerah kutub), dan Anda dapat mengganti Haversine dengan Pythagoras (2 cosinus vs 2 sinus dan 2 cosinus dengan Haversine) sebagaimana disebutkan oleh @whuber.
sumber