将经度和纬度划分为矩阵

时间:2018-03-24 17:50:29

标签: python python-3.x google-maps geolocation data-visualization

如何根据经度和纬度坐标将旧金山等城市划分为相同大小的街区?这样做的目的是当我收到城市中某个位置的坐标时,我想将其自动分配到其中一个块中。

2 个答案:

答案 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之间。