前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >python与地理空间分析(一)

python与地理空间分析(一)

作者头像
MeteoAI
发布2019-07-24 16:22:26
7.8K0
发布2019-07-24 16:22:26
举报
文章被收录于专栏:MeteoAIMeteoAI

一. 概述

在气象数据分析中,地理空间要素是一个必须考虑的关键特征项,也是重要的影响因素。例如气温会随着海拔的升高而降低,地形的坡向朝向也会影响风速的分布,此外,典型的地形会形成特定的气候条件,也是数据挖掘中可以利用的区域划分标准。数据分析中,地理空间分析往往能提供有效的信息,辅助进行决策。随着航空遥感行业的发展,积累的卫星数据也成为了数据挖掘的重要数据来源。 地理空间分析有好多软件可以支持,包括Arcgis,QGIS等软件平台,本系列文章将会着重分享python在地理空间分析的应用。主要包括地理空间数据的介绍,常用的python包,对矢量数据的处理,对栅格数据的处理,以及常用的算法和示例。 地理空间数据包括几十种文件格式和数据库结构,而且还在不断更新和迭代,无法一一列举。本文将讨论一些常用的地理空间数据,对地理空间分析的对象做一个大概的了解。 地理空间数据最重要的组成部分:

•地理位置 标示数据空间位置的信息,例如经纬度•主题信息 主题信息涵盖的范围广泛,可以是卫星的光谱数据,也可以是对应地理位置的统计数据如人口,面积,长度等•此外,空间索引一般也是地理空间数据的共性,空间索引创建了一个向导,能够让软件无需扫描数据集中的每一行记录快速定位查询结果。

二. 矢量数据格式

矢量数据目前是最常用的地理空间格式,因为它是存储空间信息最有效的一种方式。矢量数据只存储几何图元,包括点、线和多边形。可供选择的矢量格式数目很饿的,开源矢量库OGR支持超过86种矢量格式,FME支持超过188种矢量格式。下面将简单介绍击中常用的数据格式:

Shapefile文件

使用最普遍的地理空间格式是Esri的Shapefile文件,可以通过arcgis软件或者第三方转换工具包将任意格式的矢量数据转换成Shapefile文件格式,例如OGR库,python中解析Shapefile文件的模块大都是基于OGR库的。 Shapefile文件格式是有多个文件组成,最重要的文件包括3种,.shp、.shx、.dbf文件。•.shp 用于存储要素几何的主文件,其中包含几何图形(读取的对象)•.shx 形状索引文件,可以加快访问速度•.dbf 数据库文件,包括几何要素的属性信息•其他 .prj 以WKT格式存储的地图投影信息 Shapefile文件是一个整体,重命名文件和编辑文件时,需要相关文件保持一致,否则很容易导致数据错误无效。

CAD文件

CAD是工程制图常用的文件格式,一般是通过AutoCAD软件创建的,格式后缀一般为DXF或DWG虽然,在工程制图中也会应用到一些地理空间分析的算法,但是一般的地理空间分析工具对其支持非常少,在实际应用中也很少见。

标签和标记格式

当用arcgis或者QGIS等软件打开数据的时候,会产生相应xml结尾的文件,这就是一种最常见的基于标签的标记格式,XML格式,此外还有用作投影信息文件的WKT格式,google earth常用的KML文件格式,以及GPS中常用的GPX文件。 标签和标记格式的文件一般具有可读性高,编辑方便,兼容性和扩展性较好等特点,但数据的存储比较低效,在数据庞大的情况下,编辑体验非常糟糕。

GeoJSON文件

GeoJSON文件是基于JavaScript对象表示格式的一种新的、智能化的文本格式,已被主流的地理空间软件和大部分网站发布数据所采用,因为JavaScript是动态网页支持的语言,GeoJSON能够和JavaScript无缝集成。 GeoJSON和python的字典和列表等数据类型几乎一模一样,python内置的json库,可以直接解析JSON文件

代码语言:javascript
复制
{ "type":"GeometryCollection",
 "geometries"[
 {
     "type":"Point",
     "coordinates":[-89.33,30.0]
 }
 ]
}

这就定义了一个包含一个点的GeoJSON文件,可以直接赋值给python的数据结构。由于结构紧凑,使用JavaScript语法编写对于互联网格式友好,并且支持主流编程语言,GeoJSON也是当前流行的地理空间REST Web API的一个重要组件。

三. 栅格数据格式

栅格数据是由若干行或列的单元或者像素构成的,每个单元代表一个数值。地理空间栅格数据常用来存放卫星遥感数据,使用一个像元对应的地面距离来表达空间分辨率;此外栅格数据可以包含多个光谱波段的数据,例如常用的可见光以及红外波段,有的像高光谱数据,会包含成百上千个波段数据,可以通过不同波段的组合生成不同的专题地图。 栅格数据另外一种常见的应用是科学计算,例如HDF数据以及气象中常用的NetCDF,GRIB数据等,这些格式更像是文件系统中的字典,并且包含多个数据集或者相同数据集的多个版本。 和矢量数据类似,栅格数据也包含多种格式,比较常用的开源栅格库是地理空间数据抽象库(GDAL),支持超过130种栅格数据格式。常用的栅格数据格式包括:

TIFF文件

标记化图片文件格式(TIFF)是地理空间最常用的栅格格式。TIFF文件可以包含多波段,整型高程数据,基本元数据,内部压缩以及其他常用的存储辅助信息的文件格式。TIFF文件可以通过添加标记数据进行扩展,GeoTIFF就是扩展定义的地理空间数据的存储,常用的后缀.tif,.tiff和.gtif。

JPEG,GIF,BMP和PNG文件

JPEG、GIF、BMP和PNG格式是很常见的图片格式,但是一般来说,他们也可以存储基本的地理空间数据。通常这些格式依赖于相关的地理参考信息的辅助文本文件才能够在GIS软件中使用,例如WKT,prj等文件。

压缩格式

地理空间栅格数据往往占用的空间比较大,需要采用高级的压缩算法进行存储。最新的开放格式是JPEG2000,包含小波压缩算法和地理参照数据。多分辨率无缝影像数据库(MrSID).sid和增强型小波压缩.ecw是地理空间分析应用中常用到的两种小波压缩格式。TIFF格式支持的压缩算法包括Lempel-Ziv-Welch算法。压缩算法节省了数据的存储空间,但数据本身会被修改,丢弃了部分原始数据信息,因此在做分析中需要注意。

ASCII格式

ASCII网格文件就是将栅格数据存放在一个文本文件中,包含数据本身和数据的信息,通过文件头,读取数据。文件头基本包含行列数,起始坐标,单位,无效值的定义等信息

全球文件

世界文件由一些简单的文本构成,能够以外部文件的形式提供地理空间参考信息,世界文件结构非常简单,常包含的信息包括:•x方向单位大小•y轴偏转角的•x轴偏转角度•y方向单元大小•左上角x坐标•左上角y坐标 通过世界文件提供的信息(常用的6要素),可以计算坐标系内任意单元的坐标,从而获取文件的地理参考信息。

其他数据

除了矢量和栅格数据外,地理空间数据还有其他形式例如:

•点云数据:点云数据根据物体表面的反射能量获取相应的三位坐标信息。一般通过激光器,雷达波,声学探测仪以及其他波形设备获取。目前常用到的场景包括全球地形绘制以及智能驾驶的距离探测,常用的格式LIDAR交换格式(LAS)•Web服务 地理空间Web服务允许用户执行数据发现,数据可视化和数据跨平台访问等操作。常用的协议有返回一张地图图片的网络地图服务(WMS)和返回GML格式文件的网络要素服务(WFS),目前天地图提供了多种Web服务,可以去尝试

四. 常用的python地理空间分析工具

python是一门非常强大的编程语言,对于地理空间分析方面的应用有多种包提供支持,常见的python

python的标记、标签解析器

python的minidom模块是一个历史悠久、简便易用的XML解析器,它能够解析XML文件并且可以把XML源当作数据串处理。适用于处理XML,KML格式的数据。

代码语言:javascript
复制
from xml.dom import minidom
kml=minidom.parse("time-stamp-point.kml")
Placemarks=kml.getElementsByTagName("Placemark")
coordinates=Placemarks[0].getElementsByTagName("coordinates")
point=coordinates[0].firstChild.data

可以获取kml文件的标签,坐标信息。 此外python中也提供了元素树(ElementTree)解析XML的工具,允许使用路径样式的语法对XML文档进行查询。

代码语言:javascript
复制
import xml.etree.cElementTree as ET
tree=ET.ElementTree(file="time-stamp-point.kml")
ns="{http://www.opengis.net/kml/2.2}"
Placemark=tree.find(".//%sPlacemark"% ns)

minidom和ElementTree能够解析处理结构完好的XML文档,但是并不是所有的XML文档都是规范的。BeautifulSoup模块主要用来处理格式错误的XML文件,也可以解析HTML文件

代码语言:javascript
复制
from bs4 import BeautifulSoup
gpx=open("broken_data.gpx")
soup=BeautifulSoup(gpx.read(),features="xml")

此外,WKT也是周婵次常用的表达几何图形和空间索引的标记文本文件,读写WKT格式最佳的是使用Shapely库

代码语言:javascript
复制
import shapely.wkt
wktPoly="POLYGON((0 0,4 0,4 4,0 4,0 0),(1 1,2 1,2 2,1 2,1 1))"
poly=shapely.wkt.loads(wktPoly)

这就定义了一个多边形的几何图形,此外利用OGR也可以处理wkt文件。

python的JSON库

javascript对象标记是目前非常流行的一种数据格式,python也提供了读写JSON文件的库。 可以通过eval函数直接解析为python中的字典的数据形式,但是eval并不能支持所有JSON中的字符集,因此并不是一种可靠的处理方式。 python标准库中提供的json模块可以提供可靠的JSON文本解析处理。

代码语言:javascript
复制
import json
json.loads(jsdata)

此外,geojson库可以更好的支持geojson文本的解析

代码语言:javascript
复制
import geojson
p=geojson.Point([-92,37])
geojs=geojson.dump(p)

OGR库

OGR库是python处理矢量数据的通用库,也是许多处理矢量数据包的依赖项。

代码语言:javascript
复制
from osgeo import ogr
shp=ogr.Open("point.shp")
layer=shp.GetLayer()
for feature in layer:
    geometry=feature.GetGeometryRef()
    print(geometry.GetX(),geometry.GetY(),feature.GetField("FIRST_FLD"))

这个是OGR读取shp文件的简单示例

PyShp

PyShp是一个简单的完全使用python实现的包,主要用来读写shapefile文件,但是它并不能支持几何操作。

代码语言:javascript
复制
import shapefile
shp=shapefile.reader("point.shp")
for features in shp.shapeRecords():
     point=feature.shape.points[0]
     rec=feature.record[0]
     print(point[0],point[1],rec)

和上面一样,简单的读取shp文件的示例

dbfpy3

除了OGR,PyShp这种直接操作shp文件的库外,dbfpy3提供了直接处理shp文件中的dbf文件项的功能,更方便快捷。

代码语言:javascript
复制
from dbfpy3 import dbf
db=dbf.Dbf("point.dbf")
rec=db[0]
field=rec["POPULAT10"]
rec["POPULAT10"]=field+1
rec.store()
del rec

对dbf文件进行读写和编辑

Shapely

Shapely在wkt操作中有了简单的演示,可以提供对矢量数据的读写,但是着重于对矢量数据的几何操作。

代码语言:javascript
复制
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)
pritn(buf.area)

通过wkt,定义了一个多边形,计算多边形的面积;计算5个单位的缓冲区分析,并计算缓冲区的面积

Fiona

Fiona模块为OGR哭的数据访问功能提供了一套简洁的python api,大大提高了OGR库在python中的易用性。Fiona默认的输出格式是GeoJSON

代码语言:javascript
复制
improt fiona
import pprint #格式化输出
f=fiona.open("point.shp")
print(f.crs)
pprint.pprint(f.schema)

GDAL

GDAL库是处理栅格数据的主流地理空间库,也是多种地理空间分析软件和程序包的栅格处理的基础包。

代码语言:javascript
复制
from osgeo import gdal
raster=gdalOpen("SatImage.tif")
print(raster.RasterCount)
print(raster.RasterXSize)
print(raster.RasterYSize)

简单的读取栅格文件的示例 此外可以结合其他模块进行交互处理。 依赖与numpy库可以读取遥感图像为数组,方便处理。

代码语言:javascript
复制
from osgeo import gdal_array
srcArray=gdal_array.LoadFile("SatImage.tif")
band1=srcArray[0]
gdal_array.SaveArray(band1,'band1.jpg',format="JPEG")=

读取遥感图像的第一个波段为数组,并存成jpg文件

PIL

PIL库原本是用来处理遥感影像数据的,但现在一般用于图像编辑,PIL库有点庞大,如果只是轻量级处理图像,可以使用PNGCanvas库进行代替。

GeoPandas

GeoPandas是由Shapely,Fiona,PyProj,matplotlib以及其他必需的库一同构建的Pandas的地理空间扩展。下面的示例将会打开一个ShapeFile文件并将其转存为GeoJSOM格式,之后使用matplotlib库创建地图

代码语言:javascript
复制
import geopandas
import matplotlib.pyplot as plt
gdf=geopandas.GeoDataFrame
census=gdf.from_file("GIS_CENSUS_poly.shp")
census.plot()
plot.show()

Spectral Python

python的光谱功能包,是一个专门处理遥感波段数据的高级光能包,适用于高光谱处理方面的应用。

总结

这篇文章是python地理空间分析的一个开头,简单介绍了地理空间分析对于数据分析和气象的重要作用,介绍了地理空间分析的对象,常用到的数据以及python中对这些数据处理设计到的常用的包。接下来将会对利用python地理空间分析进行分开详细介绍。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-05-30,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 MeteoAI 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一. 概述
  • 二. 矢量数据格式
    • Shapefile文件
      • CAD文件
        • 标签和标记格式
          • GeoJSON文件
          • 三. 栅格数据格式
            • TIFF文件
              • JPEG,GIF,BMP和PNG文件
                • 压缩格式
                  • ASCII格式
                    • 全球文件
                    • 其他数据
                    • 四. 常用的python地理空间分析工具
                      • python的标记、标签解析器
                        • python的JSON库
                          • OGR库
                            • PyShp
                              • dbfpy3
                                • Shapely
                                  • Fiona
                                    • GDAL
                                      • PIL
                                        • GeoPandas
                                          • Spectral Python
                                          • 总结
                                          相关产品与服务
                                          数据库
                                          云数据库为企业提供了完善的关系型数据库、非关系型数据库、分析型数据库和数据库生态工具。您可以通过产品选择和组合搭建,轻松实现高可靠、高可用性、高性能等数据库需求。云数据库服务也可大幅减少您的运维工作量,更专注于业务发展,让企业一站式享受数据上云及分布式架构的技术红利!
                                          领券
                                          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档