标签: shapely

Geopandas 设置几何图形:MultiPolygon“等于 len 键和值”的 ValueError

我有 2 个带有几何列的地理数据框,我将一些几何图形从 1 个复制到另一个。

这对于多边形效果很好,但对于任何(有效)多多边形都会返回 ValueError。

请指教如何解决这个问题?我不知道是否/如何/为什么应该更改 MultiPolygon 以获得“相等的长度键和值”?

geodata01.loc[index, 'geometry'] = geodata02.loc[index, 'geometry']
Run Code Online (Sandbox Code Playgroud)

这对于多边形效果很好。只有使用 MultiPolygons 我才能得到:

ValueError 
if len(labels) != len(value):
--> 611      raise ValueError('Must have equal len keys and value '
    612      'when setting with an iterable')
Run Code Online (Sandbox Code Playgroud)

我也无法对缓冲或简化的 MultiPolygon 进行分配(MultiPolygon 是有效的,我可以绘制、缓冲、简化,但无法分配它):

geodata01.loc[index, 'geometry'] = geodata01.loc[index, 'geometry'].buffer(0)
#or
geodata01.loc[index, 'geometry'] = geodata01.loc[index, 'geometry'].simplify(tolerance=0)
Run Code Online (Sandbox Code Playgroud)

这会返回相同的 ValueError。

python pandas shapely geopandas

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

Geopandas:如何将列几何形状转换为字符串?

我有一个 geopandas 数据框

    geometry                                           idx
0   POLYGON ((-74.25559 40.91553, -74.24559 40.915...   0
1   POLYGON ((-74.25559 40.90553, -74.24559 40.905...   1
2   POLYGON ((-74.25559 40.89553, -74.24559 40.895...   2
3   POLYGON ((-74.25559 40.88553, -74.24559 40.885...   3
4   POLYGON ((-74.25559 40.87553, -74.24559 40.875...   4
Run Code Online (Sandbox Code Playgroud)

在哪里

gridDF['geometry'][0]
 <shapely.geometry.polygon.Polygon at 0x7fa4cc6ccc50>
Run Code Online (Sandbox Code Playgroud)

我想将列中的条目转换geometry为字符串。

python pandas shapely geopandas

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

如何将两个坐标列转换为一列 Shapely 点

我正在尝试对整个列执行操作,但出现类型错误,我想创建一个包含Shapely Point 的列:

crime_df = crime_df[crime_df['Latitude'].notna()]
crime_df = crime_df[crime_df['Longitude'].notna()]

crime_df['Longitude'] = crime_df['Longitude'].astype(float)
crime_df['Latitude'] = crime_df['Latitude'].astype(float)

print (crime_df['Longitude'])
print (crime_df['Latitude'])

crime_df['point'] = Point(crime_df['Longitude'], crime_df['Latitude'])
Run Code Online (Sandbox Code Playgroud)

输出:

18626    -87.647379
Name: Longitude, Length: 222, dtype: float64

18626    41.781100
Name: Latitude, Length: 222, dtype: float64

TypeError: cannot convert the series to <class 'float'>
Run Code Online (Sandbox Code Playgroud)

python point pandas shapely

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

如何在Python中从中心点创建坐标网格?

有没有一种方法可以从中心坐标中提取坐标网格(紫色点),例如每个坐标之间的距离为 100 米?

在此输入图像描述

例如输入纬度和经度中心坐标(红点):

lat = 40.8264859
lon = -3.6805897
Run Code Online (Sandbox Code Playgroud)

在一个函数中,该函数返回一个列表或数组的列表,其中包含相应的纬度、经度网格,彼此相距 100 米,以及距中心点的最大坐标数(在此图像情况下,该值将为2)。例如:

def get_grid_of_coordinates_from_center(lat, lon, meters_between_coor, coors_away_from_center):
    ...
    return list_of_lists
Run Code Online (Sandbox Code Playgroud)

python numpy python-3.x shapely pyproj

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

获取位于 Shapely 多边形内的所有格点

我需要找到多边形内部和多边形上的所有格点。

输入:

from shapely.geometry import Polygon, mapping
sh_polygon = Polygon(((0,0), (2,0), (2,2), (0,2)))
Run Code Online (Sandbox Code Playgroud)

输出:

(0, 0), (1, 0), (2, 0), (0, 1), (1, 1), (2, 1), (0, 2), (1, 2), (2, 2)
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

请建议是否有办法在使用或不使用 Shapely 的情况下获得预期结果。

我编写了这段代码,它给出了多边形内部的点,但它没有给出多边形上的点。还有更好的方法来做同样的事情:

from shapely.geometry import Polygon, Point

def get_random_point_in_polygon(poly):
    (minx, miny, maxx, maxy) = poly.bounds
    minx = int(minx)
    miny = int(miny)
    maxx = int(maxx)
    maxy = int(maxy)
    print("poly.bounds:", poly.bounds)
    a = []
    for x in range(minx, maxx+1):
        for y in range(miny, maxy+1):
            p = Point(x, y) …
Run Code Online (Sandbox Code Playgroud)

python mathematical-lattices shapely

5
推荐指数
2
解决办法
5224
查看次数

获取WKT多边形的中心

我正在使用 pandas,我获得的数据集有一个 WKT 格式的位置列。例如:

hospital.get_value(1,'WKT')

POLYGON ((-58.4932 -34.5810,-58.4925 -34.5815,-58.4924 -34.5817))
Run Code Online (Sandbox Code Playgroud)

在这个例子中,有更多的点,并且精度更高,但出于说明目的,我缩短了它。另外,我不知道它是 WKT 还是只是一个字符串。如何获得该多边形的中心以便将其用作坐标?提前致谢。

python polygon pandas wkt shapely

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

快速找到离点最近的多边形的方法

我有一个Shapely多边形列表和一个像这样的点:

from shapely.geometry import Point, Polygon

polygons = [Polygon(...), Polygon(...), ...]
point = Point(2.5, 5.7)
Run Code Online (Sandbox Code Playgroud)

我想在列表中找到最接近该点的多边形。我已经知道object.distance(other)返回两个几何形状之间的最小距离的函数,我想过计算循环中的所有距离以找到最近的多边形:

polygons = [Polygon(...), Polygon(...), ...]
point = Point(2.5, 5.7)
min_dist = 10000
closest_polygon = None

for polygon in polygons:
    dist = polygon.distance(point)
    if dist < min_dist:
        min_dist = dist
        closest_polygon = polygon
Run Code Online (Sandbox Code Playgroud)

我的问题是:有没有更有效的方法来做到这一点?

python polygon shapely

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

在 GeoDataFrame 中有超过 1 个几何列是不好的做法吗?

我正在尝试创建一个每行 2 个邮政编码的 GeoDataFrame,我想比较它们之间的距离。我列出了大约 220 个邮政编码的列表,并对它们运行了 itertools 组合以获取所有组合,然后将元组解压为两列

code_combo = list(itertools.combinations(df_with_all_zip_codes['code'], 2))
df_distance_ctr = pd.DataFrame(code_combo, columns=['first_code','second_code'])
Run Code Online (Sandbox Code Playgroud)

然后我做了一些标准的 Pandas 合并和列重命名,以将多边形/几何列从原始地理数据框中获取到这个新的,就在相应的邮政编码列旁边。问题是我似乎无法将多边形列读取为几何体,即使在 1.) 尝试将数据框转换为地理数据框之后 - AttributeError: No geometry data set yet , 2.) 将 wkt.loads 应用到几何列 - AttributeError: 'MultiPolygon' object has no attribute 'encode' 。 我试图寻找一种将系列转换为 geoseries 的方法,但在 SO 和文档上都找不到任何内容。谁能指出我可能出错的地方?

gis polygon series shapely geopandas

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

如何在Shapely中获取LineString的端点

Linestring1 = LINESTRING (51.2176008 4.4177154, 51.21758 4.4178548, **51.2175729 4.4179023**, *51.21745162000732 4.41871738126533*)
Linestring2 = LINESTRING (*51.21745162000732 4.41871738126533*, **51.2174025 4.4190475**, 51.217338 4.4194807, 51.2172511 4.4200562, 51.2172411 4.4201077, 51.2172246 4.4201654, 51.2172067 4.420205, 51.2171806 4.4202355, 51.2171074 4.4202929, 51.2170063 4.4203409, 51.2169564 4.4203641, 51.2168076 4.4204243, 51.2166588 4.4204833, 51.2159018 4.420431, 51.2154117 4.4203843)
Run Code Online (Sandbox Code Playgroud)

考虑到这两个线串是从一个更大的线串中剪下来的,如何得到一个线串的端点?

- 点(51.21745162000732 4.41871738126533)被移除

- 线串 1 的新最后一个元素 = “ 51.2175729 4.4179023

- 线串 2 的新第一个元素 = “ 51.2174025 4.4190475

简而言之,我想获得第一部分 (linestring1) 的新最后一个值和第二部分 (linestring2) 的新第一个值,但没有切割它们的点。我怎样才能使这项工作?

python shapely

5
推荐指数
2
解决办法
3321
查看次数

匀称的线串.长度单位

我试图在 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
查看次数