Distance Shapely berbeda dari Geopy / Haversine


8

Saya menjalankan analisis khusus di mana kami menggunakan Shapely untuk membuat buffer di sekitar titik (lokasi toko) dan kemudian memeriksa apakah titik lain (lokasi pengguna) hadir dalam nilai buffer itu. Ketika saya memeriksa jarak menggunakan bentuk, ternyata berbeda dari jarak yang saya dapatkan dari geopy. Rumus haversine setuju dengan Geopy dan cek di google maps menggunakan fungsi ukur jarak juga memberikan jarak yang sama

Berikut ini sebuah contoh:

from shapely.geometry import Point, shape
from pyproj import Proj, transform
from geopy.distance import vincenty, great_circle

pt_store=Point(transform(Proj(init='EPSG:4326'),Proj(init='EPSG:3857'),-76.799614, 39.435307))

pt_user=Point(transform(Proj(init='EPSG:4326'),Proj(init='EPSG:3857'),-76.79989,39.43604))

vincenty((39.435307,-76.799614),(39.43604,-76.79989)).meters
great_circle((39.435307,-76.799614),(39.43604,-76.79989)).meters
pt_store.distance(pt_user)

Vincenty: 84.77847691521336
Great_circle: 84.90640111682812 Shapely
: 110.02637304449682
Formula Haversine ( http://www.movable-type.co.uk/scripts/latlong.html ): 84.88

Yang mana yang benar? Bentuk atau orang lain? Juga, apakah perbedaan yang sangat besar (~ 22%) diharapkan? Atau apakah saya melewatkan sesuatu?

Jawaban:


10

Karena prinsip dan algoritme berbeda (lihat jarak Geografis )

  1. Dengan mudah menggunakan jarak euclidean dalam bidang kartesius dan jarak terpendek antara dua titik dalam pesawat adalah garis lurus yang berisi dua titik.
 import numpy as np
 print np.linalg.norm(np.array(pt_user) - np.array(pt_store))
 110.02637304449682 # meters
 from scipy.spatial import distance
 print distance.euclidean(pt_user, pt_store)
 110.02637304449682 # meters
  1. Vincenty, Great Circle dan Haversine menggunakan jarak geodesik (pada ellipsoid, Vincenty) atau jarak lingkaran besar (jarak terpendek di sepanjang permukaan bola) antara dua titik. Jarak terpendek pada permukaan bola adalah sepanjang lingkaran besar yang berisi dua titik.

    Oleh karena itu adalah normal bahwa jarak euclidean Shapely, Numpy dan Scipy berbeda dari jarak Vincenty, Great Circle dan Haversine dan perbedaan antara jarak Vincenty, Great Circles dan Haversine terkait dengan pilihan ellipsoid, dan banyak hal lainnya.

    Anda juga dapat mengubah ellipsoid

 print vincenty((39.435307,-76.799614),(39.43604,-76.79989),ellipsoid='WGS-84')
 0.0847784769149 km
 print vincenty((39.435307,-76.799614),(39.43604,-76.79989),ellipsoid='GRS-80')
 0.0847784769128 km

Atau gunakan perpustakaan lain sebagai geodistance

 print geodistance.distanceVincenty(39.435307,-76.799614,39.43604,-76.79989, ellipsoid='WGS-84')
 (0.08477847691523362, -16.276730447136675) # distance, azimuth
 print geodistance.distanceHaversine(39.435307,-76.799614,39.43604,-76.79989)
 (0.08488248586585143, -16.214988211007256)

Anda dapat melihat bahwa semua perbedaannya adalah sentimetri. Dengan presisi metrik, semua nilai = 85 meter.

  1. Yang mana yang benar? Semua, karena itu tergantung pada konteksnya: jika Anda bekerja dengan data yang diproyeksikan (bidang kartesius), Anda menggunakan jarak Euclidean (Shapely, Numpy, Scipy, dan banyak lainnya), jika tidak, salah satu dari yang lain.

    Mereka juga banyak jarak lainnya ( Scipy Spatial distance )

Baru

Untuk mendukung jawaban Mintx

pt_store=Point(transform(Proj(init='EPSG:4326'),Proj(init='EPSG:31370'),-76.799614, 39.435307))
pt_user=Point(transform(Proj(init='EPSG:4326'),Proj(init='EPSG:31370'),-76.79989,39.43604))
pt_store.distance(pt_user)
86.26511001003892

Jawaban yang bagus. Hanya catatan singkat tentang poin # 3 Anda saat menggunakan proyeksi EPSG:3857- Shapely adalah pilihan yang salah di sini. Web Mercator tidak sesuai dan tidak boleh digunakan untuk menghitung jarak.
Mintx

3

Dan inilah perhitungan jarak lain dari GeographicLib :

from geographiclib.geodesic import Geodesic
g = Geodesic.WGS84.Inverse(39.435307, -76.799614, 39.43604, -76.79989)
print(g['s12'])  # 84.7784769689

Saya akan menganggap ini yang benar, dalam 15 nanometer.

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.