我在 GeoPandas 数据框中有一列,其中包含类似 this one'{type=Point, coordinates=[37.55, 55.71]}'或 this 的字符串'{type=MultiPoint, coordinates=[[37.6, 55.4]]}'。它也可以是多边形或任何其他几何形状。然后就是嵌套列表形式的几个点。如何将其转换为普通的 GeoPandas 几何对象?
客观的
从 2D 多边形(基于 CAD)创建简单的骨架线以用于 CAD 目的。应避免出现小线。
工作状态
问题
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) 现在我有以下代码,该代码因段错误而崩溃:
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 环境中的其他问题对我没有帮助。关于如何塑造优美的工作有什么建议吗?
我试图在 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&层=街道
我的数据集由 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) 我正在使用 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 中使用 shapely 并尝试在网格中生成均匀间隔的点,这些点在最快的 O(n) 时间内落在形状内。形状可以是任何闭合多边形,而不仅仅是正方形或圆形。我目前的做法是:
有没有更快的方法来做到这一点?
# 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)
我找到了这段代码,但它需要第一点和第二点来创建一条线。我怎样才能改变它,使它只适用于第一个点、线的长度和角度?
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) 我有一个由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?
提前致谢 :)
我有一个geopandas df,其中有一列匀称的点对象。我想从形状良好的点对象中提取坐标(纬度/经度)以生成纬度和经度列。必须有一种简单的方法来执行此操作,但是我无法弄清楚。
我知道您可以像这样提取单个坐标:
lon = df.point_object[0].x
lat = df.point_object[0].y
Run Code Online (Sandbox Code Playgroud)
而且我可以创建一个对整个df都执行此操作的函数,但是我发现有一种更有效/更优雅的方法。