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) #内扩面积变小
几何对象间的关系
- 几何对象都有内部、边界和外部等特征
- 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
这个方法可以用在判断点是否在环线或者面的内部,也可以延申用在判断线面和面面的包含关系上
-
object.crosses(other)
如果两个几何对象是内部相交(不是包含关系),则返回True -
object.disjoint(other)
如果两个几何对象的既内部不相交又边界不相交,则返回True -
object.intersects(other)
只要两个几何对象有相交点,则返回True -
object.convex_hull
返回包含对象中所有点的凸包
学习时间及产出:
- 4.11 完成shapely库的Point、LineString、LinearRing、Polygon学习
- 4.12 shapely库的几何对象关系方法
参考文章
链接:
Task1地理数据分析常用工具.ipynb;
30分钟学会shapely空间几何分布;
python地理处理包-shapely介绍及用户手册;