从OpenStreetMap数据

时间:2016-03-18 01:22:26

标签: python gis shapely

我正在尝试使用OpenStreetMap数据制作分析GPX文件的工具,以识别位置。我已成功从GPX文件中提取所有航点并创建为MultiPoint对象,并使用立交包装器提取OpenStreetMap边界关系(边界数据)。问题是与500多个对象建立关系,并将它们转换为Polygon或MultiPolygons。我已成功创建边框的所有部分作为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

出了什么问题?

2 个答案:

答案 0 :(得分:1)

如果您想直接从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)

答案 1 :(得分:0)

linemerge没有做好这项工作。 polygons.append(line.buffer(meter2deg(1.0)))将每个路段转换为多边形。