标签: shapely

将一列类似 GeoJSON 的字符串转换为 GeoPandas 中的几何对象

我在 GeoPandas 数据框中有一列,其中包含类似 this one'{type=Point, coordinates=[37.55, 55.71]}'或 this 的字符串'{type=MultiPoint, coordinates=[[37.6, 55.4]]}'。它也可以是多边形或任何其他几何形状。然后就是嵌套列表形式的几个点。如何将其转换为普通的 GeoPandas 几何对象?

python geojson shapely geopandas

5
推荐指数
1
解决办法
6274
查看次数

考虑角度简化线串

客观的

从 2D 多边形(基于 CAD)创建简单的骨架线以用于 CAD 目的。应避免出现小线。

工作状态

  • 创建多边形的 Voronoi 图
  • 使用 DFS 识别 voronoi 顶点/边的分支
  • 使用 Shapely Line String (Ramer-Douglas-Peucker) 来简化线条

问题

Ramer-Douglas-Peucker 无法根据需要简化生产线。如果增加 RDP 容差,结果并不令人满意。目标应该是用尽可能少的线尽可能好地表示多边形。水平线段应该用水平线表示,而不是小角度的线。RDP 尝试仅考虑数据中给出的点。所需的结果应包含以前不属于分支的点(参见图像)。

示例图像(起点:中轴) 起点:中轴

示例图像(期望的结果) 期望的结果

我将点数据打包到:链接到数据

Shapely 简化的示例代码

import numpy as np
import matplotlib.pyplot as plt
from shapely.geometry import LineString

##########################
pathToFile = ""
RDP_Tolerance= 2
##########################


data = np.genfromtxt(pathToFile )

plt.figure()
plt.plot(data[:,0],data[:,1])
plt.scatter(data[:,0],data[:,1])
plt.axis('equal')
plt.show()

linestring = LineString(data)
lineStringSimplified = linestring.simplify(RDP_Tolerance)
simplifiedData = np.asarray(lineStringSimplified.coords)
plt.figure()
plt.plot(simplifiedData [:,0],simplifiedData [:,1])
plt.scatter(simplifiedData [:,0],simplifiedData [:,1]) …
Run Code Online (Sandbox Code Playgroud)

python algorithm shapely

5
推荐指数
0
解决办法
1223
查看次数

正确地将 shapely 安装到系统解释器中以避免段错误

现在我有以下代码,该代码因段错误而崩溃:

from shapely import geometry

print(geometry.Polygon([[0, 0], [0, 1], [1, 1], [1, 0]]))
Run Code Online (Sandbox Code Playgroud)

Process finished with exit code 139 (interrupted by signal 11: SIGSEGV)

我尝试重新安装 shapely,python3.7 -m pip install -U shapely --no-cache 但没有任何效果。我的环境是任何虚拟环境之外的 Ubuntu 18.04 和 Python 3.7。因此,有关将 shapely 安装到 anaconda 环境中的其他问题对我没有帮助。关于如何塑造优美的工作有什么建议吗?

python segmentation-fault shapely

5
推荐指数
1
解决办法
823
查看次数

匀称的线串.长度单位

我试图在 Shapely 中找到线串的长度(以米为单位),但似乎无法达到预期的结果。几乎可以肯定我在坐标系方面犯了一些错误,但我一直无法弄清楚。

这是单行的一些简化代码:

from shapely.geometry import LineString
line = LineString([(12875996.563923, -3940011.116702), (12872802.929335, -3937989.118438)])
line.crs = 'EPSG:3857'
line.length
Run Code Online (Sandbox Code Playgroud)

输出为3779.92m。不过根据我的测量,应该是~3159m。

这是基于检查以下地点的点(两个环岛的中心)的位置,然后在 Google 地球中测量它们之间的位置。

第 1 点: http://epsg.io/map#srs=3857&x=12875996.563923&y=-3940011.116702&z=14&layer=streets
第 2 点: http: //epsg.io/map#srs=3857&x=12872802.929468&y=-3937989.1185 38&z =17&层=街道

python spatial coordinate-systems shapely

5
推荐指数
1
解决办法
9073
查看次数

如何将 LineString 分割为线段

我的数据集由 a 组成LineString,我想过滤掉该 的各个线段LineString。更准确地说,是每一个街道段。

到目前为止,我已经从数据集中提取了各个点并将它们保存在单独的列表中。此外,我想再次收集这些点并从中创建单独的 LineStrings 以将它们存储到地理数据框中。数据具有以下形式:

LINESTRING (3275.284016199762 340555.8579582386, 3241.504528076811 340504.1348617533, 3245.415803206172 340501.457084205, 3280.414559049542 340552.7138220053, 3285.19053022
Run Code Online (Sandbox Code Playgroud)

我的问题是我必须LineString为每次迭代创建并显式保存一个单独的。谁能帮我这个?有更好的方法吗?

from shapely.geometry import Point, LineString

#Loop over LineString and gather Points
c=[]

for i in range(0,end):
    c.append(Point(route1.coords[i]))


iterator=len(c)
max=len(c)-1

#Loop to store LineStrings - got stuck here
for i in np.arange(0,iterator):
    if i<max:
        LineString([c[i], c[i+1]]).wkt

    else:
        break;

Run Code Online (Sandbox Code Playgroud)

输出应如下所示:

Linestring(Point A, Point B)  
Linestring(Point B, Point C)  
Linestring(Point C, Point D)  
...  
Linestring(Point Y, Point Z)
Run Code Online (Sandbox Code Playgroud)

python postgis shapely geopandas

5
推荐指数
1
解决办法
1万
查看次数

与多个多重多边形的形状相交,其中一定百分比的多重多边形相交?

我正在使用 Shapely 的多边形来获取人类生成的数据。要求多人围绕图像中的某些特征绘制多边形。因此,对于每个图像,我们有 nMultiPolygon个,其中 n 等于每个图像的参与者数量。

我可以绘制其中的每一个Multipolygon

fig, ax = plt.subplots()

for ii, multi_poly in enumerate(multi_polys):
    for poly in multi_poly.geoms:
        x,y = poly.exterior.xy
        plt.plot(x,y, c=colors[ii])
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

我们可以看到,在某些位置, 的Multipolygon重叠,而在其他位置则没有重叠。

我希望获得这些多边形的重叠或相交。这应该是微不足道的,因为我可以做类似的事情:

intersection = multi_a.intersection(multi_b) \
            .intersection(multi_c) \
            .intersection(multi_d) \
            .inters... 
Run Code Online (Sandbox Code Playgroud)

我可以在上一张图上绘制这个交集,我们看到:

在此输入图像描述

这看起来不错。Multipoloygon但是,此方法仅返回所有重叠的区域。有没有办法获得 75% 的多边形重叠的交点?或者50%重叠在哪里?

代码示例:以下虚拟数据给出了该图:

P1 = Polygon([(0, 0), (1, 0), (1, 1), (0, 1)])
P2 = Polygon([(2.5, 2), (3, 2), (3, 3), (2.5, 3)])
multi_a = MultiPolygon([P1, P2])

P1 = Polygon([(-1, -1), (-1, 2),(2, …
Run Code Online (Sandbox Code Playgroud)

python polygon shapely

5
推荐指数
1
解决办法
7535
查看次数

生成落在多边形或形状内的点网格的最快方法?

我在 python 中使用 shapely 并尝试在网格中生成均匀间隔的点,这些点在最快的 O(n) 时间内落在形状内。形状可以是任何闭合多边形,而不仅仅是正方形或圆形。我目前的做法是:

  1. 找到最小/最大 y 和 x 来构建一个矩形。
  2. 给定间距参数(分辨率)构建点网格
  3. 逐一验证这些点是否落在形状内。

有没有更快的方法来做到这一点?

# determine maximum edges
polygon = shape(geojson['features'][i]['geometry'])
latmin, lonmin, latmax, lonmax = polygon.bounds

# construct a rectangular mesh
points = []
for lat in np.arange(latmin, latmax, resolution):
    for lon in np.arange(lonmin, lonmax, resolution):
        points.append(Point((round(lat,4), round(lon,4))))

# validate if each point falls inside shape
valid_points.extend([i for i in points if polygon.contains(i)])
Run Code Online (Sandbox Code Playgroud)

示例形状和点

python polygon points coordinates shapely

5
推荐指数
1
解决办法
8751
查看次数

如何使用起点、长度和角度在 Shapely 中创建线条

我找到了这段代码,但它需要第一点和第二点来创建一条线。我怎样才能改变它,使它只适用于第一个点、线的长度和角度?

from shapely.geometry import LineString
from shapely.geometry import Point

p = Point(5,5)
c = p.buffer(3).boundary
l = LineString([(0,0), (10, 10)])
i = c.intersection(l)

print i.geoms[0].coords[0]
(2.8786796564403576, 2.8786796564403576)

print i.geoms[1].coords[0]
(7.121320343559642, 7.121320343559642)
Run Code Online (Sandbox Code Playgroud)

python geometry shapely

5
推荐指数
1
解决办法
5299
查看次数

Geopandas数据框指向多边形

我有一个由id和由2D点填充的几何列组成的geopandas数据框。我想将每个唯一ID的点连接起来以创建多边形,以便我的新数据框将具有多边形作为其几何形状。我的代码当前看起来像这样:

polygons = geopandas.GeoDataFrame() 
for i in id:
    group = df[df['id']== i]
    polygon = {'type': 'Polygon', 'coordinates': group['geometry']}
    polygon['poly'] = polygon
    polygons = geopandas.concat([polygon,polygons])
Run Code Online (Sandbox Code Playgroud)

它创建了一个多边形,但是当我分配新变量时,poly它说

ValueError: Length of values does not match length of index"
Run Code Online (Sandbox Code Playgroud)

这很有意义,因为它仍然只是坐标列表,而不是实际的多边形对象。有谁知道如何使它成为我可以添加到geopandas列上的实际多边形对象df
提前致谢 :)

python pandas shapely geopandas

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

Geopandas df至lat / lon列中的匀称点几何

我有一个geopandas df,其中有一列匀称的点对象。我想从形状良好的点对象中提取坐标(纬度/经度)以生成纬度和经度列。必须有一种简单的方法来执行此操作,但是我无法弄清楚。

我知道您可以像这样提取单个坐标:

lon = df.point_object[0].x
lat = df.point_object[0].y
Run Code Online (Sandbox Code Playgroud)

而且我可以创建一个对整个df都执行此操作的函数,但是我发现有一种更有效/更优雅的方法。

python gis latitude-longitude shapely geopandas

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