专栏首页Python与算法之美30分钟学会shapely空间几何分析

30分钟学会shapely空间几何分析

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

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

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

  • 几何对象可以和numpy.array互相转换。
  • 可以轻松求线的长度(length),面的面积(area),对象之间的距离(distance),最小最大距离(hausdorff_distance)。
  • 可以轻松求几何对象之间的关系:相交(intersect),包含(contain),求相交区域(intersection)等。
  • 可以轻松对几何对象求几何中心(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.intersection(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.intersection(line3) #面线交集
geo.GeometryCollection([poly1,inter])
geo.GeometryCollection([poly1,poly2])
poly1.intersection(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])

本文分享自微信公众号 - Python与算法之美(Python_Ai_Road),作者:梁云1991

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2021-03-12

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • (数据科学学习手札74)基于geopandas的空间数据分析——数据结构篇

    geopandas是建立在GEOS、GDAL、PROJ等开源地理空间计算相关框架之上的,类似pandas语法风格的空间数据分析Python库,其目标是尽可能地...

    Feffery
  • 30分钟学会PCA主成分分析

    PCA主成分分析算法(Principal Components Analysis)是一种最常用的降维算法。能够以较低的信息损失(以样本间分布方差衡量)减少特征数...

    lyhue1991
  • python 各类GIS分析包

    shapely-开源GIS库Pysal-空间计量库Geopandas-空间数据分析库Arcpy-arcgis python接口Arcgis API for py...

    用户7886150
  • 30分钟如何学会使用Shiro

    现在是资源共享的时代,同样也是知识分享的时代,如果你觉得本文能学到知识,请把知识与别人分享。

    互扯程序
  • (数据科学学习手札84)基于geopandas的空间数据分析——空间计算篇(上)

      在本系列之前的文章中我们主要讨论了geopandas及其相关库在数据可视化方面的应用,各个案例涉及的数据预处理过程也仅仅涉及到基础的矢量数据处理。在实际的空...

    Feffery
  • 动手学geopandas地理数据分析

    如何用Python分析诸如各国人口和GDP数据,各省市房价等地理相关数据,并在地图上优雅地展示你的结果?你需要geopandas!??

    lyhue1991
  • GISer如何学Python

    我最近看到很多公众号的python学习广告,什么30分钟让工作更轻松?好搞笑,我在此推荐官方的慕课教程,学python还用得着花钱吗?中国大学MOOC是学pyt...

    郭好奇同学
  • 几分钟几张图教你学会如何使用UML

    很多初次接触UML的朋友们可能会感觉它各种各样的线条、关系、描述等晦涩难懂。本篇文章简单介绍了一下其中几个图,用最朴实的语言结合上图片来让你一眼就能理解他们,如...

    Rookie
  • 几分钟几张图教你学会如何使用UML

    很多初次接触UML的朋友们可能会感觉它各种各样的线条、关系、描述等晦涩难懂。本篇文章简单介绍了一下其中几个图,用最朴实的语言结合上图片来让你一眼就能理解他们,如...

    java思维导图
  • 库|分享一些python库

    今天只是分享一些python库,涉及到地理数据分析,数据可视化和数据处理三个方面。

    bugsuse
  • [1025]python地理处理包shapely

    github:https://github.com/Toblerity/Shapely

    周小董
  • python与地理空间分析(一)

    在气象数据分析中,地理空间要素是一个必须考虑的关键特征项,也是重要的影响因素。例如气温会随着海拔的升高而降低,地形的坡向朝向也会影响风速的分布,此外,典型的地形...

    zhangqibot
  • 【超实用】一分钟学会如何用最小存储空间保存Vivado工程!

    VIVADO工程目录中包含很多中间生成文件,这导致一个工程大小普遍在几百MB甚至GB级别,在我们保存工程备份或者使用Git的时候是很不方便的。好在VIVADO为...

    网络交换FPGA
  • (数据科学学习手札88)基于geopandas的空间数据分析——空间计算篇(下)

      在基于geopandas的空间数据分析系列文章第8篇中,我们对geopandas开展空间计算的部分内容进行了介绍,涉及到缓冲区分析、矢量数据简化、仿射变换、...

    Feffery
  • python3表格数据处理

    数据处理是一个当下非常热门的研究方向,通过对于大型实际场景中的数据进行建模,可以用于预测下一阶段可能出现的情况。比如我们有过去的2002年-2018年的黄金价格...

    DechinPhy
  • (数据科学学习手札77)基于geopandas的空间数据分析——文件IO

      在上一篇文章中我们对geopandas中的坐标参考系有了较为深入的学习,而在日常空间数据分析工作中矢量文件的读入和写出,是至关重要的环节。

    Feffery
  • Python绘制气象实用地图(附代码和测试数据)

    前面的推文对于常用的Python绘图工具都有了一些介绍,在这里就不赘述了。本文主要就以下几个方面:“中国区域绘图”、“包含南海”、“兰伯特投影带经纬度标签”、“...

    zhangqibot
  • (数据科学学习手札111)geopandas 0.9.0重要新特性一览

    就在几天前,geopandas释放了其最新正式版本0.9.0,作为一次比较大的版本更新,geopandas为我们带来了一系列新特性,今天的文章我们就来一起看看有...

    Feffery
  • 编程小白 | 每日一练(127)

    这道理放在编程上也一并受用。在编程方面有着天赋异禀的人毕竟是少数,我们大多数人想要从编程小白进阶到高手,需要经历的是日积月累的学习,那么如何学习呢?当然是每天都...

    小林C语言

扫码关注云+社区

领取腾讯云代金券