【问题标题】:Creating Shapely Polygon/MultiPolygon from OpenStreetMap data从 OpenStreetMap 数据创建 Shapely Polygon/MultiPolygon
【发布时间】:2016-03-18 01:22:26
【问题描述】:

我正在尝试制作一个工具来使用 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

出了什么问题?

【问题讨论】:

  • 异常的回溯是什么?这未在问题中捕获/记录。
  • 当我跳过这一点并使用 buffer() 创建每个路段的多边形时,我正在努力将外部边界与 linemerge 合并,它没有合并行并在没有抛出异常的情况下结束了任务我能够使用 cascading_union 加入所有 Polygonized 方式段,然后删除内部孔。问题已由我自己解决。

标签: python gis shapely


【解决方案1】:

pyosmium 可以帮助您直接从 osm 文件转到有形数据。它是一个读取 osm 文件的库,并具有帮助类来从区域创建 WKB(众所周知的二进制)格式对象,然后您可以将其加载到 shapely 中。

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)

【讨论】:

    【解决方案2】:

    linemerge 没有完成这项工作。使用polygons.append(line.buffer(meter2deg(1.0)))cascade_union(polygons) 将每个路段转换为多边形有效。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-04
      相关资源
      最近更新 更多