0

我有 2 个 shapefile,1 个包含构成道路网络的许多线路,另一个包含许多 GPS 点。

到目前为止,我已经成功地打开了两个 shapefile 并使用 Shapely 和 Fiona 进行了交集(),使用此处找到的代码 - https://gis.stackexchange.com/a/128210/52590

这是我获取交叉点的代码的副本:

from shapely.geometry import shape, MultiLineString
import fiona

Multilines = MultiLineString([shape(line['geometry']) for line in fiona.open("shapefiles/edges.shp")])
Poly = shape(fiona.open("shapefiles/testBuffer.shp").next()['geometry'])
intersecciones = Multilines.intersection(Poly)

这就是“intersecciones”打印时的样子:

> MULTILINESTRING ((339395.1489003573 6295646.564306445,
> 339510.1820952367 6295721.782758819), (339391.2927481248 6295686.99659219, 339410.0625 6295699), (339404.4651918385 6295630.405294137, 339520.18020253 6295708.663279793))

所以这意味着线条 shapefile 和多边形 shapefile 的第一个多边形之间有 3 个交点。

我需要的是从与多边形相交的行 shapefile 中的每一行获取两个属性(“Nombre”和“Sentido”),除了它们相交的确切点之外,这样我就可以得到距中心的距离多边形到相交点之后。

所以我的问题是,是否有任何方法可以使用 Shapely 或任何其他 Python 库来获取这些属性。另外,遍历每个多边形并保存数据的最佳方法是什么?我在考虑可能包含每个多边形的字典,其中包含相交线和距离的属性。最后,有没有更有效的方法来找到交叉点?处理一个多边形大约需要 1 分钟,将来我可能需要它更快。

如果我缺少任何信息,请告诉我,以便我可以编辑问题。

非常感谢您,费利佩。

4

2 回答 2

0

您应该看看 GeoPandas http://geopandas.org/,它使用了 Fiona 和 Shapely,同时还让您可以直接访问表格格式的属性。连同一些 pandas 操作(例如在这篇文章中),您应该能够用几行代码做您想做的事情。

于 2015-05-25T15:12:18.707 回答
0

可能不是最好的代码,但我通过加载点 shapefile(点属性所在的位置)、线条 shapefile(线条属性所在的位置)和多边形(缓冲点)来解决它。然后我使用 2 'for' 检查每个缓冲点是否与每条线相交。如果是这样,我使用完全相同的“for”检索属性。

最后我有“listaCalles”,它是一个列表,其中包含多边形与线的每个交集,具有许多属性。

red = fiona.open("shapefiles/miniRedVial.shp")  # loads road network
puntos = fiona.open("shapefiles/datosgps.shp")  # loads points

# open points with shapely and fiona
Multipoints = MultiPoint([shape(point['geometry']) for point in fiona.open("shapefiles/datosgps.shp")])
# open road network with shapely and fiona
Multilines = MultiLineString([shape(line['geometry']) for line in fiona.open("shapefiles/miniRedVial.shp")])
# open buffered points with shapely and fiona
Polygons = MultiLineString([list(shape(pol['geometry']).exterior.coords) for pol in fiona.open("shapefiles/testBuffer.shp")])

# create list where I'll save the intersections
listaCalles = []

for i in range(0, len(Polygons)):
    for j in range(0, len(Multilines)):
        if Polygons[i].intersection(Multilines[j]):
            idPunto = puntos[i].get("id")
            latPunto = puntos[i].get("properties").get("LATITUDE")
            lonPunto = puntos[i].get("properties").get("LONGITUDE")
            idCalle = red[j].get("id")
            nombreCalle = red[j].get("properties").get("NOMBRE")
            distPuntoCalle = Multilines[j].distance(Multipoints[i])
            listaCalles.append((idPunto, latPunto, lonPunto, idCalle, nombreCalle, distPuntoCalle))
于 2015-05-31T00:50:57.747 回答