我将 Shapely MultiPolygon 转换为 PatchCollection,并首先为每个 Polygon 着色,如下所示:
# ldn_mp is a MultiPolygon
cm = plt.get_cmap('RdBu')
num_colours = len(ldn_mp)
fig = plt.figure()
ax = fig.add_subplot(111)
minx, miny, maxx, maxy = ldn_mp.bounds
w, h = maxx - minx, maxy - miny
ax.set_xlim(minx - 0.2 * w, maxx + 0.2 * w)
ax.set_ylim(miny - 0.2 * h, maxy + 0.2 * h)
ax.set_aspect(1)
patches = []
for poly in ldn_mp:
colour = cm(1. * len(filter(poly.contains, points)) / num_colours)
patches.append(PolygonPatch(poly, fc=colour, ec='#555555', lw=0.2, alpha=1., …Run Code Online (Sandbox Code Playgroud) 我有两个不同长度的数组。一个包含匀称的多边形,另一个包含匀称的点。我想为两个数组中的每个可能的元素组合运行 a_polygon.contains(a_point) 匀称的函数。
我正在看这篇文章,因为构建一个包含行中所有可能组合的两列矩阵可能是一个理想的中间步骤。但是当输入数据很大时,'cartersian(arrays)' 函数中的循环可能会影响性能。
我尝试广播其中一个数组,然后应用 shapely 函数:
Polygons_array[:,newaxis].contains(Points_array)
Run Code Online (Sandbox Code Playgroud)
但这当然是行不通的。我知道最近发布的 geopandas 库,但它不是我的 Canopy 安装的一个选项。
我有一个 Shapely 多边形列表。从该列表中,我只想提取去除重复项的唯一多边形。
如何以更快的方式做到这一点?(我的列表包含数千个多边形)
from shapely.geometry import Polygon
lists = [[(1,1),(2,2),(3,3),(4,4)], [(6,6),(7,7),(8,8),(9,9)], [(1,1),(2,2),(3,3),(4,4)]]
polys = [Polygon(item) for item in lists] ##This is given condition
for poly in polys:
test = [p.intersects(poly) for p in polys] ##Return true or false
print test
[True, False, True]
[False, True, False]
[True, False, True]
Run Code Online (Sandbox Code Playgroud)
预期的结果是:
[[(1,1),(2,2),(3,3),(4,4)], [(6,6),(7,7),(8,8),(9,9)]]
Run Code Online (Sandbox Code Playgroud) 我想知道是我想错了还是这是一个错误:
我有一个线串和一个多边形,我创建了线和多边形边界的交点
这些交点应该相交(至少接触)多边形的边界,对吗?
from shapely import geometry,wkt
line = geometry.LineString([(13.51039642756912, 52.598912814414675), (13.525173800277184, 52.60620240344557)])
poly = geometry.Polygon ([(13.52072838433517, 52.61735554606274), (13.52233276805985, 52.59511541819082), (13.51312087418833, 52.59394589806786),( 13.51526963068252, 52.60338701649216),( 13.51836560008325 ,52.6009395669487), (13.52072838433517, 52.61735554606274)])
ips = line.intersection(poly.boundary)
for i in ips:
print i.touches(poly.boundary) # should touch but it doesnt!!!!
>>>False
Run Code Online (Sandbox Code Playgroud) 这个演示程序(打算在IPython的笔记本电脑上运行,你需要matplotlib,mpl_toolkits.basemap,pyproj,和shapely)应该绘制地球表面上越来越大的圆圈。只要圆圈不越过其中一个极点,它就可以正常工作。如果发生这种情况,在地图上绘制时结果完全是无稽之谈(见下面的单元格 2)
如果我将它们绘制在“空白”而不是地图上(见下面的单元格 3),结果是正确的,因为如果你删除了从 +180 到 -180 经度的水平线,曲线的其余部分将确实划定了所需圆的内部和外部之间的边界。然而,他们的错误在于多边形是无效的(.is_valid是假的),更重要的是,多边形的非零缠绕数内部没有包围地图的正确区域。
我相信这是因为shapely.ops.transform对 +180==-180 经度的坐标奇点视而不见。该问题是,我怎么发现问题和维修的多边形,所以它的封装做地图的正确的区域?在这种情况下,适当的修正是将 (X,+180) -- (X,-180) 的水平线段替换为三行, (X,+180) -- (+90,+180) -- (+90,-180) -- (X,-180); 但要注意的是,如果圈走了在南磁极,该修正线需要,而不是去南方。如果这个圆圈已经超过了两者极点,我们将再次有一个有效的多边形,但它的内部将是它应该是什么的补充。我需要检测所有这些情况并正确处理它们。另外,我不知道如何“编辑”匀称的几何对象。
可下载的笔记本:https : //gist.github.com/zackw/e48cb1580ff37acfee4d0a7b1d43a037
## cell 1
%matplotlib inline
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.basemap import Basemap
import pyproj
from shapely.geometry import Point, Polygon, MultiPolygon
from shapely.ops import transform as sh_transform …Run Code Online (Sandbox Code Playgroud) 找不到库 geos_c 或加载其任何变体 ['libgeos_c.so.1', 'libgeos_c.so']
使用 python:3.5.1 图像我试图运行一个容器,其中包括它安装在 requirements.txt 中的其他内容。当 docker 容器尝试安装匀称时,我收到上述错误。
运行 apt-get install libgeos-dev
是我在尝试搜索问题时看到的,但返回无法找到包 libgeos-dev
概括:
预期条件:在 requirements.txt 文件中包含 shapely 导致在构建 docker 容器时安装 shapely 实际条件:构建期间收到错误消息 Could not find library geos_c or load any of its variants ['libgeos_c.so.1', 'libgeos_c.so']
重现步骤:
使用 docker-compose 构建
Docker-compose.yml:
app:
build: ${APP_REPO}
Run Code Online (Sandbox Code Playgroud)
Dockerfile:
FROM python:3.5.1-onbuild
Run Code Online (Sandbox Code Playgroud)
要求.txt:
shapely
Run Code Online (Sandbox Code Playgroud)
(简化为尝试隔离问题。)
我想使用 python / 计算一个点和一个国家边界之间的距离shapely。它应该可以正常工作 point.distance(poly) 例如在这里演示Find Coordinate of Closest Point on Polygon Shapely但是使用geopandas我面临的问题是:
'GeoSeries' object has no attribute '_geom'
我对数据的处理有什么问题?我的边界数据集来自http://www.gadm.org/
我想用一种颜色绘制中国的轮廓,同时在另一种颜色中显示全球海岸线.我这样做的第一次尝试如下:
import matplotlib.pyplot as plt
import cartopy.crs as ccrs
import cartopy.feature as feature
import cartopy.io.shapereader as shapereader
countries = shapereader.natural_earth(resolution='110m',
category='cultural',
name='admin_0_countries')
# Find the China boundary polygon.
for country in shapereader.Reader(countries).records():
if country.attributes['su_a3'] == 'CHN':
china = country.geometry
break
else:
raise ValueError('Unable to find the CHN boundary.')
plt.figure(figsize=(8, 4))
ax = plt.axes(projection=ccrs.PlateCarree())
ax.set_extent([50, 164, 5, 60], ccrs.PlateCarree())
ax.add_feature(feature.LAND)
ax.add_feature(feature.OCEAN)
ax.add_feature(feature.COASTLINE, linewidth=4)
ax.add_geometries([china], ccrs.Geodetic(), edgecolor='red',
facecolor='none')
plt.show()
Run Code Online (Sandbox Code Playgroud)
我把海岸线做得很厚,这样你就可以看到它们与国界重叠.
我的问题是:有没有办法去除国家大纲旁边的海岸线,这样我就没有两条线在视觉上相互交互?
注意:这个问题是通过电子邮件直接向我询问的,我选择在此发布我的回复,以便其他人可以从解决方案中学习/受益.
我有一个简化的城市地图,其中的街道为线串,地址为点。我需要找到从每个点到任何一条街线的最近路径。我有一个执行此操作的脚本,但由于嵌套了循环,因此它在多项式时间内运行。对于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上找到答案
谢谢你的建议!
这是我的第一篇文章,如果我违反任何礼仪规则,请告诉我.
我正在尝试在python中编写一个程序,其中包含形状文件(现在是国会区)并用圆圈"打包"它们.最终目标是获得圆的中心点和半径.我想以最少的圆圈覆盖最大区域.
到目前为止,我通过谷歌找到的所有资源都是关于标准几何对象(如正方形/圆形/三角形等)中的圆形包装......所以我的本能是尝试将这些形状转换为三角形或其他东西,然后应用一些现有的算法更简单的形状.
如果形状有很多小的凹边,这似乎是解决问题的正确途径吗?或者是否有一些我无法通过谷歌找到的算法,任何人都知道这已经做到了?总计算几何noob但愿意学习.
shapely ×10
python ×9
geos ×2
gis ×2
arrays ×1
cartopy ×1
circle-pack ×1
distance ×1
duplicates ×1
geometry ×1
geopandas ×1
geospatial ×1
maps ×1
matplotlib ×1
numpy ×1
pandas ×1
r-tree ×1