2012-11-19 39 views
9

nếu chiều dài của chuỗi geohash là nhiều hơn, nó là chính xác hơn. Nhưng có bất kỳ mối quan hệ trực tiếp nào không, nếu như chiều dài là 7, nó cung cấp độ chính xác 100 mét,chiều dài chuỗi geohash và độ chính xác

tức là nếu hai geohash (và một trong hai hộp giới hạn) có kết hợp 7 char đầu tiên, cả hai phải gần 100 mét?

Tôi đang sử dụng geohash cho việc tìm kiếm, tất cả gần như theo vị trí cho geohash nhất định, với khoảng cách của họ

Ngoài ra bất kỳ directway để tính toán khoảng cách giữa hai geohash? (Một chiều là để giải mã chúng để lat/lng, và sau đó tính toán khoảng cách)

Cảm ơn

+0

Không một câu trả lời duy nhất cho ** độ dài chuỗi cần thiết cho một thước đo 1 mét ** – Atul

Trả lời

10

Đã thấy rất nhiều sự nhầm lẫn xung quanh geohashing vì vậy tôi đăng sự hiểu biết của tôi cho đến nay. Nguyên tắc đằng sau geohash rất đơn giản, bạn có thể tạo phiên bản của riêng mình. Ví dụ xem xét sau geo-point,

156,34234534, -23,343423345

Trong ví dụ trên, 156 đại diện cho độ, 2 chữ số sau decmal (34) đại diện cho phút dạng thập phân và nghỉ ngơi, (34,5334) đại diện cho giây.

Nếu bạn còn nhớ trường chu vi địa lý của trái đất tại đường xích đạo là khoảng 40,000kms và số độ xung quanh trái đất (vĩ độ hoặc kinh độ) là 360. Vì vậy, tại các điểm rộng nhất từng mức độ vĩ độ và kinh độ tuổi tương đương với khoảng 110kms (40.000/360).

Vì vậy, nếu bạn mã hóa các tọa độ trên là "156-23" (bao gồm dấu âm), hộp này sẽ cung cấp cho bạn (110kmx110km).

Bạn có thể tiếp tục và tăng độ chính xác, Chữ số nắm tay của phút (156.3-23.3) sẽ cung cấp cho bạn (10kmx10km) hộp (mỗi phút phút bằng 1km).

Tăng số này để bao gồm số đầu tiên của hộp thứ hai bạn nhận được (100mx100m), mỗi chữ số bổ sung sẽ thêm độ chính xác vào một mức độ khác. Geohashing chỉ là cách để đại diện cho các con số trên trong một hình thức mã hóa. Bạn cũng có thể vui vẻ sử dụng định dạng trên!

2

Ngoài ra bất kỳ directway để tính toán khoảng cách giữa hai địa băm? (một cách là giải mã chúng thành lat/lng và sau đó tính khoảng cách)

Đó là những gì bạn nên làm. Hãy nghĩ về geohash như một đại diện khác của vĩ độ và kinh độ khi một cặp số thập phân được in tương tự. Nếu tôi đưa cho bạn một cặp lat =các chuỗi dài, bạn sẽ phân tích chúng thành các số (trong ngôn ngữ lập trình bạn chọn), và sau đó thực hiện phép toán. Nó không khác với geohashes - giải mã thành lat & lon rồi thực hiện phép toán.

Hãy rất cẩn thận với bất kỳ lý do nào bạn đang cố gắng thực hiện với việc suy ra tính gần gũi dựa trên độ dài của tiền tố chung giữa một cặp điểm. Nếu có tiền tố chung dài thì chúng sẽ đóng, nhưng ngược lại là không đúng! - nghĩa là hai điểm không có tiền tố chung có thể cách nhau một milimet.

+0

Cảm ơn David, Bất kỳ ý tưởng nào về truy vấn đầu tiên? –

+1

Sử dụng bảng trong định nghĩa Geohash của Wikipedia. Tôi đã thực hiện các công thức Excel trước để xem độ chính xác và tôi nghĩ rằng tôi đã mã hóa trong Java quá. –

+0

Cảm ơn, rất hữu ích –

4

Dưới đây là công thức cho chiều cao và chiều rộng bằng độ của một geohash có độ dài n ký tự:

Đầu tiên xác định chức năng này:

        chẵn lẻ (n) = 0 nếu n là chẵn hay cách khác 1

Sau đó

        height = 180/2 (5n-chẵn lẻ (n))/2 độ

        width = 180/2 (5n + chẵn lẻ (n) -2)/2 độ

Lưu ý rằng điều này là chiều cao và chiều rộng tính theo độ. Để chuyển đổi thành mét, yêu cầu bạn biết vị trí của băm trên trái đất.

Mã cho điều này trong java là http://github.com/davidmoten/geo.

+0

Tôi biết bài đăng này cũ, nhưng google tiếp tục đưa bài đăng này lên cho bất kỳ thứ gì liên quan đến 'geohash' và 'precision', vì vậy ... Tôi nghĩ forumla thứ hai là sai, '-1' nên ở bên ngoài/2, tức là tôi nghĩ rằng thứ hai nên là: 'width = 180/(2^(((5n + chẵn lẻ (n))/2) -1))' – stripybadger

+0

Tôi đồng ý, cảm ơn! May mắn là mã trong dự án cũng đồng ý. Tôi chỉ ghi lại nó rất tệ. –

10

Đã tò mò về điều này. Nếu bất kỳ điều gì tốt cho bất kỳ ai tôi đặt cùng một bảng tính here Không chắc chắn 100% quyền của nó - hãy bình luận nếu bạn thấy có vấn đề.

Đánh giá bằng biểu đồ bên dưới, sử dụng từ 6 đến 10 chữ số cho độ chính xác ~ 1km đến ~ 1m ở độ 60 độ lat. enter image description here

1

Dưới đây là một phương trình (trong giả) có thể xấp xỉ chiều dài Geohash tối ưu cho một cặp vĩ độ/kinh độ có một độ chính xác nhất định:

geohash_length = FLOOR (LOG_2(5000000/precision_in_meters)/2,5 + 1) 
if geohash_length > 12 then geohash_length = 12 
if geohash_length < 1 then geohash_length = 1 

Tôi đã sử dụng nó để tạo ra các Geohash tối ưu từ dữ liệu nhận được bởi daemon gpsd, cũng cung cấp thông tin chính xác qua các giá trị epxepy.

Các vấn đề liên quan