使用VB实现geohash算法
GeoHash用一个字符串表示一个经纬度坐标,将一个二维向量转化为一个一维向量。GeoHash可以方便位置的索引。使用VB实现经纬度的geohash编码,给出一个VB函数。
Public Function encodeGeoHash(Latitude, Longitude, Precision)
Dim BITS() As Variant
Dim BASE32() As Variant
BITS = Array(16, 8, 4, 2, 1)
BASE32 = Array("0", "1", "2", "3", "4", "5", "6", "7", "8", "9", _
"b", "c", "d", "e", "f", "g", "h", "j", "k", "m", _
"n", "p", "q", "r", "s", "t", "u", "v", "w", "x", _
"y", "z")
Dim isEven As Boolean
isEven = True
i = 0
Bit = 0
ch = 0
Geohash = ""
Dim latMin As Double, latMax As Double
Dim lonMin As Double, lonMax As Double
latMin = -90#
latMax = 90#
lonMin = -180#
lonMax = 180#
Dim tempMid As Double
While (Len(Geohash) < Precision)
If isEven Then
tempMid = (lonMin + lonMax) / 2
If Longitude > tempMid Then
ch = ch Or BITS(i)
lonMin = tempMid
Else
lonMax = tempMid
End If
Else
tempMid = (latMin + latMax) / 2
If Latitude > tempMid Then
ch = ch Or BITS(i)
latMin = tempMid
Else
latMax = tempMid
End If
End If
isEven = Not isEven
If i < 4 Then
i = i + 1
Else
Geohash = Geohash & BASE32(ch)
i = 0
ch = 0
End If
Wend
encodeGeoHash = Geohash
End Function 以下是使用Python实现GeoHash算法的代码:
```python
import math
def geohash(lat, lng, length):
lat_interval = 90.0 / length
lng_interval = 180.0 / length
lat_buckets = int(math.ceil(180.0 / lat_interval))
lng_buckets = int(math.ceil(360.0 / lng_interval))
lat_bin = 0
lng_bin = 0
hash_value = ""
for i in range(length):
if i < lat_buckets:
lat_delta = lat_interval * i
lat_bin += int(math.floor(lat + lat_delta))
else:
lat_bin += int(math.floor(lat + (180.0 if i >= lat_buckets - 1 else lat_interval)))
if i < lng_buckets:
lng_delta = lng_interval * i
lng_bin += int(math.floor(lng + lng_delta))
else:
lng_bin += int(math.floor(lng + (360.0 if i >= lng_buckets - 1 else lng_interval)))
hash_value += str(lat_bin << 1) + str(lng_bin)
return hash_value
```
该函数接受三个参数:`lat`表示纬度,`lng`表示经度,`length`表示生成的哈希值长度。例如,如果要生成2位GeoHash编码,则将`length`设置为2。函数将返回一个字符串,表示生成的GeoHash编码。 没有过时的语言,只有秃然的强大 从使用Win10后很少打开VB了 很新鲜的思路,支持 学习了,谢谢分享 在学校学VB前都没听说过VB VB图像界面好用。
页:
[1]