如何检查地理点是否在给定shapefile的区域内?
我设法在python中加载一个shapefile,但无法进一步.
我有数千个以表格形式存储的多边形(给定它们的4个角坐标),它们代表地球的小区域.另外,每个多边形都有一个数据值.该文件看起来像这样的例子:
lat1, lat2, lat3, lat4, lon1, lon2, lon3, lon4, data
57.27, 57.72, 57.68, 58.1, 151.58, 152.06, 150.27, 150.72, 13.45
56.96, 57.41, 57.36, 57.79, 151.24, 151.72, 149.95, 150.39, 56.24
57.33, 57.75, 57.69, 58.1, 150.06, 150.51, 148.82, 149.23, 24.52
56.65, 57.09, 57.05, 57.47, 150.91, 151.38, 149.63, 150.06, 38.24
57.01, 57.44, 57.38, 57.78, 149.74, 150.18, 148.5, 148.91, 84.25
...
Run Code Online (Sandbox Code Playgroud)
许多多边形相交或重叠.现在我想创建一个*m矩阵,范围从-90°到90°纬度和-180°到180°经度,例如0.25°x0.25°,以存储(面积加权)平均数据落在每个像素内的所有多边形的值.
因此,常规网格中的一个像素将获得一个或多个多边形的平均值(如果没有多边形与像素重叠,则为无).每个多边形应该根据其在该像素内的面积分数贡献该平均值.
基本上常规网格和多边形看起来像这样:

如果查看像素2,您会看到这个像素中有两个多边形.因此,我必须考虑它们的面积分数来取两个多边形的平均数据值.然后应将结果存储在常规网格像素中.
我环顾网络,到目前为止找不到令人满意的方法.由于我使用Python/Numpy进行日常工作,我想坚持下去.这可能吗?该软件包匀称看起来很有希望,但我不知道从哪里开始......一切移植到PostGIS的数据库的努力一个可怕的量,我想还会有我的方式相当多的障碍.
我在图像数据集上实现了几种聚类算法.我有兴趣获得聚类的成功率.我必须检测肿瘤区域,在我知道肿瘤所在位置的原始图像中,我想比较两个图像并获得成功的百分比.以下图片:
原图:我知道癌症的位置
聚类算法后的图像
我正在使用python 2.7.
我试图在六个多边形内找到数百万个点.这是我的代码:
def find_shape(longitude,latitude):
if longitude != 0 and latitude != 0:
point = shapely.geometry.Point(longitude,latitude)
else:
return "Unknown"
for current_shape in all_shapes:
if current_shape['bounding_box'].contains(point):
if current_shape['shape'].contains(point):
return current_shape['properties']['ShapeName']
break
return "Unknown"
Run Code Online (Sandbox Code Playgroud)
我已经阅读了其他一些问题,这些问题涉及改善多边形点查询的性能.他们建议Rtrees.然而,这似乎是当有很多的多边形这是非常有用的情况下(36 000个问题,10万另一个),这是不可取的遍历所有.
正如您所见,我已经设置了一个边界框.这是我的形状设置代码:
with fiona.open(SHAPEFILE) as f_col:
all_shapes = []
for shapefile_record in f_col:
current_shape = {}
current_shape['shape'] = shapely.geometry.asShape(shapefile_record['geometry'])
minx, miny, maxx, maxy = current_shape['shape'].bounds
current_shape['bounding_box'] = shapely.geometry.box(minx, miny, maxx, maxy)
current_shape['properties'] = shapefile_record['properties']
all_shapes.append(current_shape)
Run Code Online (Sandbox Code Playgroud)
还要检查另一个非常简化的形状版本,即由最大的内切矩形(或三角形)制成的形状是否有用?
检查匀称的文档,它似乎没有这个功能.也许一些设置simplify()?当然,我总是希望确保新的简化形状不会超出原始形状的范围,因此我不必调用contains() …
我有一个简化的城市地图,其中的街道为线串,地址为点。我需要找到从每个点到任何一条街线的最近路径。我有一个执行此操作的脚本,但由于嵌套了循环,因此它在多项式时间内运行。对于15万行(形状为LineString)和10000点(形状为Point),在8 GB Ram计算机上需要10个小时才能完成。
该函数如下所示(抱歉,无法完全重现):
import pandas as pd
import shapely
from shapely import Point, LineString
def connect_nodes_to_closest_edges(edges_df , nodes_df,
edges_geom,
nodes_geom):
"""Finds closest line to points and returns 2 dataframes:
edges_df
nodes_df
"""
for i in range(len(nodes_df)):
point = nodes_df.loc[i,nodes_geom]
shortest_distance = 100000
for j in range(len(edges_df)):
line = edges_df.loc[j,edges_geom]
if line.distance(point) < shortest_distance:
shortest_distance = line.distance(point)
closest_street_index = j
closest_line = line
...
Run Code Online (Sandbox Code Playgroud)
然后,将结果保存在表中作为新列,该列将点到线的最短路径添加为新列。
有没有一种方法可以使该功能更快些?
例如,如果我可以为50m左右的每个点过滤出线,这将有助于加快每次迭代的速度?
有没有一种方法可以使用rtree包使其更快?我能够找到一个答案,从而使脚本可以更快地找到多边形的交点,但是我似乎无法使它适用于最接近点到线的地方。
https://pypi.python.org/pypi/Rtree/
抱歉,如果已经回答了,但是我在这里也没有在gis.stackexchange上找到答案
谢谢你的建议!
我想将一长串纬度/经度坐标转换为它们所属的美国州(或县).考虑到我具有状态几何,一种可能的解决方案是针对所有状态检查每个点.
for point in points:
for state in states:
if point.within(state['shape']):
print state.name
Run Code Online (Sandbox Code Playgroud)
有没有更优化的方法来做到这一点,可能在O(1)?