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

公众号后台回复关键字:"源码",获取本文全部代码。

实践证明,它的以下一些功能特性非常常用:

  • 几何对象可以和numpy.array互相转换。

  • 可以轻松求线的长度(length),面的面积(area),对象之间的距离(distance),最小最大距离(hausdorff_distance)。

  • 可以轻松求几何对象之间的关系:相交(intersect),包含(contain),求相交区域(interp)等。

  • 可以轻松对几何对象求几何中心(centroid),缓冲区(buffer),最小旋转外接矩形(minimum_rotated_rectangle)等。

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

  • 可以轻松对几何对象进行旋转(rotate)和缩放(scale)。

#安装shapely
!pip install shapely
from shapely import geometry as geo
from shapely import wkt
from shapely import ops
import numpy as np 

一,Point对象

# 创建Point对象
pt1 = geo.Point([0,0])
print(pt1)
coord = np.array([0,1])
pt2 = geo.Point(coord)
print(pt2)
pt3 = wkt.loads("POINT(1 1)")
print(pt3)#批量可视化
geo.GeometryCollection([pt1,pt2,pt3])

# 常用属性print(pt1.x)
print(pt1.y)
print(list(pt1.coords))
print(np.array(pt1)) #可以和np.array互转
# 常用方法d = pt2.distance(pt1)
print(d)

二, LineString对象

# 创建LineString对象
line1 = geo.LineString([(0,0),(1,-0.1),(2,0.1),(3,-0.1),(5,0.1),(7,0)])
line1

arr = np.array([(2,2),(3,2),(4,3)])
line2 = geo.LineString(arr)
line2

line3 = wkt.loads("LineString(-2 -2,4 4)")
line3

# 常用属性
print(line2.length)
print(list(line2.coords))
print(np.array(line2))  #可以和np.array互转
print(line2.bounds) #坐标范围
center = line2.centroid #几何中心
geo.GeometryCollection([line2,center])

bbox = line2.envelope #最小外接矩形
geo.GeometryCollection([line2,bbox])

rect = line2.minimum_rotated_rectangle #最小旋转外接矩形
geo.GeometryCollection([line2,rect])

# 常用方法d1 = line1.distance(line2) #线线距离
print(d1)
d2 = line1.distance(geo.Point([-1,0])) #线点距离
print(d2)
d3 = line1.hausdorff_distance(line2) #最小最大距离
print(d3)
pt_half = line1.interpolate(0.5,normalized=True) #插值
geo.GeometryCollection([line1,pt_half])

ratio = line1.project(pt_half,normalized=True) #投影
print(ratio)
line1_simplify = line1.simplify(0.5)  #化简 DouglasPucker算法
print(line1)
print(line1_simplify)
line1_simplify

buffer_with_circle = line2.buffer(0.2)  #端点按照半圆扩展
geo.GeometryCollection([line2,buffer_with_circle])

buffer_without_circle = line2.buffer(0.2,cap_style=2) #端点不扩展
geo.GeometryCollection([line2,buffer_without_circle])

buffer_with_square = line2.buffer(0.2,cap_style=3) #端点按照方形扩展
geo.GeometryCollection([line2,buffer_with_square])

buffer_round_join = line2.buffer(0.2,join_style=1) #圆弧连接
geo.GeometryCollection([line2,buffer_round_join])

buffer_angle_join = line2.buffer(0.2,join_style=2) #折角连接
geo.GeometryCollection([line2,buffer_angle_join])

print(line2.intersects(line3)) #线线关系,是否相交
print(line2.interp(line3)) #线线交点
print(line2.contains(geo.Point(2.5,2))) #点线关系

三,Polygon对象

# 创建Polygon对象
poly1 = geo.Polygon([(0,0),(1,0),(1,1),(0,1),(0,0)]) #起点和终点相同
poly1

coords = np.array([(0,0),(1,0.1),(2,0),(1,2),(0,0)])
poly2 = geo.Polygon(coords)
poly2

#第一个括号是外部坐标,后面的是内部空洞坐标
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))")
poly3 

#创建bbox对象
poly4 = geo.Polygon.from_bounds(xmin=0,ymin=0,xmax=20,ymax=20)
poly4

#常用属性
print(poly1.area)  #面积
print(poly1.length) #周长
print(np.array(poly1.exterior))  #外围坐标点
print(poly3.bounds) #坐标范围

center = poly3.centroid #几何中心
geo.GeometryCollection([center,poly3]) 

poly3.boundary #边缘


rect = poly2.minimum_rotated_rectangle #最小外接矩形
geo.GeometryCollection([rect,poly2])

# 常用方法
r1 = poly2.contains(geo.Point(0,0)) #面点关系
print(r1)r2 = poly2.intersects(geo.LineString([(0,0),(5,5)])) #面线关系
print(r2)r3 = poly2.intersects(poly3) #面面关系
print(r3)

geo.GeometryCollection([poly1,line3])

inter = poly1.interp(line3) #面线交集
geo.GeometryCollection([poly1,inter])

geo.GeometryCollection([poly1,poly2])

poly1.interp(poly2) #面面交集

poly1.union(poly2) #面面并集

poly2.difference(poly1) #面面补集

poly2.simplify(0.5) #简化

print(poly2.area)
poly2_bigger = poly2.buffer(0.2) #外扩面积变大
print(poly2_bigger.area)
poly2_smaller = poly2.buffer(-0.2) #内扩面积变小
print(poly2_smaller.area)
poly2_smaller

四,其他几何对象

# MultiPoint 多点x = np.linspace(0,2*np.pi,10)
y = np.sin(x)
points = [geo.Point(i,j) for i,j in zip(x,y)]
multipoints = geo.MultiPoint(points )
multipoints

hull = multipoints.convex_hull  #凸包
geo.GeometryCollection([hull,multipoints])

# MultiLineString 多线
multilines = geo.MultiLineString([line1,line2])
multilines

# MultiPolygon 多面multipolys = geo.MultiPolygon([poly1,poly2])
multipolys

# GeometryCollection 对象集合geoms = [pt1,pt2,pt3,line3,poly3]
geo.GeometryCollection(geoms) #方便在jupyter 中对多个几何对象可视化

五,进阶操作

以下是一些非常有用但是不属于某个类的方法的函数。

  • ops.nearest_points 求最近点

  • ops.split 分割线

  • ops.substring  求子串

  • affinity.rotate 旋转几何体

  • affinity.scale 缩放几何体

  • affinity.translate 平移几何体

from shapely import ops,affinity poly1 = 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])

poly1_rot30 = affinity.rotate(poly1,30,origin = "centroid")
geo.GeometryCollection([poly1,poly1_rot30])

poly1_scale = affinity.scale(poly1,xfact=2.0,yfact=2.0)geo.GeometryCollection([poly1,poly1_scale])

30分钟学会shapely空间几何分析相关推荐

  1. python程序-30分钟学会用Python编写简单程序

    原标题:30分钟学会用Python编写简单程序 参与文末每日话题讨论,赠送异步新书 异步图书君 学习目标 知道有序的软件开发过程的步骤. 了解遵循输入.处理.输出(IPO)模式的程序,并能够以简单的方 ...

  2. python写软件实例-30分钟学会用Python编写简单程序

    原标题:30分钟学会用Python编写简单程序 参与文末每日话题讨论,赠送异步新书 异步图书君 学习目标 知道有序的软件开发过程的步骤. 了解遵循输入.处理.输出(IPO)模式的程序,并能够以简单的方 ...

  3. 30 分钟学会 Flex 布局

    30 分钟学会 Flex 布局 关注公众号 风色年代(itfantasycc) 更多好玩的前端资料等你拿~~ 林东洲 30 分钟学会 Flex 布局 - 知乎 (zhihu.com) 为什么我要写这一 ...

  4. Pyechart:30分钟学会pyecharts数据可视化

    30分钟学会pyecharts数据可视化 小红:你先跟我说说什么是pyecharts吧. 小明:Echarts 是一个由百度开源的数据可视化javascript库,凭借着良好的交互性,精巧的图表设计, ...

  5. 【转】30分钟学会UML类图

    转自:30分钟学会UML类图 - 知乎 30分钟学会UML类图 肖继潮 UML图有很多种,但是并非必须掌握所有的UML图,才能完整系统分析和设计工作.一般说来,在UML图中,只要掌握类图.用例图.时序 ...

  6. 30分钟学会EventBus3 0详解(二)(EventBus3 0的详细使用)(by星空武哥)

    转载声明原创地址:http://blog.csdn.net/lsyz0021/article/details/52094855 30分钟学会EventBus3.0详解(一)(引入和初始化EventBu ...

  7. 30分钟学会专利提案

    30分钟学会专利提案 预期效果 引起重视 掌握套路 激发灵感 分享内容 6个问题 1.专利.发明专利.交底书.申请书? 专利分为发明.实用新型和外观设计三种类型 授予发明专利应当具备三性:新颖性.创造 ...

  8. 服务器可视化_疫情来袭,30分钟学会用python开发部署疫情可视化网站

    2019-nCov疫情实时数据可视化--30分钟python快速版 疫情来袭,宅在家不如学习用python如何开发并部署一个疫情实时追踪可视化页面.页面预览 本文将介绍如何使用python开发网站,「 ...

  9. 30分钟学会XAML

    1.狂妄的WPF 相对传统的Windows图形编程,需要做很多复杂的工作,引用许多不同的API.例如:WinForm(带控件表单).GDI+(2D图形).DirectX API(3D图形)以及流媒体和 ...

最新文章

  1. 设计模式之桥接模式实例
  2. centos 7 yum安装mysql完整过程记录
  3. 计算机的主存储器可以分为哪两类,2017年计算机应用基础模拟试题「答案」(2)...
  4. idata 单片机 新唐_半导体新唐单片机怎么样_新唐单片机是台湾的吗
  5. Matlab图像处理函数:regionprops
  6. 完美配置Tomcat的HTTPS
  7. httpclient基本get用法
  8. 数字图像处理基础-第三章图像预处理
  9. PowerPoint超链接字体颜色修改、怎么去掉超链接下划线
  10. USB (十三)2022-04-02
  11. 计算机图形学空间曲线,课程追忆之《计算机图形学》【曲线曲面篇】
  12. QTableView 例三(代理)
  13. linux 启动 grub 修复工具,当Ubuntu无法启动时,如何修复GRUB2?
  14. 直播频频翻车:追风口的人,变成风口杀手
  15. 软件测试人员易遗漏的一些隐藏缺陷
  16. Leetcode 官网及使用
  17. JavaSE小项目(小游戏)
  18. 阿里云ECS服务器介绍和网络知识讲解
  19. MATLAB汉字识别(GUI,bp神经网络,论文)
  20. 智慧小区项目遇到的问题汇总解决参考

热门文章

  1. Android开发——网络请求(一)网络请求的API、授权和方法
  2. 2022-2027年中国发动机仪表市场规模现状及投资规划建议报告
  3. LoadRunner函数大全
  4. FPGA 之 时序分析
  5. 0基础学编程难吗?多久能学会?转行IT常见的4个问题
  6. np.percentile()函数
  7. 几种spootboot配置参数线上修改方法
  8. 遥感卫星不同光谱带介绍(Band 1 - Band 13)
  9. 民法典实施后,夫妻共同债务如何认定?
  10. Lazada商家售出产品多久能收款?收款方式及流程一篇详解!