将 numpy 数组转换为 Shapely Points 的最有效方法是什么?

问题描述 投票:0回答:4

我有一个函数,可以将点网格输出为 x 和 y numpy 数组进行插值,但在插值之前,我想使用 Geopandas 与我的研究边界进行相交(否则我的插值点的一半会落入海洋中) 。

我正在生成这样的点:

import geopandas as gpd
import numpy as np
import matplotlib.pyplot as plt
from shapely.geometry import Point

x = np.linspace(0,100,100)
y = np.linspace(0,100,100)
x, y = np.meshgrid(x, y)
x, y = x.flatten(), y.flatten()


f, ax = plt.subplots()

plt.scatter(x, y)
plt.axis('equal')
plt.show()

是否有一种有效的方法将这些 numpy 数组转换为

shapely.Point([x, y])
以便将它们放置在 geopandas 地理数据框中?

这是我目前的方法:

interp_points = []
index = 0
y_list = yi.tolist()
for x in xi.tolist():
    interp_points.append(Point(x,y_list[index]))
    index += 1

但似乎转换为列表然后迭代可能不是提高性能的好方法,而且我有大约 160,000 点。

python pandas numpy shapely geopandas
4个回答
6
投票

没有内置方法可以使用

shapely
执行此操作,因此您需要自己迭代这些值。为此,这应该是一种相当有效的方法:

In [4]: from geopandas import GeoSeries

In [5]: s = GeoSeries(map(Point, zip(x, y)))

In [6]: s.head()
Out[6]: 
0                    POINT (0 0)
1     POINT (1.01010101010101 0)
2     POINT (2.02020202020202 0)
3     POINT (3.03030303030303 0)
4    POINT (4.040404040404041 0)
dtype: object

In [6]: %timeit GeoSeries(map(Point, zip(x, y)))
114 ms ± 8.45 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)

(或稍微替代

GeoSeries(list(zip(x, y))).map(Point)

请参阅此处的一些示例:http://geopandas.readthedocs.io/en/latest/gallery/create_geopandas_from_pandas.html

有一些(停滞的)工作可以将其直接包含在 geopandas 中:https://github.com/geopandas/geopandas/pull/75


2
投票

我认为这是一个好方法:

import numpy as np        
from shapely import geometry

points_np_array = np.random.rand(50,2)
polygon_1 = geometry.Polygon(np.squeeze(points_np_array))

0
投票

从 geopandas 版本 0.5.0(2019 年 4 月 25 日)开始,您可以使用

points_from_xy
来实现此目的:

# continuing from your example:
df = gpd.GeoDataFrame(geometry = gpd.points_from_xy(x, y))
df.plot()
plt.show()

(嵌入

GeoSeries
,即
gpd.GeoSeries(gpd.points_from_xy(x, y))
,效果同样好,但我想复制你的情节。)

GeoPandas 库中有一个示例,完整文档位于此处


0
投票
更好地使用这个列表理解:

[tuple(x) for x in arr.tolist()]
    
© www.soinside.com 2019 - 2024. All rights reserved.