《Python地理空间分析指南 第2版》学习笔记-5.6查询优化

13 篇文章 4 订阅
6 篇文章 0 订阅

5.6.1点包容性公式

主要利用光影投射法执行检查操作。
该方法会从测试点创建一条直线并穿过多边形,之后会计算其和多边形每条边相交后产生的点的个数。

  • 如果该数目是偶数,那么点在多边形外部
  • 如果该数目是奇数,那么点在多边形内部

def point_in_poly(x, y, poly):
    # 检查是不是顶点
    if (x, y) in poly:
        print("是顶点")
        return True


    # 检查影像是否在边界
    length = len(poly)
    for i in range(length):
        p1 = None
        p2 = None
        if i == 0:
            p1 = poly[0]
            p2 = poly[1]
        else:
            p1 = poly[i-1]
            p2 = poly[i]
        # 判断点在poly范围内
        if p1[1] == p2[1] and p1[1] == y and x > min(p1[0],p2[0]) and x < max(p1[0], p2[0]):
            print("在边界上")
            return True

    n = len(poly)
    inside = False

    p1x, p1y = poly[0]
    for i in range(n+1):
        p2x, p2y = poly[i % n]
        #test = i % n
        #print("test:",test)
        if y > min(p1y, p2y):
            if y <= max(p1y, p2y):
                if x <= max(p1x, p2x):
                    if p1y != p2y:
                        xints = (y-p1y)*(p2x-p1x)/(p2y-p1y)+p1x
                    if p1x == p2x or x <= xints:
                        inside = not inside
        p1x, p1y = p2x, p2y

    if inside:
        print("在内部")
        return True
    print("在外部")
    return False

if __name__ == '__main__':

    #  判断一个点是否包含在某区域
    myPolygon = [(-70.593016, -33.416032), (-70.589604, -33.415370),
                 (-70.589046, -33.417340), (-70.592351, -33.417949),
                 (-70.593016, -33.416032)]
    # 测试位置点1
    lon = -70.592000
    lat = -33.416000

    print(point_in_poly(lon, lat, myPolygon))


    # 测试位置点2
    lon = -70.593016
    lat = -33.416032
    print(point_in_poly(lon, lat, myPolygon))
    # 测试位置点3
    lon = -73.593016
    lat = -33.416032
    print(point_in_poly(lon, lat, myPolygon))

测试位置点1:
在内部
True

测试位置点2:
是顶点
True

测试位置点3:
在外部
False

5.6.2边框查询

使用个简单的边框将一个复杂的特征集子集化,之后将其保存为一个新的Shapefile文件。

"""Shapefile spatial query"""

# https://github.com/GeospatialPython/Learn/raw/master/roads.zip

import shapefile

# 读取数据
r = shapefile.Reader(r"roads\roadtrl020")
# 创建一个w文件,用于写入在选择区内的r数据
with shapefile.Writer(r"roads\Puerto_Rico_Roads", r.shapeType) as w:
    # 字段
    w.fields = list(r.fields)
    # 定义选择区域的范围
    xmin = -67.5
    xmax = -65.0
    ymin = 17.8
    ymax = 18.6
    # 循环读取r文件的记录
    for road in r.iterShapeRecords():
        # 定义shape
        geom = road.shape
        # D定义记录
        rec = road.record
        # 得到每条记录的外包矩形范围
        sxmin, symin, sxmax, symax = geom.bbox
        # 判断是否在所选的范围内
        if sxmin < xmin:
            continue
        elif sxmax > xmax:
            continue
        elif symin < ymin:
            continue
        elif symax > ymax:
            continue
        # 在范围内的线被添加到新的图层中
        w.line([geom.points])
        w.record(*list(rec))

roadtrl020数据

在这里插入图片描述

右下角是要查询的结果
在这里插入图片描述

5.6.3 属性查询一

使用属性表获取矢量数据子集的方法,通过记录表中的城市人口密度来进行筛选,选择城市人口密度小于5000的要素。

在这里插入图片描述


import shapefile
# 读取矢量文件
r = shapefile.Reader(r"MS_UrbanAnC10/MS_UrbanAnC10.shp")
with shapefile.Writer(r"MS_UrbanAnC10/MS_UrbanAnC10_subset.shp", r.shapeType) as w:
    w.fields = list(r.fields)

    selection = []
    # 打印第一条记录
    print(r.record())
    # 打印所有记录
    print(r.records())
    # 注意enumerate的用法,
    for rec in enumerate(r.records()):
        if rec[1][15]<5000:
            # print(rec[0])
            # print(rec[1])
            # print(rec[1][15])
            selection.append(rec)

    for rec in selection:
        # 添加形状
        w.poly([r.shape(rec[0]).points])
        # 添加记录
        w.record(*list(rec[1]))

结果:
在这里插入图片描述

5.6.3 属性查询二

使用fiona库在上一个示例中的表现,该库能够方便地调用OGR库。

import fiona

with fiona.open(r"MS_UrbanAnC10/MS_UrbanAnC10.shp") as sf:
    #将使用嵌套语句适当缩减打开和关闭文件代码的数量。
    filtered = filter(lambda f:f["properties"]["POP"]<5000,sf)
    #shapefile文件格式驱动
    drv = sf.driver
    # 参考坐标系
    crs = sf.crs
    #Dbf架构
    schm = sf.schema
    #定义子集文件名
    subset = r"MS_UrbanAnC10/MS_UrbanAnC10_FionaSubset.shp"
    with fiona.open(subset,"w",driver = drv,crs = crs,schema = schm) as w:
        for rec in filtered:
            w.write(rec)

总结

本节介绍了两种空间查询,两种属性查询的案例。

《Python地理空间分析指南 第2版》学习笔记,仅供学习,如有侵权请联系删除。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 《Python地理空间分析指南(第2).pdf》是一本介绍如何使用Python进行地理空间分析和数据处理的指南。本书作者为Jordi Puigdellívol,是一位GIS顾问和开发人员,他在书中详细介绍了如何使用Python以及几个与地理空间数据相关的库,如GeoPandas、Shapely和Fiona等。 该指南首先从Python编程语言的基础知识开始介绍,在此基础上,引导读者如何使用Python进行地理空间分析。其次,书中还介绍了如何使用Python处理和分析矢量数据、栅格数据、以及使用Python进行空间插值和空间统计分析。同时,书中也对如何在Python中进行可视化进行了详细的介绍。 此外,本书还包括了很多实例和代码示例,读者可以通过这些实例来加深自己对Python地理空间分析的理解和应用。总之,《Python地理空间分析指南(第2).pdf》是一本非常实用的书籍,对于希望使用Python进行地理空间分析和数据处理的读者而言,这是一本非常值得阅读的指南。 ### 回答2: 《Python地理空间分析指南》第2是一本介绍如何使用Python进行地理空间分析的书籍。该书主要涉及了GIS(地理信息系统)、Python编程、数据可视化等方面的内容。作者使用ArcGIS作为GIS软件,同时也介绍了如何使用GDAL、Shapely、Fiona、Descartes、Matplotlib等开源软件进行地理空间分析,并提供了大量实际案例供读者参考。 对于GIS从业者来说,该书是非常有价值的。它不仅提供了Python编程的基础知识,还介绍了如何将Python和GIS软件结合使用,使读者可以更加高效地进行数据分析和处理。此外,该书还涵盖了很多实用技巧,比如如何通过Python创建空间索引、如何使用矢量数据分析工具和栅格数据分析工具等。 对于Python开发者来说,该书也是一本不错的参考书籍。它介绍了如何使用Python开发GIS应用程序,并提供了许多实践案例。此外,该书还介绍了新的Python库和工具,如Geopandas和PySAL。 总的来说,《Python地理空间分析指南》是一本非常实用的书籍,对于想要学习如何使用Python进行地理空间分析的读者来说是一个不错的选择。 ### 回答3: 《Python地理空间分析指南》第2是一本介绍如何使用Python进行地理空间数据分析的书籍。它主要介绍了Python地理空间分析中的应用,包括了许多重要的地理空间分析工具和库。本书作者根据自己多年的实践经验,结合大量的实例,详细地讲解了如何使用Python进行地理空间分析。读者可以通过本书了解到如何使用Python来处理和分析地理空间数据,如何使用常用的Python库如GeoPandas、Shapely、PySAL等来进行地理空间计算、图形绘制和地理空间统计分析。此外,本书还介绍了如何在Jupyter notebook中使用Python进行地理空间数据可视化以及如何使用Python实现地理空间机器学习模型。总之,《Python地理空间分析指南》第2是一本非常实用的手册,非常适合那些对地理空间分析有兴趣的Python开发者、数据科学家和地理空间科学家阅读和学习
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值