簡體   English   中英

從OpenStreetMap數據創建形狀多邊形/多多邊形

[英]Creating Shapely Polygon/MultiPolygon from OpenStreetMap data

我正在嘗試制作一個使用OpenStreetMap數據分析GPX文件以識別位置的工具。 我已經成功地從GPX文件中提取了所有航路點並創建為MultiPoint對象,並使用立交包裝器提取了OpenStreetMap邊界關系(邊界數據)。 問題是要處理與500多個對象的關系,並將它們轉換為“多邊形”或“多多邊形”。 我已經成功地將邊框的所有部分創建為LineString對象,並且所有圓形的部分(LinearRings)都成功地制成了Polygon對象。 問題是連接所有非圓形對象。

    newLines = []
    for line in lines:
        if isinstance(line, MultiLineString):
            newLines.extend(line)
        else:
            newLines.append(line)
    try:
        polygons.append(Polygon(linemerge(newLines)))
        logger.debug("Created Polygon from sum of lines")
    except:
        try:
            polygons.append(MultiPolygon(linemerge(newLines)))
            logger.debug("Created MultiPolygon from sum of lines")
        except:
            logger.debug("Failed to create Polygon from sum of lines")
            raise

...從日志文件中,未引發任何異常

2016/03/17 21:43:59: gpxupload.py DEBUG - Failed to create Polygon from sum of lines

怎么了?

如果您想直接從osm文件轉換為整齊的數據,pyosmium可以提供幫助。 它是一個讀取osm文件的庫,並且具有幫助程序類,可以從區域創建WKB(眾所周知的二進制)格式的對象,然后可以將其加載到整形文件中。

import osmium
import shapely.wkb

wkbfab = osmium.geom.WKBFactory()

class WayMerger(osmium.SimpleHandler):

    def area(self, a):
        wkbshape = wkbfab.create_multipolygon(a)
        shapely_obj = shapely.wkb.loads(wkbshape, hex=True)

linemerge沒有完成這項工作。 使用polygons.append(line.buffer(meter2deg(1.0)))將每個路段轉換為多邊形, polygons.append(line.buffer(meter2deg(1.0))) cascade_union(polygons)起作用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM