Shapely 扩展包功能札记

shapely 是python 中开源的空间几何对象库,支持 Point(点),LineString(线),Polygon(面) 等几何对象及相关空间操作。

Shapely is a BSD-licensed Python package for manipulation and analysis of planar geometric objects. It is based on the widely deployed GEOS (the engine of PostGIS) and JTS (from which GEOS is ported) libraries. Shapely is not concerned with data formats or coordinate systems, but can be readily integrated with packages that are


目录

Shapely 扩展包功能札记

参考网址

安装

下面会列出代码的 Shapely 功能

代码展示

1. 几何对象和 numpy.array 之间互相转换

2. 求解线的长度,面的面积,对象之间的距离,最小最大距离

3. 几何对象之间的关系判定:相交 (intersect),包含 (contain),相交区域 (intersection)

4. 对几何对象求几何中心 (centroid),缓冲区 (buffer),最小旋转外界矩形 (minimum_rotated_rectangle)

5. 求线的插值点 (interpolate),求点投影到线的距离 (project),求几何对象之间对应的最近点 (nearestPoint)

6. 对几何对象进行旋转 (rotate) 和缩放 (scale)。

总结


参考网址

  • 官方资料:Shapely documentation
  • 30 分钟学会 shapely 空间几何分析
  • Datawhale 组队学习资料

安装

本人一开始需要安装的是 GDAL 包,但是因为 Shapely 包版本不对所以将其卸了重装,因为要下载与GDAL相对应的版本,所以是通过 whl 文件安装 Shapely ,主要参考了知乎一位博主的博文 《geopandas安装心得(win10)》。如果只需要安装 shapely 包,不需要考虑版本的问题,那直接 利用 Anaconda Prompt 通过命令:

$ pip install shapely

就可以安装。如果需要安装特定版本的 Shapely 包,那可以和我一样通过 whl 文件进行安装,具体的安装流程可以参考上面的知乎链接。(不使用 conda 安装的原因主要是网络问题,一直装不上,网好的同学可以考虑用 conda 安装一劳永逸)


提示:以下是本篇文章正文内容,所有案例都是通过 Spyder (python 3) 进行演示。来看这篇博文的相信都是某几个命令搞不清楚的,那就直接干货!

下面会列出代码的 Shapely 功能

  1. 几何对象(点、线、面)和numpy.array互相转换;
  2. 求解线的长度,面的面积,对象之间的距离,最小最大距离;
  3. 几何对象之间的关系判定:相交 (intersect),包含 (contain),相交区域 (intersection) ;
  4. 对几何对象求几何中心 (centroid),缓冲区 (buffer),最小旋转外界矩形 (minimum_rotated_rectangle) 等;
  5. 求线的插值点 (interpolate),求点投影到线的距离 (project),求几何对象之间对应的最近点 (nearestPoint);
  6. 对几何对象进行旋转 (rotate) 和缩放 (scale)。

下面对上述六种命令进行一一展示。

代码展示

1. 几何对象和 numpy.array 之间互相转换

导入必要的包:

from shapely import geometry as geo
from shapely import wkt
from shapely import ops
import numpy as np

创建点、线、面对象,其中三种对象各自的第二种创建方法 #2 都是利用 numpy 数组的方法进行创建:

## TODU: 创建点 Point 对象(三种方法)
pt1   = geo.Point([0,0])             # 1
coord = np.array([0,1])
pt2   = geo.Point(coord)             # 2
pt3   = wkt.loads("POINT(1 1)")      # 3## TODU: 创建线 LineString 对象 (三种方法)
line1 = geo.LineString([(0,0),(1,-0.1),(2,0.1),(3,-0.1),(5,0.1),(7,0)]) # 1
arr   = np.array([(2,2),(3,2),(4,3)])
line2 = geo.LineString(arr)                                             # 2
line3 = wkt.loads("LineString(-2 -2,4 4)")                              # 3## TODU: 创建面 Polygon 对象 (四种方法)
poly1  = geo.Polygon([(0,0),(1,0),(1,1),(0,1),(0,0)]) #起点和终点相同    # 1
coords = np.array([(0,0),(1,0.1),(2,0),(1,2),(0,0)])
poly2  = geo.Polygon(coords)                                            # 2
poly3  = wkt.loads("POLYGON((0 0,2 0,2 2,0 2,0 0),(0.5 0.5,1.5 0.5,1.5 1.5,0.5 1.5,0.5 0.5))")  # 3
poly4  = geo.Polygon.from_bounds(xmin=0,ymin=0,xmax=20,ymax=20)         # 4

对象可视化,对应上面三种对象的创建方式里的变量命名。

# 点对象 批量可视化
geo.GeometryCollection([pt1,pt2,pt3])# 线对象 可视化
geo.GeometryCollection([line2])# 面对象 可视化
geo.GeometryCollection([poly3]) 

对应三种对象可视化的 Spyder 运行结果如下图所示:

点对象 批量可视化:

线对象 可视化:

面对象 可视化:

2. 求解线的长度,面的面积,对象之间的距离,最小最大距离

点对象、线对象、面对象之间的距离:

## 点对象:点 pt2 与点 pt1 之间的距离 d (线段 pt1 -> pt1 的长度)
d = pt2.distance(pt1)                         # 点点距离## 线对象:线 line1 与线 line2 之间的距离
d1 = line1.distance(line2)                    # 线线距离
d2 = line1.distance(geo.Point([-1, 0]))       # 线点距离
d3 = line1.hausdorff_distance(line2)          # 最大最小距离(线段之间)## 面对象:面积与周长
s1 = poly1.area                               # 面对象面积
c1 = poly1.length                             # 面对象周长
exte = np.array(poly1.exterior)               # 面对象外围坐标点
bds = poly3.bounds                            # 面对象坐标范围

3. 几何对象之间的关系判定:相交 (intersect),包含 (contain),相交区域 (intersection)

点、线、面对象关系判定:

# 线线关系
jug1   = line2.intersects(line3)                 # 线线是否相交 True or False
intpt1 = line2.intersection(line3)               # 线线交点坐标 (可以通过 np.array() 显示坐标值)# 点线关系
jug2 = line2.contains(geo.Point(2.5,2))          # 线(段)是否包含点 True or False# 面点关系
jug3 = poly2.contains(geo.Point(0,0))            # 面是否包含点 True or False# 面线关系
jug4  = poly2.intersects(geo.LineString([(0,0),(5,5)]))   # 面线是否相交 True or False
inte1 = poly1.intersection(line3)                         # 面线交集# 面面关系
jug5  = poly2.intersects(poly3)                   # 面面是否相交 True or False
inte2 = poly1.intersection(poly2)                 # 面面交集
uni1  = poly1.union(poly2)                        # 面面并集
diff1 = poly2.difference(poly1)                   # 面面补集

4. 对几何对象求几何中心 (centroid),缓冲区 (buffer),最小旋转外界矩形 (minimum_rotated_rectangle)

线、面对象几何中心确定:

# 线几何中心
center = line2.centroid
geo.GeometryCollection([line2,center]) # 线段及其几何中心显示# 面几何中心
center = poly3.centroid
geo.GeometryCollection([center,poly3]) # 面及其几何中心显示

点、线、面缓冲区确定:

# 点、线、面缓冲区扩展都是一样的格式:obj.buffer(distance, cap_style = 1/2/3, join_style = 1/2)# 点对象缓冲区
buffer_pt1 = pt1.buffer(0.1)                     # 点按圆形扩展缓冲区
geo.GeometryCollection([pt1, buffer_pt1])# 线对象缓冲区
buffer_line2_11 = line2.buffer(0.2, cap_style = 1, join_style = 1) # 端点半圆扩展, 圆弧链接
buffer_line2_21 = line2.buffer(0.2, cap_style = 2, join_style = 1) # 端点不扩展, 圆弧链接
buffer_line2_31 = line2.buffer(0.2, cap_style = 3, join_style = 1) # 端点方形扩展, 圆弧链接
buffer_line2_12 = line2.buffer(0.2, cap_style = 1, join_style = 2) # 端点半圆扩展, 折角链接# 面对象缓冲区
buffer_poly_bigger  = poly2.buffer(0.2)             # 面对象面积外扩
buffer_poly_smaller = poly2.buffer(-0.2)            # 面对象面积内缩
print(buffer_poly_smaller.area)                     # 计算内缩对象的面积

最小外接矩形、最小旋转外接矩阵:

# 线对象
enve_line  = line2.envelope                             # 最小外接矩形
rot_rect_l = line2.minimum_rotated_rectangle            # 最小旋转外接矩形# 面对象
enve_poly  = poly2.envelope                             # 最小外接矩形
rot_rect_p = poly2.minimum_rotated_rectangle            # 最小旋转外接矩形

Spyder 显示:

5. 求线的插值点 (interpolate),求点投影到线的距离 (project),求几何对象之间对应的最近点 (nearestPoint)

求线的插值点:

pt_half = line1.interpolate(0.5, normalized = True)
geo.GeometryCollection([line1, pt_half])

Spyder 显示:

求点投影到线的距离:

# 投影
ratio = line1.project(pt_half, normalized=True)
print(ratio)

求几何对象之间的最近点:

# 导入 shapely.ops 包
from shapely import opspoly1 = geo.Polygon([(0,0), (2,0), (1,1), (0,0)])
poly2 = geo.Polygon([(4,0),(6,0),(6,2),(4,2),(4,0)])# 求取两个面对象相距最近点的坐标
p1, p2 = ops.nearest_points(poly1,poly2)
geo.GeometryCollection([poly1,poly2,p1,p2])

Spyder 显示:

6. 对几何对象进行旋转 (rotate) 和缩放 (scale)。

旋转、平移、缩放几何对象:

# 导入必要的包
from shapely import affinity## (顺时针)旋转
# shapely.affinity.rotate(geom, angle, origin='center', use_radians=False)line = LineString([(1, 3), (1, 1), (4, 1)])
rotated_a = affinity.rotate(line, 90)
rotated_b = affinity.rotate(line, 90, origin='centroid')
geo.GeometryCollection([line, rotated_a])## 缩放
# shapely.affinity.scale(geom, xfact=1.0, yfact=1.0, zfact=1.0, origin='center')triangle = Polygon([(1, 1), (2, 3), (3, 1)])
triangle_a = affinity.scale(triangle, xfact=1.5, yfact=-1)
triangle_a.exterior.coords[:]
geo.GeometryCollection([triangle, triangle_a])triangle_b = affinity.scale(triangle, xfact=2, origin=(1,1))
triangle_b.exterior.coords[:]
geo.GeometryCollection([triangle, triangle_b])## 平移
# shapely.affinity.translate(geom, xoff=0.0, yoff=0.0, zoff=0.0)
triangle = Polygon([(1, 1), (2, 3), (3, 1)])
triangle_a = affinity.translate(triangle, xoff=1.0, yoff=2.0)
geo.GeometryCollection([triangle, triangle_a])

Spyder 显示:

  • 旋转

  • 缩放

  • 平移


总结

以上就是今天要讲的内容,本文仅仅简单介绍了 shapely 部分功能的使用,而 shapely 提供了大量能使我们快速便捷地处理数据的函数和方法,如果需要深入使用 shapely 的功能,看这篇介绍肯定是远远不够的,最好的方式就是看 shapely 的官方介绍文档,相信一定能收获颇多。

Shapely 扩展包功能札记相关推荐

  1. laravel框架应用和composer扩展包开发

    laravel5.5+ laravel官方地址 laravel是目前最流行的php框架,发展势头迅猛,应用非常广泛,有丰富的扩展包可以应付你能想到的各种应用场景,laravel框架思想前卫,跟随时代潮 ...

  2. slicer安装_对3D Slicer软件安装离线扩展包

    王奎重 有时候由于网络原因,已经安装好的3D Slicer软件不能安装扩展功能,导致Slicer功能受限.下面介绍如何安装离线扩展包. 1.打开3D Slicer软件,点击①右上角的扩展模块图标,再点 ...

  3. TensorFlow常用Python扩展包

    TensorFlow常用Python扩展包 TensorFlow 能够实现大部分神经网络的功能.但是,这还是不够的.对于预处理任务.序列化甚至绘图任务,还需要更多的 Python 包. 下面列出了一些 ...

  4. Python常用扩展包

    一. Python常用扩展包 参考张良均的<Python数据分析与挖掘实战>,下图展示了常见的Python扩展包.         常用的包主要包括:         1.Numpy    ...

  5. 只有想不到,「99」种扩展Jupyter功能的好方法

    点击"小詹学Python",选择"星标"公众号 重磅干货,第一时间送达 选自 | Jupyter Blog 作者 | yuvipanda  编译 | 机器之心 ...

  6. Laravel大型项目系列教程(七)之7 扩展包和Artisan开发

    本节教程将讲解扩展包开发和Artisan扩展开发,并浏览不同分辨率下的自适应效果.本节结束后整个教程就结束了,文章最后有完整版程序代码的下载. 1.扩展包开发 在前面开发中,我们经常要用到通知,如修改 ...

  7. vba quit此文件正由另一个应用程序或用户使用_VBA|如何添加外部对象库(或控件)引用来扩展VBA功能...

    VBA是VB的宏语言,基于对象,有大量的内部对象及其属性和方法可以使用,此外,还可以添加外部对象库引用来扩展VBA功能. 例如你在网上找了一个项目的文件,其中有对listview的使用,但你使用这个项 ...

  8. 如何在vsc上下载php扩展包,正确的 Composer 扩展包安装方法

    问题说明 我们经常要往现有的项目中添加扩展包,有时候因为文档的错误引导,如下图来自 这个文档 的: composer update 这个命令在我们现在的逻辑中,可能会对项目造成巨大伤害. 因为 com ...

  9. Laravel 开发扩展包基本流程

    介绍 在Laravel中就有Laravel Composer Package开发的相关介绍 这其中需要运用 Service Providers 当然对于我们Laravel开发人员 来说 开发一个扩展包 ...

最新文章

  1. 【网络安全】浅析跨域原理及如何实现跨域
  2. python中列表用某个数字出现的次数_Python实现统计给定列表中指定数字出现次数的方法...
  3. linux文件系统添加pcm,linux下用sox批量将pcm文件加wav头、批量修改采样率、切音频...
  4. 聊聊如何设计千万级吞吐量的.Net Core网络通信!
  5. RRDTool学习资料备忘
  6. NAT,PAT、OSPF的相关配置
  7. SQL Server子查询实例
  8. 【路径规划】基于matlab粒子群融合遗传算法栅格地图路径规划【含Matlab源码 526期】
  9. 深海迷航代码_?《深海迷航(Subnautica)》如何输入代码
  10. Python爬虫:抖音无水印解析,和程序员斗智斗勇的一天
  11. 网络攻击中常见掩盖真实IP的攻击方式及虚假IP地址追踪溯源方法
  12. 关于”Hi,火星人!“广告语来历的考证
  13. 国产操作系统突破重围,中兴新支点系统宣布:30万+,并发布服务器模式
  14. Echarts南丁格尔图.
  15. 模拟斗地主发牌, 把54张牌发给三个玩家, 地主多三张, 对每个玩家的牌进行排序
  16. MOS管和三级管基础知识总结
  17. 最新版本webrtc源代码在windows上的编译方法
  18. 电信宽带100M,平时只有30一40M而且常常掉线这是怎么回事?
  19. 网页上ajax异步加载数据,网页的异步请求(Ajax)
  20. 解决TensorFlow“Your CPU supports instructions TensorFlow binary was not compiled to use : AVX2 FMA”

热门文章

  1. poi实现Excel文件写入 支持后缀XLSX格式
  2. 微信开发内置浏览器JS自动关闭当前页面回到微信对话窗口
  3. 基于Hololens开发---本地化空间锚点
  4. Python 自学笔记(教程)(七)
  5. 一键加速GitHub、Pypi、DockerHub访问
  6. mac pro 系统升级带来的问题
  7. 分析流量对防御DDOS攻击有何价值?
  8. [转载] 晓说——第26期:艺术北纬三十度 回忆印度(上)
  9. GPU显存占满但利用率却很低
  10. 数学建模常用算法—灰色预测