如何根据经度和纬度坐标将旧金山等城市划分为相同大小的街区?这样做的目的是当我收到城市中某个位置的坐标时,我想将其自动分配到其中一个块中。
答案 0 :(得分:0)
天真的方法是在整个城市周围找到一个足够大的矩形(你想要覆盖的区域),并根据所需的块数推断你可以推导出多少部分划分矩形边缘,它应该是一个相当基本的数学 给定一个点你可以用非常快的方式将它分配给它(只需检查它的局域网并长时间看它在网格中的位置)
答案 1 :(得分:0)
以下是公共可用的python库模块Geohash(https://github.com/vinsci/geohash)的简单使用。
python hashmap(字典)用于将Geohash字符串映射到已在Geohash表示的区域(“块”)中添加的lat / lng点列表。通过计算位置的Geohash并访问该条目的hashmap来检索该“块”的所有条目来执行查询。
### Add position to Geohash
### Each hash mapping contains a list of points in the "block"
###
def addToGeohash(m, latitude, longitude):
p = (latitude, longitude)
ph = encode(p[0],p[1],5)
if ph not in m:
m[ph] = []
m[ph].append(p)
return
### Get positions in same "block" or empty list if none found
###
def getFromGeohash(m, latitude, longitude):
p = (latitude, longitude)
ph = encode(p[0],p[1],5)
print ("query hash: " + ph)
if ph in m:
return m[ph]
return []
### Test
m = dict()
# Add 2 points in general area (1st near vista del mar)
addToGeohash(m, 37.779914,-122.509431)
addToGeohash(m, 37.780546,-122.366189)
# Query a point 769 meters from vista del mar point
n = getFromGeohash(m, 37.779642,-122.502993)
print ("Length of hashmap: "+str(len(m)))
print ("Contents of map : "+str(m))
print ("Query result : ")
print (n)
默认精度为12个字符(示例中使用了5个),会影响字典映射效率或“块”大小。
请注意,使用基于lat / lng的方法是非线性的,因此在大面积区域或靠近极点的区域不会是“大小相等的块”。然而, 在San Fransisco地区,并且具有足够的精度,这种非线性显着降低。
输出
query hash: 9q8yu
Length of hashmap: 2
Contents of map : {'9q8yu': [(37.779914, -122.509431)], '9q8yz': [(37.780546, -122.366189)]}
Query result :
[(37.779914, -122.509431)]
要了解各种精度的块大小,请使用此link并输入例如37.779914,-122.509431和精度为5.实验精度。
以下是精度5-8的近似箱尺寸:
5 ≤ 4.89km × 4.89km
6 ≤ 1.22km × 0.61km
7 ≤ 153m × 153m
8 ≤ 38.2m × 19.1m
Geohash的一个有趣的功能主要是(并且总是在SanFran区域),你可以通过操纵最后一个字符轻松找到8个相邻的邻居。因此,只需要很少的努力就可以使用更高的精度(例如8)并将其缩小到7到8之间。