Shapely Khoảng cách khác với Geopy / Haversine


8

Tôi đang chạy một phân tích cụ thể trong đó chúng tôi sử dụng hình dạng để tạo bộ đệm xung quanh các điểm (vị trí cửa hàng) và sau đó kiểm tra xem các điểm khác (vị trí người dùng) có trong giá trị bộ đệm đó không. Khi tôi kiểm tra khoảng cách bằng cách sử dụng hình dạng, nó hóa ra khác với khoảng cách tôi nhận được từ địa lý. Công thức haversine đồng ý với Geopy và kiểm tra trên bản đồ google bằng cách sử dụng chức năng đo khoảng cách cũng cho khoảng cách tương tự

Đây là một ví dụ:

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 Hình
dạng:
110.02637304449682 Công thức Haversine ( http://www.movable-type.co.uk/scripts/latlong.html ): 84,88

Cái nào là đúng? Tạo dáng hay người khác? Ngoài ra, có phải là một sự khác biệt lớn như vậy (~ 22%) không? Hay tôi đang thiếu một cái gì đó?

Câu trả lời:


10

Bởi vì các nguyên tắc và thuật toán là khác nhau (nhìn vào khoảng cách địa lý )

  1. Định hình sử dụng khoảng cách euclide trong mặt phẳng cartesian và khoảng cách ngắn nhất giữa hai điểm trong mặt phẳng là một đường thẳng chứa hai điểm.
 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 và Haversine sử dụng khoảng cách trắc địa (trên ellipsoid, Vincenty) hoặc khoảng cách vòng tròn lớn (khoảng cách ngắn nhất dọc theo bề mặt của một hình cầu) giữa hai điểm. Khoảng cách ngắn nhất trên bề mặt của một quả cầu là dọc theo vòng tròn lớn chứa hai điểm.

    Do đó, điều bình thường là khoảng cách euclid Shapely, Numpy và Scipy khác với khoảng cách Vincenty, Great Circle và Haversine và sự khác biệt giữa khoảng cách Vincenty, Great Circles và Haversine có liên quan đến sự lựa chọn của một ellipsoid và nhiều thứ khác.

    Bạn cũng có thể thay đổi 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

Hoặc sử dụng các thư viện khác làm trắc địa

 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)

Bạn có thể thấy rằng tất cả sự khác biệt là centimetric. Với độ chính xác của hệ mét, tất cả các giá trị = 85 mét.

  1. Cái nào là đúng? Tất cả, bởi vì nó phụ thuộc vào ngữ cảnh: nếu bạn làm việc với dữ liệu được chiếu (mặt phẳng cartesian), bạn sử dụng khoảng cách Euclide (Shapely, Numpy, Scipy và nhiều người khác), nếu không, một trong những người khác.

    Chúng cũng có nhiều khoảng cách khác ( khoảng cách không gian Scipy )

Mới

Để hỗ trợ câu trả lời của 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

Câu trả lời tốt. Chỉ cần một ghi chú nhanh về điểm số 3 của bạn khi sử dụng phép chiếu EPSG:3857- Shapely là lựa chọn sai ở đây. Web Mercator là không phù hợp và không nên được sử dụng để tính khoảng cách.
Mintx 10/03/2016

3

Và đây là một tính toán khoảng cách khác từ GeographicLib :

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

Tôi sẽ xem xét điều này đúng, trong vòng 15 nanomet.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.