11_空间计算

空间计算

空间分析方法

包含一些空间分析的方法和地理数据处理函数。

首先创建两个polygon shp文件。

在这里插入图片描述


Intersection

Intersection有两个实现方式,一个是从layer实现,另一个是geometry实现。

Layer

layer的实现方式是直接调用Intersection函数。

Intersection(Layer self, Layer method_layer, Layer result_layer, char ** options=None, GDALProgressFunc callback=0, void * callback_data=None)→ OGRErr

method_layer指另一个图层;

result_layer指结果保存的图层,需要新建一个图层用于存储;

其他的参数是可选参数,比如挂钩等。

# -*- coding: utf-8 -*-
# 学习时间: 2022/11/23 16:28

__author__ = 'He XK'

import os
from osgeo import ogr, gdal

if __name__ == '__main__':
    gdal.SetConfigOption("GDAL_FILENAME_IS_UTF8", "YES")
    gdal.SetConfigOption("SHAPE_ENCODING", "UTF8")

    poly_path1 = 'shp/ploygon_1.shp'
    poly_path2 = 'shp/polygon_2.shp'
    output_path = 'shp/demo26_intersection.shp'
    driver = ogr.GetDriverByName('ESRI SHAPEFILE')
    # 打开两个叠加的shp文件
    ploy_ds1 = driver.Open(poly_path1)
    ploy_layer1 = ploy_ds1.GetLayer()
    print(dir(ploy_layer1))

    ploy_ds2 = driver.Open(poly_path2)
    ploy_layer2 = ploy_ds2.GetLayer()
    # 参考系
    ref_srs = ploy_layer1.GetSpatialRef()

    if os.path.exists(output_path):
        driver.DeleteDataSource(output_path)
    else:
        print('THIS SHP IS NOT EXIST!')
    # 创建intersection的shp
    intersection_shp = driver.CreateDataSource(output_path)
    # 创建intersection的layer
    intersection_layer = intersection_shp.CreateLayer('intersection', srs=ref_srs, geom_type=ogr.wkbPolygon)
    # 执行图层下的Interscetion
    ploy_layer1.Intersection(ploy_layer2, intersection_layer)

在这里插入图片描述

叠加后shp的属性表会将两个表的直接合并。

应该可以通过Options中对这里进行设置。

在这里插入图片描述

Geometry

相同的方法,在geometry下也有一套。

  1. 基本思想是创建新的shp文件的正常流程,直到创建geometry

  2. 因为新的geometry是通过空间计算实现的,那么获取需要进行空间计算的两个原始geometry

  3. feature进行SetGeomtery

不同于Layer的空间计算,对Geometry的计算不怎么会对属性表进行修改,应该是自己设定的。

__author__ = 'He XK'

import os
from osgeo import ogr, gdal

if __name__ == '__main__':
    gdal.SetConfigOption("GDAL_FILENAME_IS_UTF8", "YES")
    gdal.SetConfigOption("SHAPE_ENCODING", "UTF8")

    poly_path1 = 'shp/ploygon_1.shp'
    poly_path2 = 'shp/polygon_2.shp'
    output_path = 'shp/demo27_geom_intersection.shp'
    driver = ogr.GetDriverByName('ESRI SHAPEFILE')
    # 打开两个叠加的shp文件
    # 获取两个geometry
    ploy_ds1 = driver.Open(poly_path1)
    ploy_layer1 = ploy_ds1.GetLayer()
    ploy_feat1 = ploy_layer1.GetFeature(0)
    ploy_geom1 = ploy_feat1.GetGeometryRef()

    ploy_ds2 = driver.Open(poly_path2)
    ploy_layer2 = ploy_ds2.GetLayer()
    ploy_feat2 = ploy_layer2.GetFeature(0)
    ploy_geom2 = ploy_feat2.GetGeometryRef()
    # 参考系
    ref_srs = ploy_layer1.GetSpatialRef()
    # 判断新shp是否存在
    if os.path.exists(output_path):
        driver.DeleteDataSource(output_path)
    else:
        print('THIS SHP IS NOT EXIST!')

    # 创建新shp
    Intersection_shp = driver.CreateDataSource(output_path)
    Intersection_layer = Intersection_shp.CreateLayer('Intersection', srs=ref_srs, geom_type=ogr.wkbPolygon)
    # 创建两个新字段
    new_field_def = ogr.FieldDefn('ID', ogr.OFTString)
    new_field_def.SetWidth(4)
    Intersection_layer.CreateField(new_field_def)
    new_field_def2 = ogr.FieldDefn('Name', ogr.OFTString)
    new_field_def2.SetWidth(10)
    Intersection_layer.CreateField(new_field_def2)
    # 新建feature
    feature_defn = Intersection_layer.GetLayerDefn()
    feature = ogr.Feature(feature_defn)

    # 对geometry进行空间分析
    geometry = ploy_geom1.Intersection(ploy_geom2)
    feature.SetGeometry(geometry)
    feature.SetField('ID', '1')
    feature.SetField('Name', 'Intersection')
    Intersection_layer.CreateFeature(feature)

    Intersection_shp.Destroy()
    ploy_ds1.Destroy()
    ploy_ds2.Destroy()

Clip

Layer下的裁剪,保留两者的相交部分,同时所有属性继承原始图层。

Clip方法和Intersectionlayer下的使用方法一致。

    # 创建clip的shp
    clip_shp = driver.CreateDataSource(output_path)
    # 创建clip的layer
    clip_layer = clip_shp.CreateLayer('clip', srs=ref_srs, geom_type=ogr.wkbPolygon)
    # 执行图层下的Clip
    ploy_layer1.Clip(ploy_layer2, clip_layer)

Erase

Layer下的擦除,对第一个图层擦除第二个图层的所有覆盖区域。

使用方法同上。
在这里插入图片描述

Geometry

Geometry下的图形差为Difference

    geometry = ploy_geom1.Difference(ploy_geom2)
    feature.SetGeometry(geometry)

SymDifference

Layer下的交集取反。

会同时保留两个图斑的属性表。

Geometry

Geometry下也有相同的方法。

效果一致。

之前是SymmetricDifference,现在已经弃用。


Union

Layer下的合并。

每一个图斑均保留原始表的内容。

Geometry

两个图层完全叠加。

合并成一个结果。


Update

Layer下的更新。

新图层的信息全部覆盖在旧图层上。


Geometry的一些方法

Area/GetArea

计算面积。

数值格式根据坐标系。

两个方法都能获得相同结果。

print(ploy_geom1.Area())  # 16377954041.156048
print(ploy_geom1.GetArea())

Boundary

输出边界点。

print(geometry.Boundary())


LINESTRING (-2.73858598358906 1.03534143330197,-2.89245982694685 1.21878862793572,-2.81334981458591 1.29048207663782,-2.71693448702101 1.24103831891224,-2.61432077533545 1.19999283423801,-2.5982694684796 1.221260815822,-2.46229913473424 1.23609394313968,-1.84672435105068 1.04079110012361,-2.03955500618047 0.976514215080346,-2.1372068674231 0.753573173375478,-2.04202719406675 0.687268232385661,-1.59456118665019 0.72929542645241,-2.06922126081582 0.237330037082818,-2.26243414697124 0.467676931388221,-2.30160692212608 0.378244746600742,-2.90482076637824 0.543881334981459,-2.79604449938195 0.959208899876391,-2.73858598358906 1.03534143330197)

Buffer

生成缓冲区。

Buffer的参数是缓冲区的距离,大概是经纬度。

    geometry = ploy_geom1.Union(ploy_geom2)
    buffer_geometry = geometry.Buffer(0.05)
    feature.SetGeometry(buffer_geometry)
    feature.SetField('ID', '1')
    feature.SetField('Name', 'Union')
    Intersection_layer.CreateFeature(feature)

Equal

判断两个geometry是否相等。也可以判断两个feature是否相等。

    print(ploy_geom1.Equal(ploy_geom2))  # False
    print(ploy_feat1.Equal(ploy_feat2))  # False

Distance

判断两个geometry之间的距离。

距离是根据坐标系进行设定,输出为经纬度或者米。

print(ploy_geom1.Distance(ploy_geom2))  # 4389436.811227667

GetEnvelope

用一个矩形框框住geometry,并输出四角坐标。

print(ploy_geom1.GetEnvelope())  # (364569.2989536035, 542313.771464216, 4366164.098800393, 4545610.733098222)

Centroid

输出多边形重心。

print(ploy_geom1.Centroid())  # POINT (449703.811184568 4448557.64221896)

ConvexHull

计算geometry的凸包。

就是将所有边界点连接起来的一个轮廓。

返回一个wkt格式。

print(ploy_geom1.ConvexHull()) 
POLYGON ((452598.428137285 4366164.09880039,451708.941561734 4366211.5354748,443724.638891124 4366952.3398858,393688.840430676 4374162.34681132,392650.509185358 4374506.25757718,376558.07027977 4384239.78219919,372579.466977699 4387136.69237364,369345.62864206 4390608.43138601,368633.396871585 4392472.31001927,364612.129484277 4403576.43814011,364569.298953603 4404110.46314706,364614.375189319 4424458.71829548,364777.803985495 4425193.7341559,366925.753387088 4431778.1418378,393510.571504053 4487479.64607932,393793.30103881 4487934.71601874,394434.844431397 4488793.84675139,395587.625176747 4489878.90165107,396047.517509678 4490307.48096902,444108.501168617 4531977.91247118,444619.259443954 4532279.34495157,467633.405301227 4545288.30924319,468220.176873211 4545538.96245083,468958.23257795 4545610.73309822,469517.490274646 4545505.92081385,472482.765065007 4543889.50479539,541368.261111046 4502531.08649925,542027.537776356 4501928.90862743,542313.771464216 4499161.23966294,532531.484945201 4447185.84646421,532402.932114777 4446983.7257594,491469.648182302 4392214.65100402,485338.246093505 4385813.23161054,481107.289882297 4382969.71594162,452598.428137285 4366164.09880039))

在这里插入图片描述


判断两个对象之间的关系

Intersect

判断两个geometry是否相交。

print(ploy_geom1.Intersect(ploy_geom2))  # True

Disjoint

判断两个geometry是否不相交。

print(ploy_geom1.Disjoint(ploy_geom2))  # False

Touches

判断两个geometry是否邻接,边界是否相邻。

print(ploy_geom1.Touches(ploy_geom2))  # False

Crosses

判断是否第二个geometry是否穿过第一个geometry

一般适用line穿过。

print(ploy_geom1.Crosses(ploy_geom2))  # False

Within

判断是否第一个geometry是否在第二个geometry中。

print(ploy_geom1.Within(ploy_geom2))  # False

Contains

判断第二个 geometry是否在第一个geometry内部。

print(ploy_geom1.Contains(ploy_geom2))  # False

Overlaps

判断两个是否重叠。

print(ploy_geom1.Overlaps(ploy_geom2))  # True
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值