标签: shapely

如何在Shapely中找到hausdorff_distance()的点?

Shapelyhausdorff_distance()函数返回单个(标量)值。

有没有办法获得两个几何上适合这个距离的/一对点?
类似于我们nearest_points()相对于 的方式distance()

python shapely

7
推荐指数
0
解决办法
671
查看次数

如何在 Shapely 中对多边形进行三角剖分?

如何在 Shapely 中对多边形进行三角剖分?Shapely 实际上提供了triangulate()函数,但它仅将多边形的顶点三角化为点集。对于凸多边形,解决方案是相同的,但对于非凸多边形,您会得到额外的三角形。我尝试删除多边形外部的所有三角形,但有时三角形可以跨越多边形边界(见下图)。我想我也可以删除这些,然后从多边形中减去剩余的三角形,并递归地对该差异的分量进行三角测量。但有没有更简单的方法呢?

多边形三角剖分不是顶点三角剖分的子集的示例(多边形边界更宽且灰色,三角形边界更暗且更细): 多边形三角剖分不是顶点三角剖分的子集的示例(多边形边界更宽且灰色,三角形边界更暗且更细) 生成此几何图形的代码:

from shapely.geometry import Polygon
from shapely.ops import triangulate

polygon = Polygon( [ (0,0), (0,3), (5,3), (2,4), (6,4), (6,0) ])
delauney=triangulate(polygon)
Run Code Online (Sandbox Code Playgroud)

python triangulation shapely

7
推荐指数
1
解决办法
6172
查看次数

有效地将点与几何体(多边形中的点)匹配,以获取点和多边形的大量集合

这里有很多关于有效匹配多边形中的点的问题(示例:HereHere)。这些中感兴趣的主要变量是大量的点 N 和多边形顶点的数量 V。这些都很好且有用,但我正在查看大量的点 N 和多边形 G。这也意味着我的输出将有所不同(我主要看到的输出由落在多边形内的点组成,但在这里我想知道附加到点的多边形)。

\n

我有一个包含大量多边形(数十万)的形状文件。多边形可以接触,但它们之间几乎没有重叠(内部的任何重叠都可能是错误的结果 - 想想人口普查区块组)。我还有一个包含点(数百万)的 csv,我想根据点所在的多边形(如果有)对这些点进行分类。有些可能不会落入多边形(继续我的示例,想想海洋上的点)。下面我设置了一个玩具示例来研究这个问题。

\n

设置:

\n
import numpy as np\nfrom shapely.geometry import shape, MultiPolygon, Point, Polygon\nimport geopandas as gpd\nimport pandas as pd\nimport matplotlib.pyplot as plt\nfrom shapely.strtree import STRtree\n\n#setup:\nnp.random.seed(12345)\n\n# shape gridsize:\ngridsize=10\navgpointspergridspace=10 #point density\n
Run Code Online (Sandbox Code Playgroud)\n

创建多边形的地理数据框(模拟使用 geopandas 导入的 shapefile):

\n
# creating a geodataframe (shapefile imported via geopandas):\ngarr=np.empty((gridsize,gridsize),dtype=object)\nfor i in range(gridsize):\n    for j in range(gridsize):\n        garr[i,j]=Point(i,j)\n\n# polygons:\npoly_list=[]\nfor i in range(gridsize-1):\n    for j in range(gridsize-1):\n        temp_points=[garr[i,j],garr[i,j+1],garr[i+1,j+1],garr[i+1,j],garr[i,j]]\n        poly=Polygon([[p.x,p.y] for p in …
Run Code Online (Sandbox Code Playgroud)

python shapely geopandas

7
推荐指数
1
解决办法
1589
查看次数

多边形在一个以上的点接触到匀称

我有一个Python中的形状多边形列表.要使用.touches()方法找出哪种多边形触摸很容易.但是,只有当多边形共享多个点(换句话说,共享边框)时,我才需要返回true .让我说明一下:

In [1]: from shapely.geometry import Polygon
In [2]: polygons = [Polygon([(0,0),(0,1),(1,1),(1,0)]), Polygon([(1,0),(1,1),(2,1),(2,0)]), Polygon([(2,1),(2,2),(3,2),(3,1)])]

In [3]: polygons[0].touches(polygons[1])
Out[3]: True

In [4]: polygons[0].touches(polygons[2])
Out[4]: False

In [5]: polygons[1].touches(polygons[2])
Out[5]: True
Run Code Online (Sandbox Code Playgroud)

在这种情况下,多边形0和1共享两个点(整个边界).多边形1和2仅共享一个点.我正在寻找的是一个在上面的例子中给我真,假,假的功能,或者只是返回触摸点数的东西,然后我可以自己完成其余的逻辑.

当然,任何不涉及手动迭代所有点的解决方案都是最佳的 - 如果我需要这样做,它会破坏使用形状的目的:-)

提前致谢!

python polygon shapely

6
推荐指数
2
解决办法
2860
查看次数

测试几何项是否在python列表中相交

我有一个数据列表如下:

from shapely.geometry import box

data = [box(1,2,3,4), box(5,6,7,8), box(1,2,3,4)]
codes = ['A','B','C']
Run Code Online (Sandbox Code Playgroud)

列表"数据"包含以下元素:

A = box(1,2,3,4)
B = box(5,6,7,8)
C = box(1,2,3,4)
Run Code Online (Sandbox Code Playgroud)

我必须检查元素是否与任何其他元素相交.如果相交,他们应该放入一个元组; 如果不相交,他们应该放入不同的元组.预期的结果是:

result = [(A,C), (B)]
Run Code Online (Sandbox Code Playgroud)

怎么做?

我试过它:

results = []
for p,c in zip(data,codes):
    for x in data:
        if p.intersects(x): ##.intersects return true if they overlap else false
            results.append(c)
print results
Run Code Online (Sandbox Code Playgroud)

python shapely

6
推荐指数
1
解决办法
939
查看次数

如何在具有多边形的多边形Python中的多边形中打洞

在python中,我有一个普通的“外部”多边形和一个“内部”多边形列表。我想使用此列表在多边形中打孔。

from shapely.geometry import Polygon

# polygon with 1 hole in the middle
p = Polygon(((0,0),(10,0),(10,10),(0,10)), (((4,4),(4,6),(6,6),(6,4)), ))
print p.wkt
# POLYGON ((0 0, 10 0, 10 10, 0 10, 0 0), (4 4, 4 6, 6 6, 6 4, 4 4))

# other constructor, does not work (no hole) :
outer = Polygon(((0,0),(10,0),(10,10),(0,10),(0,0)))
inners = (Polygon(((4,4),(4,6),(6,6),(6,4),(4,4))), )
p = Polygon(outer, inners)
print p.wkt
# POLYGON ((0 0, 10 0, 10 10, 0 10, 0 0))
Run Code Online (Sandbox Code Playgroud)

如何根据给定的外部和内部构造p?

python polygon shapely

6
推荐指数
1
解决办法
1612
查看次数

匀称的 .contains() 方法但包括边界?

我正在使用 Shapely 多边形,我需要一种方法来删除较大多边形内的所有较小多边形。我尝试使用.contains()Shapely 提供的方法,但True如果较小的多边形不完全位于较大的多边形内,则该方法不会返回。

基本上,我想要一个方法.contains(),但是True如果多边形位于图片上的外部多边形的边界上,它会返回

这里.

以下是以 wkt 格式呈现的图片中的多边形:

绿色一:

POLYGON Z ((14.4265764858233823 45.3396418051734784 0.0000000000000000, 14.4267228266679606 45.3395430970275015 0.0000000000000000, 14.4266753563381904 45.3394727193694536 0.0000000000000000, 14.4265290154936121 45.3395714275154376 0.0000000000000000, 14.4265764858233823 45.3396418051734784 0.0000000000000000))`  
Run Code Online (Sandbox Code Playgroud)

红色一:

POLYGON Z ((14.4265450394689161 45.3395951840357725 0.0000000000000000, 14.4265695507109317 45.3395786509942837 0.0000000000000000, 14.4265802185605700 45.3395944667317679 0.0000000000000000, 14.4265982245953417 45.3395823215079616 0.0000000000000000, 14.4265715327703994 45.3395427492501426 0.0000000000000000, 14.4265290154936121 45.3395714275154376 0.0000000000000000, 14.4265450394689161 45.3395951840357725 0.0000000000000000))
Run Code Online (Sandbox Code Playgroud)

我也尝试使用该.intersects()方法,但它返回True给定多边形之外的多边形,这些多边形具有一些我不想要的公共边界。

我希望您了解我的需求,如果有人知道解决方案,我将不胜感激。

python shapely

6
推荐指数
1
解决办法
4017
查看次数

在另一条直线的一点画固定长度的垂线

我有两个点 A (10,20) 和 B (15,30)。这些点生成一条线 AB。我需要在 B 点上用 Python 绘制一条长度为 6(每个方向 3 个单位)的垂直线 CD。

我已经使用以下代码获得了 AB 行的一些属性:

from scipy import stats
x = [10,15]
y = [20,30]
slope, intercept, r_value, p_value, std_err = stats.linregress(x,y)
Run Code Online (Sandbox Code Playgroud)

如何计算 C 和 D 的位置。我需要它们的 X 和 Y 值。 在此处输入图片说明

C 和 D 的值将用于使用 Shapely 库完成另一个目标。

python geometry shapely

6
推荐指数
2
解决办法
6841
查看次数

Pyrosm 加载节点和边 - 输入必须是有效的几何对象

大家早上好,

我正在尝试使用 Pyrosm 库的文档加载 .pbf 文件。

我的代码如下。

import pyrosm

# Get filepath to test PBF dataset
fp = pyrosm.get_data("wisconsin")

# Initialize the OSM object 
osm = pyrosm.OSM(fp)

nodes, edges = osm.get_network(nodes=True)

print(f"Nodes {nodes} and edges {edges}")
Run Code Online (Sandbox Code Playgroud)

我收到以下错误,该错误似乎来自库本身。

类型错误:输入必须是有效的几何对象:MULTILINESTRING ((-89.5 44.5, -89.5 44.5), (-89.5 44.5, -89.5 44.5), (-89.5 44.5, -89.5 44.5), (-89.5 44.5, -89.5 44.5) , (-89.5 44.5, -89.5 44.5))

以前有人遇到过这个问题吗?

多谢

python graph openstreetmap shapely

6
推荐指数
0
解决办法
443
查看次数

为什么在尝试读取 geopanda 包含的数据集中的文件时会出现错误?

我刚刚在我的新笔记本电脑中安装了 Anaconda,并创建了一个安装了 geopandas 的环境。我尝试通过以下代码上传geopandas附带的世界地图:

import geopandas as gpd
world = gpd.read_file(gpd.datasets.get_path('naturalearth_lowres'))
Run Code Online (Sandbox Code Playgroud)

但我收到以下错误消息:

File ~/anaconda3/envs/mapas_test/lib/python3.8/site-packages/shapely/geometry/base.py:854, in BaseMultipartGeometry.__array_interface__(self)
    851 @property
    852 def __array_interface__(self):
    853     """Provide the Numpy array protocol."""
--> 854     raise NotImplementedError("Multi-part geometries do not themselves "
    855                               "provide the array interface")

NotImplementedError: Multi-part geometries do not themselves provide the array interface
Run Code Online (Sandbox Code Playgroud)

由于我的旧笔记本电脑上从未出现过此错误,我猜这与安装过程中的某些问题有关,但我可能是错的。以下是有关安装的技术细节。

操作系统:Ubuntu 22.04.1

Python版本:3.9.12

康达版本4.13.0

geopandas 版本 0.9.0

匀称版本1.7.1

不确定它是否相关,但环境中安装的唯一其他软件包是 jupyter 版本 1.0.0

python shapely conda geopandas

6
推荐指数
1
解决办法
3657
查看次数