基于python shapely的几何集合操作

前言

shapely是基于笛卡尔坐标的几何对象操作和分析Python库。底层基于GEOS和JTS库。shapely无法读取和写数据文件,但可以基于应用广泛的一些格式和协议进行序列化(serialize)和去序列化(deserialize)操作。而且shapely不关注数据格式和坐标系统,但shapely的整合性很强,可以和GIS之类的工具协同工作。这种黏性类似python。

1、安装

(1)基于构建的发行版

windows
  • conda install shapely

Mac OS和Linux
  • pip install shapely,如果需要针对向量化加速版本可通过pip install shapely[vectorized]安装

  • 通过系统包管理器,比如 aptyumHomebrew等。

  • 也可以通过Canopy和Anaconda等Python发行版工具安装,比如Anaconda,conda install shapely

(2)基于源码

当需要兼容基于GEOS的更多模块,或者想要使用不同的GEOS版本,可以基于源码进行安装:

pip install shapely --no-binary shapely

如果使用自定义GEOS版本进行安装时,可能需要指定geos-config程序的路径,

GEOS_CONFIG=/path/to/geos-config pip install shapely

2、基本操作

(1)创建点

from shapely.geometry import Point
  
point = Point(0, 0) # Point((0, 0))
  
point.area    # 获取点的面积
point.length  # 获取点的长度
point.bounds  # 获取点的边界

(2)创建圆

In [20]: circle = Point(0, 0).buffer(10) # 创建以(0, 0)为圆心,10为半径的圆
  
In [25]: circle.area  # 获取创建的圆的面积
Out[25]: 313.6548490545939

从上述结果可以看出,所创建的圆的面积小于 ,这是因为buffer方法默认参数resolution为16,resolution 的值越大圆越完整。

In [30]: circle = Point(0, 0).buffer(10, resolution=1000)
  
In [31]: circle.area
Out[31]: 314.15913616617644
      
In [32]: circle = Point(0, 0).buffer(10, resolution=1000000)
  
In [33]: circle.area
Out[33]: 314.1592653588436

(3)创建多边形

from shapely.geometry import Polygon
  
polygon = Polygon([(0, 1), (0, 2), (0, 3), (1, 1), (1, 2), (1, 3), (0, 3)])

Polygon 函数仅能基于有序的点创建多边形,且点的集合必须要是闭合的。使用MultiPoint 函数创建,并使用 convex_hull 方法创建多边形。

from shapely.geometry import MultiPoint
  
coords = [(0, 1), (1, 2), (1, 4), (2, 0), (3, 2)]  # coords不一定要是闭合点集合
poly = MultiPoint(coords).convex_hull

3、集合操作

(1)判断点是否在多边形

In [50]: p1 = Point(24.952242, 60.1696017)
In [51]: p2 = Point(24.976567, 60.1612500)
In [52]: coords = [(24.950899, 60.169158), (24.953492, 60.169158), (24.953510, 60.170104), (24.950958, 60.169990)]
In [53]: poly = Polygon(coords)

In [54]: poly.contains(p1)
Out[54]: True

In [55]: p1.within(poly)
Out[55]: True

In [56]: poly.contains(p2)
Out[56]: False

(2)判断多边形的集合操作

In [57]: poly2 = Polygon([(23.2154, 59.1156), (24.83151, 59.41516), (25.11667, 60.311561), (24.16178, 60.13315)] )
    
In [58]: poly2.intersects(poly)
Out[58]: True
    
In [59]: poly2.contains(poly)
Out[59]: True
    
In [60]: poly.contains(poly2)
Out[60]: False
  • .contains:判断polygon1是否包含polygon2

  • .intersects:判断polygon1和polygon2是否重叠

  • .intersections :返回两个polygon重叠的部分

(3)引申

在这里我有个疑问,还请大家一起讨论:

  • 如何判断一个多边形与其他多边形的关系?类似像arcgis的拓扑检查。如果要用(2)中实现的话,只能进行循环判断。问一下有没有更简便的方法。

  • 两个多边形“挨着”,共用一条边,那么这两个多边形是相较吗?(是否.intersects

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Shapely是一个Python库,用于处理和分析几何形状。在Shapely模块中,使用shapely.geometry.Polygon代表多边形,使用shapely.geometry.MultiPolygon代表多个多边形。可以使用Polygon类创建多边形对象,并且可以获取其相关属性。例如,可以使用area属性获取多边形的面积,使用length属性获取多边形的周长。可以使用exterior.coords获取多边形的外边界坐标,使用interiors获取多边形的内部环。还可以使用bounds属性获取多边形的边界框。 另外,Shapely还提供了一些函数来进行几何对象的转换。例如,可以使用asShape函数将类似于GeoJSON的对象转换为Shapely几何对象。还可以使用shape函数进行几何对象的转换。这些函数可以让您方便地将其他类型的几何对象转换为Shapely几何对象,以进行进一步的分析和处理。 此外,Shapely还提供了一些方法来判断点是否在多边形内部。例如,可以使用contains方法来判断某个点是否在多边形内部。contains方法接受一个Point对象作为参数,如果点在多边形内部,则返回True,否则返回False。 综上所述,通过使用Shapely库,您可以方便地创建、分析和处理几何形状,包括多边形,并进行一些常见的几何操作。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [Python几何集合操作模块Shapely的简介](https://blog.csdn.net/jclian91/article/details/121887135)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* [Python模块之Shapely](https://blog.csdn.net/linzi1994/article/details/106484538)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

倾城一少

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值