我想测试变量是否是任何类型的 Shapely 几何体。该变量也可能是列表或日期时间。我可以分别测试各种 Shapely 几何形状,例如:
if type(var) in [shapely.geometry.linestring.LineString, shapely.geometry.point.Point, ...]:
print(True)
Run Code Online (Sandbox Code Playgroud)
但是有没有类似is_shapely()函数的东西呢?
我正在努力确定两个3D物体(三角形面)之间的关系(边界/内部交叉点)并且在形状上偶然发现,我感兴趣的是使用它而不是实现我自己的点/线段/光线/三角形交叉函数.
但是,我遇到了以下问题:
>>> from shapely.geometry import Polygon
>>> poly = Polygon([(0,1,1),(1,-1,1),(-1,-1,1)])
>>> poly2 = Polygon([(0,1,0),(1,-1,0),(-1,-1,0)])
>>> poly.intersects(poly2)
True
>>> poly.equals(poly2)
True
Run Code Online (Sandbox Code Playgroud)
我似乎遇到的问题是两个多边形在它们的2D正交投影中是相同的(相同的三角形),但是在不同的平面中(一个在Z = 1,另一个在Z = 0),但是形状正在说它们是平等和相交.
是否有一些魔法我缺少在三个维度上进行塑造思考?我一直在谷歌搜索,但到目前为止我看到的每个例子都只是在两个方面.
我想将一长串纬度/经度坐标转换为它们所属的美国州(或县).考虑到我具有状态几何,一种可能的解决方案是针对所有状态检查每个点.
for point in points:
for state in states:
if point.within(state['shape']):
print state.name
Run Code Online (Sandbox Code Playgroud)
有没有更优化的方法来做到这一点,可能在O(1)?
我需要绘制一个不连贯的圆的列表,这些圆是我为其他目的以匀称的方式创建的。
我试图完全按照http://toblerity.org/shapely/manual.html#cascading-unions中的示例显示(见代码),但只有当圆圈重叠并且整体连接时才有效(这不是在我的情况下)。正如您可以通过替换该行看到的
polygons = [Point(i, 0).buffer(0.7) for i in range(5)]
Run Code Online (Sandbox Code Playgroud)
和
polygons = [Point(i, 0).buffer(0.7) for i in (0,4)]
Run Code Online (Sandbox Code Playgroud)
与和休息AssertionError的事情不是由笛卡尔是一个多边形(或matplotlib失败assert vertices.ndim == 2,如果一个评论了笛卡尔断言作为测试)
查看matplotlib.path.Path的文档,似乎可以使用 MOVETO 来实现此目标,但 shapely 似乎不支持它。这样对吗?我有哪些解决方法?
我正在尝试解析众所周知的二进制,这是地理信息系统(GIS)中使用的几何对象的二进制编码。我正在使用ESRI 的此规范(与 esri 的结果相同)。我有来自Osmosis的输入数据,这是一个解析 OpenStreetMap 数据的工具,特别是pgsimp-dump 格式,它给出了二进制文件的十六进制表示。
ESRI 文档说 a 应该只有 21 个字节Point,字节顺序为 1 个字节,typeid 为 uint32 为 4 个字节,double x 为 8 个字节,double y 为 8 个字节。
渗透的一个示例是这个(十六进制)示例:0101000020E6100000DB81DF2B5F7822C0DFBB7262B4744A40,其长度为 25 个字节。
Shapely是一个解析 WKB(等)的 python 程序,它基于流行的 C 库GEOS 能够解析这个字符串:
>>> import shapely.wkb
>>> shapely.wkb.loads("0101000020E6100000DB81DF2B5F7822C0DFBB7262B4744A40", hex=True)
<shapely.geometry.point.Point object at 0x7f221f2581d0>
Run Code Online (Sandbox Code Playgroud)
当我要求 Shapely 解析然后转换为 WKB 时,我得到 21 个字节。
>>> shapely.wkb.loads("0101000020E6100000DB81DF2B5F7822C0DFBB7262B4744A40", hex=True).wkb.encode("hex").upper()
'0101000000DB81DF2B5F7822C0DFBB7262B4744A40'
Run Code Online (Sandbox Code Playgroud)
区别在于中间的 4 个字节,对于 typeif=d 来说,在 …
在我的带有Python 3.4.3的Anaconda 2.2 64位中,以下行很好用:
import shapely
Run Code Online (Sandbox Code Playgroud)
但是以下行:
from shapely.geometry.polygon import Polygon
Run Code Online (Sandbox Code Playgroud)
返回以下错误:
OSError: [WinError 126] The specified module could not be found
Run Code Online (Sandbox Code Playgroud)
我错过了什么?
编辑
我试过iNotebook,idle.exe和Eclipse.他们都使用Anaconda(我的计算机上唯一的Python安装),他们都显示相同的错误.
如果我输入from shapely.geometry import PolygonEclipse,那么我点击Polygon,然后我按下F3,Eclipse可以打开模块C:\Anaconda3\Lib\site-packages\shapely\geometry\polygon.py.所以Eclipse能够找到它,但执行失败了.
编辑2
我只是在具有类似配置的另一台计算机上尝试了相同的导入并且它可以工 两台计算机之间的"唯一"区别是,一台安装了Windows 7(它可以运行),一台安装了Windows 8(它没有).
我按照相同的旧清单在两台计算机上安装了Anaconda和一些软件包.使用Windows 8的计算机可以从Eclipse中查看该程序包,但无法导入它.
我在使用时遇到此错误cascaded_union(我也尝试过unary_union产生相同的错误):
ValueError:No可以从null值创建Shapely几何体
我已经验证我的多边形是有效的.最初polyB无效,但使用时将其转换为有效多边形buffer(0).
对我做错了什么的想法?这是我的代码:
ValueError: No Shapely geometry can be created from null value
Run Code Online (Sandbox Code Playgroud)
真正
真正
from shapely.geometry import Polygon
from shapely.ops import cascaded_union
def combineBorders(a, b):
polyA = Polygon(a)
polyB = Polygon(b)
pols = [polyA, polyB]
for p in pols:
if p.is_valid == False:
p = p.buffer(0)
print(p.is_valid)
Run Code Online (Sandbox Code Playgroud)
以下是 polyA,polyB和pols值的链接(确认它们有效后).我的Ubuntu 14.04服务器上安装了以下版本:
有什么想法吗?我尝试卸载 Shapely 并使用 PIP 安装我有 Anaconda 并安装 Fiona 很好,Shapely 看起来很好。简单代码:
import fiona
import shapely
dirVar = "C:\\Users\\me\\Desktop\\geocode\\"
with fiona.open(dirVar + "Regions.shp") as fiona_collection:
shapefile_record = fiona_collection.next()
shape = shapely.geometry.asShape(shapefile_record['geometry']) #GET ERROR HERE
point = shapely.geometry.Point(32.398516, -39.754028) # longitude, latitude
if shape.contains(point):
print "Found shape for point."
Run Code Online (Sandbox Code Playgroud)
属性错误:“模块”对象没有属性“几何”
当我从 Wing IDE 查看 shapely 的方法时,我只看到:
ctypes_declarations
ftools
geos
Run Code Online (Sandbox Code Playgroud)
我想如果安装正确我应该看到几何图形?
有什么想法吗?
要从列表中删除重复的列表,Python 中有几种不错的方法 -例如:
a = [[ 9.1514622, 47.1166004 ], [ 9.1513045, 47.1164599 ], [ 9.1516278, 47.1163001 ], [ 9.1517832, 47.1164408 ], [ 9.1514622, 47.1166004 ] ]
print len(a) # 5
b_set = set(map(tuple,a))
b = map(list,b_set)
print len(b) # 4
Run Code Online (Sandbox Code Playgroud)
但不幸的是,我不得不将我的列表转换为Shapely Polygon对象,我需要在其中简化几何图形并执行一些其他地理功能。
from shapely.geometry import Polygon
a = [[[ 9.1514622, 47.1166004 ], [ 9.1513045, 47.1164599 ], [ 9.1516278, 47.1163001 ], [ 9.1517832, 47.1164408 ], [ 9.1514622, 47.1166004 ] ] ]
polys = [Polygon(item) for item in …Run Code Online (Sandbox Code Playgroud) 我有一个显示约 25 个位置的地理数据框,表示为点几何。我试图想出一个脚本,通过每个点,标识最近的位置并返回最近位置的名称和距离。
如果我使用 shapely.ops 库中的nearest_points(geom1, geom2) 有不同的地理数据框,我可以轻松地做到这一点。然而,我所有的位置都存储在一个地理数据框中。我正在尝试循环,这就是我遇到麻烦的地方
这是我的示例文件:
geofile=gpd.GeoDataFrame([[0,'location A',Point(55,55)],[1,'location B',Point(66,66)],[2, 'Location C' ,Point(99,99)],[3, 'Location D' ,Point(11,11)]],columns=['ID','Location','geometry'])
Run Code Online (Sandbox Code Playgroud)
这是我创建的循环无济于事。
for index, row in geofile.iterrows():
nearest_geoms=nearest_points(row, geofile)
print('location:' + nearest_geoms[0])
print('nearest:' + nearest_geoms[1])
print('-------')
Run Code Online (Sandbox Code Playgroud)
我收到此错误:
AttributeError: 'Series' object has no attribute '_geom'
Run Code Online (Sandbox Code Playgroud)
但是我认为我的问题超出了错误原因我必须排除我正在循环的行,因为它是那个位置,它将自动返回为最近的位置。
我对一个位置的最终结果如下:
([0,'location A','location B', '5 miles', Point(55,55)], columns=['ID','Location','Nearest', 'Distance',geometry'])
Run Code Online (Sandbox Code Playgroud) shapely ×10
python ×9
geospatial ×2
gis ×2
polygon ×2
anaconda ×1
descartes ×1
geometry ×1
geopandas ×1
geos ×1
installation ×1
intersection ×1
matplotlib ×1