Menghitung Presisi Geohash Optimal dari Bounding Box

8

Saya menggunakan Aggregasi kisi GeoHash dari Elasticsearch untuk mem -plot cluster di peta (menggunakan Leaflet). Saya mengerti bahwa untuk area yang lebih besar, precisionpengaturan yang lebih rendah harus digunakan untuk membatasi jumlah bucket yang dibuat / dikembalikan.

Bagaimana saya harus menentukan nilai presisi yang sesuai untuk diminta?

Apakah ada rumus standar atau yang direkomendasikan untuk menghitung presisi optimal berdasarkan kotak pembatas dan / atau tingkat pembesaran? Apakah lebih baik hanya memetakan tingkat zoom ke nilai presisi (saya tahu itu mungkin paling mudah.)

Peter
sumber

Jawaban:

11

Halaman yang Anda tautkan ke petunjuk pada jawabannya; temukan area kotak pembatas Anda dan bagi dengan area ember. Itu meninggalkan bagaimana menghitung ukuran masing-masing ember geohash, meskipun, memberikan contoh dengan presisi 5.

Menurut halaman yang Anda tautkan, itu akan menghentikan permintaan pada 10.000 ember.

Hitung luas kotak pembatas Anda dalam derajat kuadrat (jangan mencoba melakukan ini dalam km, pertahankan dalam lat / long)

Tangkapan layar di bawah ini menunjukkan batas ketelitian 2 (warnanya dikategorikan berdasarkan ketelitian 1).

masukkan deskripsi gambar di sini

Ini bukan ubin sebenarnya - geohash mewakili suatu titik dengan kesalahan dalam lat / lon - dan kesalahan itu kadang-kadang akan bervariasi antara bujur dan lintang (kesalahan lebih besar dengan lintang, ketika presisi genap)

Menggunakan sedikit Python (menggunakan perpustakaan Geohash ) untuk memperkirakan ukuran masing-masing 'ubin' untuk precision yang berbeda.

from Geohash import geohash

strg = geohash.encode(56.9,-3.2,precision=15)

for prec in range(1,10):
    y,x,yerror,xerror = geohash.decode_exactly(strg[:prec])
    xsize = 2*xerror
    ysize = 2*yerror
    area = xsize*ysize
    print("Precision {}".format(prec))
    print("\tSize approx {} long by {} lat".format(xsize,ysize))
    print("\tArea is {}".format(area))

ini memberikan output berikut

Precision 1
    Size approx 45.0 long by 45.0 lat
    Area is 2025.0
Precision 2
    Size approx 11.25 long by 5.625 lat
    Area is 63.28125
Precision 3
    Size approx 1.40625 long by 1.40625 lat
    Area is 1.9775390625
Precision 4
    Size approx 0.3515625 long by 0.17578125 lat
    Area is 0.061798095703125
Precision 5
    Size approx 0.0439453125 long by 0.0439453125 lat
    Area is 0.0019311904907226562
Precision 6
    Size approx 0.010986328125 long by 0.0054931640625 lat
    Area is 6.034970283508301e-05
Precision 7
    Size approx 0.001373291015625 long by 0.001373291015625 lat
    Area is 1.885928213596344e-06
Precision 8
    Size approx 0.00034332275390625 long by 0.000171661376953125 lat
    Area is 5.893525667488575e-08

Jadi satu pendekatan akan menjadi,

  • hitung "area" (dalam derajat persegi) dari kotak pembatas berbasis lat / lon Anda
  • turunkan meja itu, mulai dari presisi 1, dan bagi area bbox Anda (dalam derajat persegi) dengan area untuk presisi itu
  • pilih nilai presisi dengan nilai pembagian terendah yang dapat diterima

Untuk memperjelas 'dapat diterima': -

  • nilai pembagian yang sangat rendah seperti 0,001 mungkin berarti ketepatannya terlalu rendah. Anda tidak akan mengambil banyak ember, tetapi akan mempertimbangkan banyak poin jauh yang tidak perlu Anda lakukan.

  • Untuk nilai di atas 10.000, presisi terlalu tinggi. Anda akan membuang kemungkinan hit, dan mengalami kinerja yang lebih lambat.

Anda harus bereksperimen untuk menemukan nilai yang memberikan kinerja terbaik.

Steven Kay
sumber
Terima kasih atas jawaban terincinya; sangat membantu. Pendekatan ini sepertinya membuat saya mendapatkan apa yang saya butuhkan.
Peter