zoukankan      html  css  js  c++  java
  • GIS Experience (十):Python地理空间数据分析

    备注:虽然在Pycharm中借助SciView可以很好地进行分屏显示,但地图数据一般数据量较大,所以用python进行地图可视化需要先行关闭。在这里插入图片描述

    前言

    GISer都知道在常用的桌面端GIS应用ArcGIS和QGIS工具中都大量的使用了Python语言,考虑到当前python也被大量应用到机器学习和人工智能领域,在进行空间处理时候直接通过编写代码也可以使得工作更为高效。

    空间处理库 链接地址 描述
    geopandas https://pypi.org/project/geopandas/#files 扩展pandas对地理数据的支持
    pyproj https://pypi.org/project/pyproj/#files 坐标转换
    Shapely https://pypi.org/project/Shapely/#files 2D地理对象操作及分析
    Fiona https://pypi.org/project/Fiona/#files 空间数据读写
    pyshp https://pypi.org/project/pyshp/#files ESRI系列空间数据读写
    GDAL https://pypi.org/project/GDAL/#files gdal用于复杂地理栅格数据处理,ogr用于复杂地理矢量数据处理
    pysal https://pypi.org/project/pyshp/#files 空间分析
    geoplot https://pypi.org/project/geoplot/ 空间可视化
    geopy https://pypi.org/project/geopy/ 网页地图服务-空间定位

    1 入门级

    1.1 geopandas

    GeoPandas主要目的是使得在Python环境下更方便的处理地理空间数据,其扩展了pandas的数据类型,允许其在几何类型上进行空间操作。几何操作由 shapely执行,fiona进行文件存取,并借助descartes和matplotlib 进行绘图,详见geopandas官方文档

    备注:pip install geopandas时候可能存在无法安装的情况,可以前往国内镜像网站直接下载并安装对应的whl文件。
    1)http://mirrors.aliyun.com/pypi/simple/ 阿里云
    2)https://pypi.mirrors.ustc.edu.cn/simple/ 中国科技大学
    3)https://pypi.tuna.tsinghua.edu.cn/simple/ 清华大学
    4)http://pypi.mirrors.ustc.edu.cn/simple/ 中国科学技术大学
    5)http://pypi.sdutlinux.org/ 山东理工大学
    6)http://pypi.hustunique.com/ 华中理工大学
    7)https://www.lfd.uci.edu/~gohlke/pythonlibs/ 加利福利亚大学
    8)http://pypi.douban.com/ 豆瓣

    '''读写数据'''
    # 读取shp数据
    df = gpd.GeoDataFrame.from_file("Point.shp")
    
    # 写入为shp数据
    df.to_file(filename="New_Point.shp", driver="ESRI Shapefile", schema=None)
    # 写入为geojson数据
    df.to_file("Point.geojson", driver='GeoJSON')
    # 写入为geopackage数据
    df.to_file("Point.gpkg", layer='Point', driver="GPKG")
    
    '''坐标转换'''
    # way1 proj4写法,详见[spatialreference](https://spatialreference.org/)
    df = df.to_crs(crs="+proj=merc +a=6378137 +b=6378137 +lat_ts=0.0 +lon_0=0.0 +x_0=0.0 +y_0=0 +k=1.0 +units=m +nadgrids=@null +wktext  +no_defs")
    
    # way2 EPSGcode,详见[epsg](http://epsg.io/)
    df = df.to_crs({'init': 'epsg:3857'})
    

    1.2 pyshp

    fionapyshp都可以读写ESRI shapefiles,但pyshp支持的效果更好,相比geopandas将几何地理对象读写为数据框,pyshp是直接读写为几何对象,故pyshp进行坐标和几何信息提取也稍显便捷。

    # 导入shapely
    from shapely import wkt, geometry
     
    wktPoly = "POLYGON((0 0, 4 0, 4 4, 0 4, 0 0))"
    poly = wkt.loads(wktPoly)
     
    # 打印多边形的面积
    print(poly.area)
     
    # 建立缓冲区并计算面积
    buf = poly.buffer(5.0)
    print(buf.area)
     
    # 计算面积差异
    print(buf.difference(poly).area)
    
    import shapefile  # 使用pyshp库
     
    file = shapefile.Reader("data\市界.shp")
    shapes = file.shapes()
     
    # <editor-fold desc="读取元数据">
    print(file.shapeType)  # 输出shp类型
    '''
    NULL = 0
    POINT = 1
    POLYLINE = 3
    POLYGON = 5
    MULTIPOINT = 8
    POINTZ = 11
    POLYLINEZ = 13
    POLYGONZ = 15
    MULTIPOINTZ = 18
    POINTM = 21
    POLYLINEM = 23
    POLYGONM = 25
    MULTIPOINTM = 28
    MULTIPATCH = 31
    '''
    print(file.bbox)  # 输出shp的范围
    # </editor-fold>
    # print(shapes[1].parts)
    # print(len(shapes))  # 输出要素数量
    # print(file.numRecords)  # 输出要素数量
    # print(file.records())  # 输出所有属性表
     
    # <editor-fold desc="输出字段名称和字段类型">
    '''
    字段类型:此列索引处的数据类型。类型可以是:
    “C”:字符,文字。
    “N”:数字,带或不带小数。
    “F”:浮动(与“N”相同)。
    “L”:逻辑,表示布尔值True / False值。
    “D”:日期。
    “M”:备忘录,在GIS中没有意义,而是xbase规范的一部分。
    '''
    # fields = file.fields
    # print(fields)
    # </editor-fold>
     
     
    # <editor-fold desc="输出几何信息">
    for index in range(len(shapes)):
        geometry = shapes[index]
        # print(geometry.shapeType)
        # print(geometry.points)
    # </editor-fold>
    

    1.4 GDAL & OGR

    GDAL和OGR是开源空间信息基金会(Open Source Geospatial Foundation,简称OSGeo)推出的开源空间处理库,两者分别被应用于栅格和矢量数据处理。

    备注:安装QGIS后本地会存在GDAL和OGR,可以将其复制到pycharm或者是Anaconda第三方库文件,此时包引入规则from osgeo import gdal, ogr

    1.5 pysal

    Pysal是一个面向地理空间数据科学的开源跨平台库,重点是用python编写的地理空间矢量数据。它支持空间分析高级应用程序的开发(详见官方文档或者osgeo译制文档)。此外,考虑下载速度原因,采用国内清华镜像下载安装pip install -i https://pypi.tuna.tsinghua.edu.cn/simple pysal,中途若遇到安装Rtree时提示 OSError: could not find or load spatialindex_c-64.dll,请自行前往加利福利亚大学镜像站获取whl文件。

    1.5.1 explore

    用于对空间和时空数据进行探索性分析的模块,包括对点、网络和多边形格的统计测试。还包括空间不等式和分布动力学的方法。

    1.5.2 viz

    可视化空间数据中的模式,以检测集群、异常值和热点。

    1.5.3 model

    用各种线性、广义线性、广义加性和非线性模型对数据中的空间关系进行建模。

    1.5.4 lib

    解决各种各样的计算几何问题:

    • 从多边形格、线和点构建图形。
    • 空间权重矩阵与图形的构建与交互编辑
    • α形状、空间指数和空间拓扑关系的计算
    • 读写稀疏图形数据,以及纯python空间矢量数据阅读器。

    2 进阶级

    2.1 矢量创建

    2.1.1 点转线

    1)由点生成闭合线

        def PointToClosedLine():
        	# 读取shp 地图格式数据,读取后的数据结构为DataFrame格式
        	df = gpd.GeoDataFrame.from_file("折点.shp")
            # 按原始面分组
            dataGroup = df.groupby('ORIG_FID')
            # 打印分组单元的前五行记录
            # print(dataGroup.head(5))
    
            # 构造数据
            tb = []
            geomList = []
            for name, group in dataGroup:
                # 分离出属性信息,取每组的第1行前8列作为数据属性
                tb.append(group.iloc[0, :8])
                # 借助列表推导式,把同一组的点打包到一个list中
                xyList = [xy for xy in zip(group.POINT_X, group.POINT_Y)]
                # 取同一组所有点生成闭合图形
                line = LineString(xyList)
                geomList.append(line)
            # print(tb)
            # 点转线
            geoLine_DataFrame = gpd.GeoDataFrame(tb, geometry=geomList)
            geoLine_DataFrame.plot()
            plot,show()
    

    2)由点生成隔离线段

        def PointToIsolatediLine():
        	# 读取shp 地图格式数据,读取后的数据结构为DataFrame格式
        	df = gpd.GeoDataFrame.from_file("折点.shp")
            # 按原始面分组
            dataGroup = df.groupby('ORIG_FID')
            # 打印分组单元的前五行记录
            # print(dataGroup.head(5))
    
            # 构造数据
            tb = []
            geomList = []
            for name, group in dataGroup:
                # 分离出属性信息,取每组的第1行前8列作为数据属性
                tb.append(group.iloc[0, :8])
                # 借助列表推导式,把同一组的点打包到一个list中
                xyList = [xy for xy in zip(group.POINT_X, group.POINT_Y)]
                for near in range(len(xyList)-1):
                    # 分离出属性信息,取每组的第near行前8列作为数据属性
                    tb.append(group.iloc[near, :8])
                    # 取同一组所有点生成分离图形
                    line = LineString([xyList[near], xyList[near+1]])
                    geomList.append(line)
            # print(tb)
            # 点转线
            geoLine_DataFrame = gpd.GeoDataFrame(tb, geometry=geomList)
            geoLine_DataFrame.plot()
            plot,show()
    

    3 参考资料

    1. GeoPandas 0.6.0
    行走的小柚子
  • 相关阅读:
    实验室网络管理记
    mondrian schema一个简单的例子
    powerdesigner数据库设计导入oracle9i
    linux 的mount命令
    [转]moto面试题
    Oracle数据库服务解释
    数据聚集技术在mondrian中的实现
    发现台湾的mondrian资料 + pentaho截图
    一个封装比较完整的FTP类(转载)
    oracle 网页管理工具登录接口
  • 原文地址:https://www.cnblogs.com/UncleLivin/p/13608481.html
Copyright © 2011-2022 走看看