python与地理空间分析(一)

2019-07-24 16:22:26 浏览数 (1)

一. 概述

在气象数据分析中,地理空间要素是一个必须考虑的关键特征项,也是重要的影响因素。例如气温会随着海拔的升高而降低,地形的坡向朝向也会影响风速的分布,此外,典型的地形会形成特定的气候条件,也是数据挖掘中可以利用的区域划分标准。数据分析中,地理空间分析往往能提供有效的信息,辅助进行决策。随着航空遥感行业的发展,积累的卫星数据也成为了数据挖掘的重要数据来源。 地理空间分析有好多软件可以支持,包括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地理空间分析进行分开详细介绍。

0 人点赞