Diberi dua lat / lama, bagaimana saya bisa tahu jika mereka berada dalam jarak 1 mil satu sama lain?


8

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;

Sejauh ini apa penelitian Anda yang muncul sebagai kandidat?
PolyGeo

1
Apakah Anda mencari solusi perangkat lunak atau membuat kode Anda sendiri? Apa yang sudah Anda coba sejauh ini?
MaryBeth

2
Apa yang salah dengan hanya memeriksa jarak haversine? Anda bisa menghemat sedikit waktu pemrosesan dengan hanya memeriksa jarak planar - pada satu mil, haversine tidak akan membuat banyak perbedaan.
Tom

4
bisakah Anda menggunakan geomA.STDistance (geomB) <d?
Ian Turton

2
Pemeriksaan "jarak planar" yang disarankan oleh @Tom dapat dengan mudah disalahartikan: untuk bekerja dengan benar, perlu penafsiran yang cermat. Salah satunya adalah sebagai berikut. Dengan anggapan Anda tidak perlu membandingkan titik di garis 180 derajat atau kutub, Anda bisa menerapkan rumus Pythagoras pada koordinat (lat1, cos (lat1) * lon1), (lat2, cos (lat2) * lon2). Dengan kata lain, membandingkan (lat1-lat2) ^ 2 + (cos (lat1) * lon1-cos (lat2) * lon2) ^ 2 hingga 1/69 ^ 2 (semua dalam derajat) memberi tahu Anda apakah kedua titik dipisahkan oleh satu mil (hingga akurasi sepersekian persen). Apakah ini lebih cepat dari Haversine tidak jelas.
whuber

Jawaban:


2

Coba metode ini-mungkin bukan yang terbaik tetapi bisa membatasi ruang pencarian Anda untuk beberapa dan dengan demikian membantu Anda mempercepat proses.

  1. Buat setengah mil buffer di setiap titik
  2. Larutkan buffer yang dihasilkan - pastikan tidak ada multipoligon
  3. Setiap titik yang terletak di luar poligon ini sekarang dikecualikan dari ruang pencarian

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.


buffer perlu memiliki radius satu mil, bukan?
radouxju

@radouxju, dua 1/2 mil dari setiap titik adalah jarak 1 mil.
addcolor

1
Saya tidak mengerti. Entah Anda ingin membuat lapisan poligon berdasarkan set poin yang telah ditentukan, kemudian gunakan poligon ini dengan algoritma "titik dalam poligon" untuk mengetahui apakah titik-titik baru berada dalam jarak satu mil (maka Anda perlu menghitung buffer radius satu mil) ... Atau langsung bekerja dengan semua titik, dengan buffer setengah mil, larutkan dan kemudian pilih buffer terisolasi berdasarkan area (yang perlu Anda hitung). Perhatikan bahwa 1) membuat buffer 1 mil yang sebenarnya cukup mahal 2) larut cukup mahal. Hanya opsi 1 yang masuk akal bagi saya, jika Anda menggunakan kembali poligon beberapa kali.
radouxju

2

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.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.