Python - 从包含在与Polygon相交的MultiLineString shapefile中的Line获取属性

时间:2015-05-25 00:50:18

标签: python polygon shapely multilinestring

我有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))

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

我需要的是从线形文件中与多边形相交的每一行获得两个属性('Nombre'和'Sentido'),以及它们相交的确切点,这样我就可以得到距离多边形的中心到之后的交叉点。

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

如果有任何我遗漏的信息,请告诉我,以便我可以编辑问题。

非常感谢您提前, 菲利普。

2 个答案:

答案 0 :(得分:0)

你应该看一下使用Fiona和Shapely的GeoPandas http://geopandas.org/,同时还能以一种漂亮的表格形式直接访问这些属性。与一些pandas操作(例如在this post中)一起,你应该可以用几行代码做你想做的事。

答案 1 :(得分:0)

可能不是最好的代码,但我通过加载点shapefile(点属性所在的位置),行shapefile(行属性所在的位置)和多边形(缓冲点)来解决它。然后我使用了2'检查每个缓冲点是否与每条线相交。如果是这样,我使用相同的' 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))