从 OpenStreetMap 数据创建 Shapely Polygon/MultiPolygon
Creating Shapely Polygon/MultiPolygon from OpenStreetMap data
我正在尝试制作一个工具来分析 GPX 文件,使用 OpenStreetMap 数据来识别位置。我已成功从 GPX 文件中提取所有 waypoints 并创建为 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
出了什么问题?
linemerge 没有做这项工作。使用 polygons.append(line.buffer(meter2deg(1.0)))
和 cascade_union(polygons)
将每个路段转换为多边形。
pyosmium 如果你想直接从 osm 文件到 shapely 数据,可以提供帮助。它是一个读取 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)
我正在尝试制作一个工具来分析 GPX 文件,使用 OpenStreetMap 数据来识别位置。我已成功从 GPX 文件中提取所有 waypoints 并创建为 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
出了什么问题?
linemerge 没有做这项工作。使用 polygons.append(line.buffer(meter2deg(1.0)))
和 cascade_union(polygons)
将每个路段转换为多边形。
pyosmium 如果你想直接从 osm 文件到 shapely 数据,可以提供帮助。它是一个读取 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)