当我尝试在以下输入上使用 shapely.wkt.loads 时,我收到标题中的错误:
POLYGON((-93.577695846689437 40.813390731817726,-93.577674865779628 40.813444137603014,-93.577722549304582 40.8136196133706,-93.577945709640048 40.814004897950532,-93.5781135556297 40.814165115070466,-93.578243255589527 40.814229965262996,-93.578363418973865 40.814268111930119,-93.578405380213241 40.814252853305611,-93.578418731892242 40.814207077283442,-93.578376770009427 40.81411170971851,-93.578311920291867 40.814050674367543,-93.578300476322624 40.814008712491074,-93.578235626128318 40.813978195044577,-93.5779953002333 40.813646316512269,-93.577934265283389 40.813581466662242,-93.577924728143131 40.813535690301279,-93.577777862415886 40.813383102422016,-93.577695846689437 40.81339073181772))
Run Code Online (Sandbox Code Playgroud)
它采用 WKT 格式,省去了您滚动浏览所有内容的麻烦。这是我正在阅读的大约 100 个多边形之一,也是唯一一个抛出此错误的多边形。需要明确的是,当我打电话时:
p = loads('POLYGON((-93.577695846689437 40.813390731817726,-93.577674865779628 40.813444137603014,-93.577722549304582 40.8136196133706,-93.577945709640048 40.814004897950532,-93.5781135556297 40.814165115070466,-93.578243255589527 40.814229965262996,-93.578363418973865 40.814268111930119,-93.578405380213241 40.814252853305611,-93.578418731892242 40.814207077283442,-93.578376770009427 40.81411170971851,-93.578311920291867 40.814050674367543,-93.578300476322624 40.814008712491074,-93.578235626128318 40.813978195044577,-93.5779953002333 40.813646316512269,-93.577934265283389 40.813581466662242,-93.577924728143131 40.813535690301279,-93.577777862415886 40.813383102422016,-93.577695846689437 40.81339073181772))')
Run Code Online (Sandbox Code Playgroud)
我收到错误:shapely.geos.ReadingError: Could not create geometry because of errors while reading input.
我什至费尽心思将其解析为常规的 shapely.geometry.Polygon 格式。然后,它工作正常。但我不想让代码因烦人的字符串解析(以及丑陋的 try/ except)而变得混乱。当然,shapely/wky.py 文件绝对没有告诉我任何信息......如果有人知道发生了什么/如何修复它,我将不胜感激。谢谢!
我在 Shapely 中有一个 Polygon 和一个 MultiLineString。我想扩展未到达多边形边界的 LineString 段,以便它确实到达多边形边界。如果它延伸过去也没关系,因为之后我可以轻松地将它夹到边界上。
理想情况下,它会以相同的角度继续,但我想这比直接将其延伸到边界要困难得多。
有人对我如何做到这一点有任何建议吗?
我使用以下代码生成了几何图形(作为我实际需要执行的操作的简化示例):
import shapely
from shapely.geometry import *
Line=MultiLineString([((3,0),(3,5)),((3,5),(7,9.5))])
Box=Polygon([(0,0),(0,10),(10,10),(10,0)])
Run Code Online (Sandbox Code Playgroud)
我有一组Polygon对象,需要以可重复的方式迭代它们的每个边缘。我首选的方法是从最近点到边界框左下角的逆时针方向。
我可以通过以下方式确保多边形点是逆时针的:
polygon = shapely.geometry.polygon.orient(polygon)
Run Code Online (Sandbox Code Playgroud)
我可以使用以下方法找到我想要的起点:
polygon = shapely.geometry.Polygon(...)
lower_left = shapely.geometry.Point(bbox[:2])
nearest_pt = min(self.polygon.exterior.coords,
key=lambda x: shapely.geometry.Point(x).distance(lower_left))
Run Code Online (Sandbox Code Playgroud)
我的问题是如何使LinearRing对象Polygon从那个角开始?
我需要找到多边形内部和多边形上的所有格点。
输入:
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) 我正在使用 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 还是只是一个字符串。如何获得该多边形的中心以便将其用作坐标?提前致谢。
上次我使用 shapely 时,我真的有这种美妙的导入和飞行的感觉。然而最近,我在这个模块中遇到了一个相当不直观的行为,因为我试图在 3D 空间中找到线段和三角形之间的交点。让我们定义一个线段和一个三角形,如下所示:
l = LineString([[1,0.5,0.5],[3,0.5,0.5]])
p = Polygon([[1.2,0.0,0.],[2.2,1.0,0.],[2.8,0.5,1.]])
Run Code Online (Sandbox Code Playgroud)
为了得到它们的交点,我使用了l.intersection(p),并期望有一个点,即POINT Z (POINT Z (2 0.5 0.25))。如下图蓝点所示:
相反,我得到的是LINESTRING Z (1.7 0.5 0.25, 2.8 0.5 1)- 下面的红线 - 坦率地说,我对它应该代表什么感到非常困惑。

奇怪的是,当多边形/三角形位于 xz 平面并与线段正交时,该函数的行为与预期一致。然而,当三角形“倾斜”时,它会返回一条线。这暂时让我相信它返回了直线和三角形边界框之间的交点。上面的红线证明事实并非如此。
因此,解决这个问题的方法是阅读这个非常有启发性的网页,并调整他们的C++代码以处理形状良好的对象。该intersection方法非常适合检查直线是否穿过多边形,并且下面的函数可以找到感兴趣的点。
def intersect3D_SegmentPlane(Segment, Plane):
# Points in Segment: Pn Points in Plane: Qn
P0, P1 = np.array(Segment.coords)
Q0, Q1, Q2 = np.array(Plane.exterior)[:-1]
# vectors in Plane
q1 = Q1 - Q0
q2 = Q2 …Run Code Online (Sandbox Code Playgroud) 我有一个包含一列 shapely.polygons 的 GeoDataFrame。其中一些是不同的,一些则不是:
In [1]: gdf
Out[2]:
geometry
1 POLYGON ((1 1, 1 2, 2 2, 2 1, 1 1))
2 POLYGON ((1 3, 1 4, 2 4, 2 3, 1 3))
3 POLYGON ((1 1, 1 2, 2 2, 2 1, 1 1))
4 POLYGON ((3 1, 3 2, 4 2, 4 1, 3 1))
5 POLYGON ((1 3, 1 4, 2 4, 2 3, 1 3))
Run Code Online (Sandbox Code Playgroud)
我只需要找到不同的(不重叠的)多边形:
In [1]: gdf_distinct
Out[2]:
geometry
1 POLYGON ((1 1, 1 …Run Code Online (Sandbox Code Playgroud) 我正在操作 GIS 数据并将geopandas其存储在各种Django模型中。 在引擎盖下geopandas使用,而没有。 shapelyDjango
这是一些代码:
import geopandas as gpd
from django.contrib.gis.db import models
class MyModel(models.Model):
geometry = models.PolygonField()
name = models.CharField(max_length=255, null=False, unique=True)
some_property = models.IntegerField()
gdf = gpd.read_file("some_data.geojson")
# ...do some stuff w/ gdf...
for data in gdf.to_dict("records"):
name = data.pop("name")
MyModel.objects.create_or_update(
name=name,
defaults=data,
)
Run Code Online (Sandbox Code Playgroud)
上面的代码将会失败,并出现以下错误:
类型错误:无法使用类型值设置 MyModel SpatialProxy (POLYGON):<class 'shapely.geometry.polygon.Polygon'>
除非我添加一些讨厌的代码,例如:
from django.contrib.gis.geos import fromstr, Polygon
data["geometry"] = Polygon(fromstr(str(data["geometry"])))
Run Code Online (Sandbox Code Playgroud)
有没有办法避免这种情况并直接映射 from shapelyto Django?
编辑:
以下是一些值:
>> data["geometry"] …Run Code Online (Sandbox Code Playgroud) 我正在尝试创建一个每行 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 和文档上都找不到任何内容。谁能指出我可能出错的地方?
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) 的新第一个值,但没有切割它们的点。我怎样才能使这项工作?