如何高效地将一组geohash转换为多边形?

问题描述 投票:0回答:3

我一直在寻找一种有效的方法来在Python中将一组geohash转换为多边形,此外有时我会获得多重多边形而不是多边形,可能是因为一些内部geohash丢失了。我目前正在使用 python-geohashshapely,我的方法包括以下步骤:

  1. 我通过提取每个geohash的角坐标将其转换为多边形。

    def to_polygon(geohash):
        box = Geohash.bbox(geohash)
        return Polygon([(box['e'], box['n']), (box['w'], box['n']), (box['w'], box['s']), (box['e'], box['s'])])
    
  2. 然后我

    map
    在geohash的
    iterable
    上执行之前解释的转换。

    polygons = [to_polygon(geohash) for geohash in geohashes]
    
  3. 最后,我使用多边形的方法union将所有这些多边形合并为一个多边形。

    polygon = functools.reduce(lambda a, b: a.union(b), polygons)
    

如果一组 geohashes 约为数千个,则可能需要几分钟。

python-3.x polygons geohashing
3个回答
6
投票

我创建了一个库(polygon-geohasher)来实现此目的:

from polygon_geohasher.polygon_geohasher import geohashes_to_polygon

geohashes = ['9bc1db2',
             '9bc1db6', 
             '9bc1db1', 
             '9bc1db0',
             '9bc1db4',
             '9bc1db9', 
             '9bc1db8',
             '9bc1dbd', 
             '9bc1db3']
polygon = geohashes_to_polygon(geohashes)
print(polygon) 
# POLYGON ((-99.71878051757812 4.483795166015625, -99.71878051757812 4.482421875, -99.72015380859375 4.482421875, -99.72152709960938 4.482421875, -99.722900390625 4.482421875, -99.722900390625 4.483795166015625, -99.722900390625 4.48516845703125, -99.722900390625 4.486541748046875, -99.72152709960938 4.486541748046875, -99.72015380859375 4.486541748046875, -99.71878051757812 4.486541748046875, -99.71878051757812 4.48516845703125, -99.71878051757812 4.483795166015625))

3
投票

使用geohashlite

# GeoHash to GeoJSON
converter_1 = geohashlite.GeoJsonHasher()
x = ['u09k', 'u095', 'u08g', 'u09h', 'u09e', 'u097']
converter_1.geohash_codes = x
converter_1.decode_geohash(multipolygon=True)
print(converter_1.geojson)

0
投票

从 Alberto Bonsanto 提到的

polygon_geohasher
库中汲取灵感,我用 Rust 重写了它,因为随着输入多边形大小的增加,纯 Python 版本不能很好地扩展。它称为 rusty-polygon-geohasher(可在 pypy 上使用),速度快 3 倍以上。

import geohash_polygon

polygon = shapely.geometry.Polygon([
    (-99.1795917, 19.432134), (-99.1656847, 19.429034),
    (-99.1776492, 19.414236), (-99.1795917, 19.432134)])

# returns {'9g3qr', '9g3qx'}
geohash_polygon.polygon_to_geohashes(polygon, 5, inner=False)
© www.soinside.com 2019 - 2024. All rights reserved.