标签: shapely

从 PatchCollection 添加 matplotlib 颜色条

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

python matplotlib shapely

4
推荐指数
1
解决办法
3596
查看次数

在两个 numpy 的匀称对象数组上应用成对匀称函数

我有两个不同长度的数组。一个包含匀称的多边形,另一个包含匀称的点。我想为两个数组中的每个可能的元素组合运行 a_polygon.contains(a_point) 匀称的函数。

我正在看这篇文章,因为构建一个包含行中所有可能组合的两列矩阵可能是一个理想的中间步骤。但是当输入数据很大时,'cartersian(arrays)' 函数中的循环可能会影响性能。

我尝试广播其中一个数组,然后应用 shapely 函数:

Polygons_array[:,newaxis].contains(Points_array)
Run Code Online (Sandbox Code Playgroud)

但这当然是行不通的。我知道最近发布的 geopandas 库,但它不是我的 Canopy 安装的一个选项。

python arrays numpy shapely

4
推荐指数
1
解决办法
2127
查看次数

删除 Shapely 中的重复几何图形

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

python geometry duplicates shapely

4
推荐指数
1
解决办法
5472
查看次数

匀称的交叉点与匀称的关系 - 不准确?

我想知道是我想错了还是这是一个错误:

我有一个线串和一个多边形,我创建了线和多边形边界的交点

在此处输入图片说明

这些交点应该相交(至少接触)多边形的边界,对吗?

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)

python geos shapely

4
推荐指数
1
解决办法
1367
查看次数

在地图投影后不连续时修复匀称的多边形对象

这个演示程序(打算在IPython的笔记本电脑上运行,你需要matplotlibmpl_toolkits.basemappyproj,和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)

python maps geospatial shapely

4
推荐指数
1
解决办法
1627
查看次数

尝试在 docker 容器内整齐地安装 pip 时出现 OSError

找不到库 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 geos shapely docker-compose

4
推荐指数
2
解决办法
3096
查看次数

gis计算点和多边形/边界之间的距离

我想使用 python / 计算一个点和一个国家边界之间的距离shapely。它应该可以正常工作 point.distance(poly) 例如在这里演示Find Coordinate of Closest Point on Polygon Shapely但是使用geopandas我面临的问题是: 'GeoSeries' object has no attribute '_geom'

我对数据的处理有什么问题?我的边界数据集来自http://www.gadm.org/

'GeoSeries' 对象没有属性 '_geom'

python gis distance shapely geopandas

4
推荐指数
1
解决办法
6284
查看次数

Cartopy:删除国家边界的海岸线

我想用一种颜色绘制中国的轮廓,同时在另一种颜色中显示全球海岸线.我这样做的第一次尝试如下:

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)

结果

我把海岸线做得很厚,这样你就可以看到它们与国界重叠.

我的问题是:有没有办法去除国家大纲旁边的海岸线,这样我就没有两条线在视觉上相互交互?

注意:这个问题是通过电子邮件直接向我询问的,我选择在此发布我的回复,以便其他人可以从解决方案中学习/受益.

python shapely cartopy

4
推荐指数
1
解决办法
1996
查看次数

可以使用shapely和rtree在大数据集上找到最接近每个点的直线

我有一个简化的城市地图,其中的街道为线串,地址为点。我需要找到从每个点到任何一条街线的最近路径。我有一个执行此操作的脚本,但由于嵌套了循环,因此它在多项式时间内运行。对于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 gis r-tree pandas shapely

4
推荐指数
1
解决办法
2275
查看次数

包装不同大小的不规则多边形

这是我的第一篇文章,如果我违反任何礼仪规则,请告诉我.

我正在尝试在python中编写一个程序,其中包含形状文件(现在是国会区)并用圆圈"打包"它们.最终目标是获得圆的中心点和半径.我想以最少的圆圈覆盖最大区域.

到目前为止,我通过谷歌找到的所有资源都是关于标准几何对象(如正方形/圆形/三角形等)中的圆形包装......所以我的本能是尝试将这些形状转换为三角形或其他东西,然后应用一些现有的算法更简单的形状.

如果形状有很多小的凹边,这似乎是解决问题的正确途径吗?或者是否有一些我无法通过谷歌找到的算法,任何人都知道这已经做到了?总计算几何noob但愿意学习.

computational-geometry shapely circle-pack

4
推荐指数
1
解决办法
628
查看次数