shapely库的基础学习

DataWhale组队学习打卡第一阶段内容

本学习笔记为Datawhale开源学习训练营21年4月数据挖掘学习的学习内容,学习链接为:团队学习数据挖掘/智慧海洋
所在学习小组:梅利号


shapely库的学习记录:

准备工作

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

shapely几何对象的创建及可视化

  • 创建的几何对象可以为Point(点)、LineString(线)、Polygon(面)等

Point

  • 创建Point对象
#创建Point对象
point_1=geo.Point(1,2)
print(point_1)	#输出:POINT (1 2)
point_2=geo.Point((3,4))
print(point_2)	#输出:POINT (3 4)
point_3=geo.Point(np.array([4,5]))
print(point_3)	#输出:POINT (4 5)
point_4=wkt.loads("POINT(5 6)")
print(point_4)	#输出:POINT (5 6)
  • 批量可视化
#批量可视化
geo.GeometryCollection([point_1,point_2,point_3,point_4])
  • 输出点的属性(x、y、z、点坐标)
#输出点的属性(x、y、点坐标)
print(point_1.x)	#输出(point_1的x坐标):1.0
print(point_1.y)	#输出(point_1的y坐标):2.0
print(list(point_1.coords))	#输出包含point_1坐标的列表:[(1.0, 2.0)]
  • 将Point重新转换为numpy.array对象
#将point_3重新转换为numpy.array对象
array_3=np.array(point_3)
print(array_3)	#输出:[4. 5.]
  • 点对象的属性
#点的面积和长度属性都为0
point_1.area	#0.0
point_1.length	#0.0

#点的边界是均为0的元组
point_1.bounds	#(0.0, 0.0, 0.0, 0.0)

#坐标可以被切片
point_1.coords[:]	#[(1.0,2.0)]

#Point构造函数还能接受另一个Point实例,从而生成一个副本
geo.Point(point_1)
  • 点对象的常用方法
d=point_2.distance(point_4)	#d为点2和点4之间的点间距
print(d)

LineString

LineString构造函数用2个或者更多(x,y[,z])点元组的有序序列
构造出来的LineString对象表示点之间的一个或者多个连接的线性样条曲线。可以按照顺序重复点,但可能导致性能损失,应尽量避免。线迹可以交叉。

  • LineString的创建
line=geo.LineString([0,0],[1,1])

#也可以使用一系列混合点实例或坐标元组来构造LineString。各个坐标将复制到新对象中去
line2=geo.LineString([geo.Point(0.0,1.0),geo.Point(3.0,3.0),geo.Point(4.0,2.0)])
  • LineString的属性
#LineString的面积为0,长度不为0
line.area	#0.0
line.length	#1.4142135623730951

#LineString的边界是(minx,miny,maxx,maxy)的元组
line.bounds	#(0.0, 0.0, 1.0, 1.0)

#LineString可以和np.array互换
np.array(line)

#LineString的坐标值可以使用coords获取
len(line.coords)	#2
list(line.coords)	#[(0.0,0.0),(1.0,1.0)]

#LineString的几何中心
center=line.centroid
list(center.coords)	#[(0.5, 0.5)]

#坐标可以被切片
line.coords[:]	#[(0.0, 0.0), (1.0, 1.0)]
line.coords[1:]	#[(1.0, 1.0)]

#LineString构造函数还能接受另一个LineString实例,从而生成一个副本
geo.LineString(line)
  • LineString的常见用法
#最小外接矩阵
minbox=line.envelope
geo.GeometryCollection([line,minbox])

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

#线间距、点线距、最小最大距离
d1=line.distance(line2)	#0.5547001962252291
d2=line.distance(geo.Point([6,6]))	#7.0710678118654755
d3=line.hausdorff_distance(line2)	#3.1622776601683795

#插值
pt_half=line.interpolate(0.5,normalized=True)

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

#化简 DouglasPucker算法
line_simplify=line.simplify(0.5)

#端点按照半圆拓展
line.buffer(0.2)
line.buffer(0.2,cap_style=2)	#端点不拓展
line.buffer(0.2,cap_style=3)	#端点按照方形拓展

#连接
line.buffer(0.2,join_style=1)	#圆弧连接
line.buffer(0.2,join_style=2)	#折角连接

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

LinearRing

LinearRing构造函数采用(x,y[,z])点元组的有序序列
LinearRing的第一个和最后一个索引中要传递相同的值,可以显示闭合序列;否则将通过第一个索引元组复制到最后一个索引来隐式闭合序列。LinearRing和LineString一样,可以按照顺序重复点,但可能会导致性能缺失,应尽量避免。线迹不能交叉,也不能单点接触。

  • LinearRing的创建
ring=geo.LinearRing([(0.0,0.0),(1.0,0.9),(2.0,0.0),(2.0,2.0),(1.0,1.0),(0.0,2.0)])	
ring_2=wkt.loads("LinearRing(0 0,1 1,2 0,2 2,0 2")
  • LinearRing的属性
#LinearRing的面积为0,长度不为0
ring.area	#0.0
ring.length	#9.519151934160933

#linearRing的边界是(minx,miny,maxx,maxy)的元组
ring.bounds	#(0.0, 0.0, 2.0, 2.0)

#与np.array互换
np.array(ring)	#array([[0. , 0. ],[1. , 0.9],[2. , 0. ],[2. , 2. ],[1. , 1. ],[0. , 2. ],[0. , 0. ]])

#坐标可以被切片
ring.coords[:]	
'''
out:
[(0.0, 0.0),
 (1.0, 0.9),
 (2.0, 0.0),
 (2.0, 2.0),
 (1.0, 1.0),
 (0.0, 2.0),
 (0.0, 0.0)]
'''
ring.coords[3:]	#[(2.0, 2.0), (1.0, 1.0), (0.0, 2.0), (0.0, 0.0)]

#LinearRing的坐标可以用coords获得
list(ring.coords[3:]) == list(ring.coords)[3:]	#True
len(ring.coords)	#7

#LinearRing的几何中心
center=ring.centroid
list(center.coords)	#[(1.0, 0.9930996917310152)]	

#LinearRing构造函数还能接受另一个LinearRing实例,从而生成一个副本
geo.LinearRing(ring)

Polygon

Polygon构造函数能接受两个位置参数,一个是(x,y[,z])点元组的有序序列,其处理方式和LinearRing是一样的。另一个是可选的无序的环状序列,指定了特征的内部边界或“洞”。环与环不能相互交叉,只能有一个接触点。

  • Polygon的创建
polygon = geo.Polygon([(0, 0), (1, 1), (1, 0)])
polygon_1=wkt.loads("Polygon(0 0,1 1,1 0)")
  • Polygon的属性
#Polygon的面积不为0,长度不为0
polygon.area	#0.5
polygon.length	#3.414213562373095

#Polygon的边界是(minx,miny,maxx,maxy)的元组
polygon.bounds	#(0.0, 0.0, 1.0, 1.0)

#Polygon的构成环可以用exterior 和interiors获取
list(polygon.exterior.coords)	#[(0.0, 0.0), (1.0, 1.0), (1.0, 0.0), (0.0, 0.0)]	
list(polygon.interiors)	#[]

#Polygon的几何中心
center=polygon.centroid

#Polyhon的创建还接受LinearRing和LineString实例
geo.Polygon(ring)	#ring和line为上述实例
geo.Polygon(line)
geo.Polygon(line.buffer(1.0).exterior,[ring])

#矩形的构造使用shapely.geometry.box()函数
#shapely.geometry.box(minx,miny,maxx,maxy,ccw=True)由提供的边界值生成矩形,默认情况按逆时针顺序
from shapely.geometry import box
b=box(0,0,1,1)
list(b.exterior.coords)

Polygon常见用法

#边框图形
polygon.boundary

#最小外接矩阵
rect=polygon.minimum_rotated_rectangle

#对象间关系
r1=polygon.contains(geo.Point(0,0))	#面点关系
r2=polygon.intersects(geo.LineString([(0,0),(5,5)])	#面线关系
r3=polygon.intersects(polygon2)	#面面关系
inter=polygon.intersection(line)	#面线交集
inter2=polygon.intersection(polygon2)	#面面交集
union1=polygon.union(polygon2)	#面面并集
polygon.difference(polygon2)	#面面补集
polygon.simple(0.5)	#简化
polygon.buffer(0.2)	#外扩面积变大
polygon.buffer-(0.2)	#内扩面积变小

几何对象间的关系

  • 几何对象都有内部、边界和外部等特征
  1. a.contains(b)等价于b.within(a)
    如果点b在a的内部,则返回True;如果a的外部没有其他点,或者至少一个点b在a的内部也返回True
coords=[(1,5),(5,2),(3,3)]
print(geo.LinearRing(coords).contains(geo.Point(2,8))
#out:	False

coords=[(1,5),(5,2),(3,3)]
print(geo.LinearRing(coords).contains(geo.Point(3,3)))
#out:	True

这个方法可以用在判断点是否在环线或者面的内部,也可以延申用在判断线面和面面的包含关系上

  1. object.crosses(other)
    如果两个几何对象是内部相交(不是包含关系),则返回True

  2. object.disjoint(other)
    如果两个几何对象的既内部不相交又边界不相交,则返回True

  3. object.intersects(other)
    只要两个几何对象有相交点,则返回True

  4. object.convex_hull
    返回包含对象中所有点的凸包


学习时间及产出:

  • 4.11 完成shapely库的Point、LineString、LinearRing、Polygon学习
  • 4.12 shapely库的几何对象关系方法

参考文章

链接:
Task1地理数据分析常用工具.ipynb;
30分钟学会shapely空间几何分布;
python地理处理包-shapely介绍及用户手册;

上一篇:javascript-在d3js中寻找具有特定投影的世界地图


下一篇:javascript – 为什么ng-href在解析地理字符串时表现得很奇怪