Archive for the Category: python

QGIS python开发手册–使用栅格图层

使用栅格图层 图层详细信息 栅格图层一般包含一个或多个波段,即单波段栅格图层或多波段栅格图层。一般来说彩色图形包含红、蓝、绿三个波段。单波段图层一般用来表示连续变量(如高程)或离散变量(如土地利用)。在有些情况下,栅格图层包含一个调色板,栅格值对应的颜色会存储在调色板中,下面代码获取栅格图层的基本信息,例如长度、宽度、范围波段数、元数据等等。 rlayer.width(), rlayer.height() (812, 301) rlayer.extent() <qgis._core.QgsRectangle object at 0x000000000F8A2048> rlayer.extent().toString() u’12.095833,48.552777 : 18.863888,51.056944′ rlayer.rasterType() 2 # 0 = GrayOrUndefined (single band), 1 = Palette (single band), 2 = Multiband rlayer.bandCount() 3 rlayer.metadata() u’<p class=”glossy”>Driver:</p>…’ rlayer.hasPyramids() False 渲染器 当栅格图层加载后,QGIS会根据栅格类型使用一个默认的渲染器。渲染器可以在图层的属性中修改,也可以使用程序修改.下面代码查询当前使用的渲染器: >>> rlayer.renderer() <qgis._core.QgsSingleBandPseudoColorRenderer object at 0x7f471c1da8a0> >>> rlayer.renderer().type() u’singlebandpseudocolor’ 使用QgsRasterLayer对象的setRenderer()方法可以给图层设置渲染器,可选的渲染器包括: * QgsMultiBandColorRenderer * QgsPalettedRasterRenderer […]

Leave a comment

QGIS Python开发手册-加载图层

加载图层 在QGIS中,图层主要分为矢量图层和栅格图层,另外还支持自定义图层,本文不予讨论。 矢量图层 加载矢量图层,需要知道图层的数据源标识、名称和数据源类型(provider),加载代码如下: layer = QgsVectorLayer(data_source, layer_name, provider_name) if not layer.isValid(): print “Layer failed to load!” 根据数据源类型的不同,数据源标识也不同。图层名称用于在图层列表Widget里显示。需要注意的是在加载图层后要判断是否加载成功,可以通过layer的isValid()方法进行判断。 在QGIS中快速打开并显示图层的方式是使用QgisInterface的addVectorLayer方法,代码如下: layer = iface.addVectorLayer(“/path/to/shapefile/file.shp”, “layer_name_you_like”, “ogr”) if not layer: print “Layer failed to load!” 该方法创建一个图层,静将图层假入到地图对象中,其返回一个图层对象。如果图层对象为None,则图层加载失败。 下面介绍加载不同数据源的图层: * OGR–数据源标识为指向文件的路径 vlayer = QgsVectorLayer(“/path/to/shapefile/file.shp”, “layer_name_you_like”, “ogr”) * PostGIS数据库–数据源标识是数据库连接字符串,可以通过QgsDataSourceURI类来生成,需要注意的是QGIS编译的时候选择了支持Postgres,否则不支持PostGIS。代码如下: uri = QgsDataSourceURI() # set host name, port, database name, username and […]

Leave a comment

QGIS python开发手册-加载工程文件

加载工程文件 在QGIS中加载工程文件需要使用QgsProject实例的read()方法,该方法需要传入QFileInfo对象。QFileInfo对象指定了QGIS工程文件的路径,下面的代码加载QGIS的工程文件到当前应用程序中: # If you are not inside a QGIS console you first need to import # qgis and PyQt4 classes you will use in this script as shown below: from qgis.core import QgsProject from PyQt4.QtCore import QFileInfo # Get the project instance project = QgsProject.instance() # Print the current project file name (might be […]

Leave a comment

QGIS python开发手册

QGIS python开发手册 原文地址:http://docs.qgis.org/testing/en/docs/pyqgisdevelopercookbook/intro.html QGIS是一个用户界面友好的桌面地理信息系统,可运行在Linux、Unix、Mac OSX和Windows等平台之上。QGIS是基于Qt,使用C++开发的一个用户界面友好、跨平台的开源版桌面地理信息系统。 QGIS项目开始于2002年 5月,是基于跨平台的图形工具Qt软件包,采用C++ 语言开发的一个GIS软件。目前的开发非常活跃,当前(2014年)的最新版本是QGIS 2.10 版。QGIS源码采用 GNU General Public License协议对外发布。 QGIS的官方网址为http://www.qgis.org/ 从0.9版本开始QGIS就支持Python进行开发,称之为PyQGIS。PyQGIS依赖于SIP和PyQt4. 在QGIS中使用Python 启动QGIS时运行Python代码 有两种方式:设置PYQGIS_STARTUP环境变量和使用startup.py文件 设置PYQGIS_STARTUP环境变量 可以通过设置环境变量PYQGISSTARTUP来达到在QGIS初始化完成前执行python代码的目的。将PYQGISSTARTUP设置为用户想执行的python文件即可。 这种方法一般情况下很少用到,但这是在QGIS初始化完成之前执行python代码的方法之一。这个方法在清理系统路径(sys.path)的时候非常有用,系统路径里面有时候含有一些无效的路径。还有就是一些python模块需要单独初始化的情况使用。 使用startup.py文件 每次QGIS启动的时候,都会在用户的Python home目录(一般为.qgis2/python目录)下面查找startup.py文件,如果存在,则执行。 Python控制台 在QGIS中,可以通过Python控制台来执行Python代码。在Plugins 菜单下选择 Python Console,打开Python控制台,如图1: 图中的代码用来获取当前选中的图层,并显示其ID,如果该图层是矢量图层,则显示图层包含的要素个数。 在QGIS的执行环境中默认有一个iface变量,该变量是QgsInterface类型的实例。使用这个变量可以访问地图的canvas,菜单,工具条以及其他模块。 为了方便用户,在Python控制台启动的时候会自动加载相关模块,代码如下: from qgis.core import * import qgis.utils 如果用户经常使用Python控制台,可以通过Settings 菜单下的Configure shortcuts工具设置快捷键,方便快速启动。 Python插件 QGIS支持以插件的方式增强其功能,在支持Python之前,只能通过C++来实现。支持Python后,可以通过Python来实现插件。相对于c++实现的插件,Python实现的插件开发更简单并且更容易分发。目前,已经有非常多的Python插件可以下载。用户可以通过Plugins菜单下的manage and install plugins工具来获取、安装、卸载插件。 Python应用程序 在数据处理的时候,经常需要使用脚本的方式来自动化的批量处理。使用PyQGIS,可以很容易的实现。导入qgis.core模块并初始化,用户就可以使用了。 如果用户想创建一个可交互的应用程序,例如实现测量数据、将地图导出到PDF中等功能,则使用 qgis.gui模块即可。 qgis.gui模块提供了很多GUI组件供用户使用。地图组件可以很容易到集成用户的应用程序中。 在自定义应用程序中使用pyQGIS 首先,导入QGIS模块,然后设置QGIS路径。如果用户在调用setPrefixPath的时候将第二个参数设置为True,QGIS会将该目录下的所有目录都加入到路径中。最后调用initQgis()方法,让QIGS查找所有有效的数据源。代码如下: from […]

Leave a comment

使用python合并两个sqlite数据库

脚本如下: #!/usr/bin/env python # -*- coding: utf-8 -*- import sqlite3 def dataMerge(inpath,attachpath): conn = sqlite3.connect(inpath) conn.text_factory = str cur = conn.cursor() attach = ‘attach database “‘+attachpath+'” as w;’ sql1 = ‘insert into map select * from w.map;’ sql2 = ‘insert into images select * from w.images;’ cur.execute(attach) cur.execute(sql1) cur.execute(sql2)

Leave a comment

使用python将csv数据导入到sqlite中

脚本如下: #!/usr/bin/env python # -*- coding: utf-8 -*- import csv import sqlite3 def dataImport(csvpath,dbpath,tablename): reader = csv.DictReader(open(csvpath,”rb”),delimiter=’,’,quoting=csv.QUOTE_MINIMAL) conn = sqlite3.connect(dbpath) # shz: fix error with non-ASCII input conn.text_factory = str c = conn.cursor() create_query = ‘CREATE TABLE ‘+tablename +’ (“cn” TEXT,”en” TEXT,”lat” DOUBLE,”lon” DOUBLE,”points” DOUBLE,”count” INTEGER,”intro” TEXT,”photo” TEXT,”url” TEXT,”content” TEXT)’ c.execute(create_query) for row in reader: […]

Leave a comment

使用python对shapefile重投影

脚本如下: #!/usr/bin/env python from osgeo import ogr, osr from osgeo import gdal import os def reproject(inputfile,outputfile,layername): gdal.SetConfigOption(“GDAL_FILENAME_IS_UTF8″,”NO”) gdal.SetConfigOption(“SHAPE_ENCODING”,””) driver = ogr.GetDriverByName(‘ESRI Shapefile’) # input SpatialReference inSpatialRef = osr.SpatialReference() inSpatialRef.ImportFromEPSG(4326) # output SpatialReference outSpatialRef = osr.SpatialReference() outSpatialRef.ImportFromEPSG(3857) # create the CoordinateTransformation coordTrans = osr.CoordinateTransformation(inSpatialRef, outSpatialRef) # get the input layer inDataSet = driver.Open(inputfile) inLayer = inDataSet.GetLayer() […]

Leave a comment

python+ArcGIS 制作的热度图

Also posted in heatmap 6 Comments

GIS中获取地铁线路数据

注:本文只是提供使用python解析数据的方法,数据版权归amap所有,同学们如果想使用数据请联系数据提供商购买。 看了老王的文章《GIS中公交数据的下载和处理》收获很大,那么我也介绍一种不用silverlight的方法获取地铁数据,同学们看了我的前两篇博客 使用python处理json 和使用pyshp处理shapfile就可以猜到了,我们全部用python来进行。 1 首先用chrome 打开高德地图网站:http://www.amap.com/map.html 2 按f12 打开chrome 的developer 工具 3 在地图搜索输入框中选择公交换乘,并输入地铁一号(注意不是地铁一号线),搜索 4 在developer tool中找到查询结果,得到下面的字符串 jQuery1710991390228504315_1342926130045({“busline”:[{“citycode”:”010″,”length”:34938,”endname”:”四惠东”,”starttime”:”0510″,”statio ns”:[{“code”:”110100″,”station_no”:”1″,”spell”:””ping guo yuan””,”y”:101695452,”name”:”苹果园”,”x”:220846170},{“code”:”110100″,” station_no”:”2″,”spell”:””gu cheng””,”y”:101714107,”name”:”古城”,”x”:220855819},{“code”:”110100″,”station_no”:”3″,”spell”:””ba jiao you le yuan””,”y”:101714101,”name”:”八角游乐园”,”x”:220872188},{“code”:”110100″,”station_no”:”4″,”spell”:””ba bao shan””,”y “:101714107,”name”:”八宝山”,”x”:220889361},{“code”:”110100″,”station_no”:”5″,”spell”:””yu quan lu””,”y”:101714134,”name”:”玉泉路” ,”x”:220902240},{“code”:”110100″,”station_no”:”6″,”spell”:””wu ke song””,”y”:101714087,”name”:”五棵松”,”x”:220917897},{“code”:”1 10100″,”station_no”:”7″,”spell”:””wan shou lu””,”y”:101714074,”name”:”万寿路”,”x”:220933625},{“code”:”110100″,”station_no”:”8″,” spell”:””gong zhu fen””,”y”:101714087,”name”:”公主坟”,”x”:220945040},{“code”:”110100″,”station_no”:”9″,”spell”:””jun shi bo wu guan””,”y”:101714094,”name”:”军事博物馆”,”x”:220955112},{“code”:”110100″,”station_no”:”10″,”spell”:””mu xi di””,”y”:101714174,”n ame”:”木樨地”,”x”:220965495},{“code”:”110100″,”station_no”:”11″,”spell”:””nan li shi lu””,”y”:101714308,”name”:”南礼士路”,”x”:220 976436},{“code”:”110100″,”station_no”:”12″,”spell”:””fu xing men””,”y”:101714302,”name”:”复兴门”,”x”:220979482},{“code”:”110100″ ,”station_no”:”13″,”spell”:””xi dan””,”y”:101714348,”name”:”西单”,”x”:220994249},{“code”:”110100″,”station_no”:”14″,”spell”:””t […]

Also posted in shape file Leave a comment

使用python处理json

  python中自带了处理python的模块,使用时候直接import json即可。 >>> import json >>> json.loads(‘[“foo”, {“bar”:[“baz”, null, 1.0, 2]}]’) [u’foo’, {u’bar': [u’baz’, None, 1.0, 2]}] >>> json.loads(‘”\”foo\\bar”‘) u'”foo\x08ar’ 使用loads方法即可将json字符串转换成python对象,对应关系如下: JSON Python object dict array list string unicode number (int) int, long number (real) float true True false False null None 但在使用json模块的时候需要注意的是对中文的处理,loads方法如果传入的字符串的编码不是UTF-8的话,需要用encoding指定字符编码 dataDict = json.loads(dataJsonStr, encoding=”GB2312″);

Leave a comment