当前位置:文档之家› QGIS学习资料

QGIS学习资料

<<
舌尖上的中国
——
吃货地图
|
QGIS
教程【
GBPS
详解】
-
2
:绘制一张地图(中)
>>


QGIS
教程【
GBPS
详解】
-
1
:绘制一张地图
(上)


5.
七月
2012
|
0
评论
|
by
codeychai


写在前面的话:

我喜欢用ArcMap来绘制地图,但今天要讲的是用一款叫QGIS的软件。

为什么要用QGIS?ArcGIS太强大了,正因为它太强大,所以,不得不考虑换一
个软件。ArcGIS 10的安装包有3.75G,如此庞大的软件,的确令人生畏。而购
买ArcGIS的费用也基本上是天价级别,如果不用破解,大伙都用不起。于是我
一直想找寻一款免费但功能强劲的GIS软件来支持我的GBPS理论,从QGIS到
DIVA-GIS,到MapWindow,又到QGIS。最后还是决定用QGIS。

QGIS,全称为Quantum GIS,是一款比较知名的免费开源GIS软件,由于在这里
我们不谈论二次开发,所以什么源码、编程之类一概不谈。(QGIS官网:
https://www.doczj.com/doc/0510956828.html,)

——————————————分割线————————————————

正文:

其实我还蛮喜欢教东西的,但是只是喜欢说教,却懒得写教程,所以可能有些地
方写的不详细,还请各位看官见谅。有疑问可留言,我会尽快回复。

对了,我在写教程的过程中我会默认你在大学中上过有关GIS的课,哪怕你上课
睡觉或者早就忘的差不多了都没有关系。如果没有……那你最好先补一下GIS
的基本常识(我对GIS也不是很精通,所以有个皮毛就可以了)。

1、下载和安装QGIS

下载地址:
https://www.doczj.com/doc/0510956828.html,/downloads/QGIS-OSGeo4W-1.7.4-d211b16-Setup.exe (截至
2012年7月5日的最新版本为1.8.1,但我发现其不支持中文数据,所以在这提
供的是1.7.4版本。大小为111M)

下载后双击安装,最好安装在非中文目录下,即路径中不要含有中文字符;而且
路径名称中不要有空格,所以不能装在Program Files文件夹下面,建议装在
“C:/QGIS”或“D:/QGIS”目录下。

不出意外的话,点桌面上的“Quantum GIS Desktop (1.7.4)”图标即可打开。
如果报错,请百度或谷歌。


https://www.doczj.com/doc/0510956828.html,/image.axd?picture=2012%2f7%2fQQ%e6%88%aa%e5%9b%be20120706180649.jpg
2、安装Openlayer插件

打开你的QGIS,如果操作界面看不大明白没关系,以后再讲。

为啥要装这个插件?这个插件可以在地图中添加常用的网络地图为底图,对于我
们绘制地图来说非常方便。支持谷歌、OpenStreetMap、Yahoo、Bing、Apple iphoto
等。

执行: 插件(P)->Fetch Python plugins

这时候弹出一个框,等它下载完后,出现三个标签,选第二个,即Repositories,
按“Add……”,添加一个URL为:
http://build.sourcepole.ch/qgis/plugins.xml 的Repos

itories(字面意思
可理解为放插件的仓库地址),名称随意,然后确定。

确定后会更新插件列表,从列表中选择OpenLayer安装。如果不好找试试用
Filter搜索。



3、绘制地图

执行:插件(P)->OpenLayer plugin->Add Google Physical Map

谷歌地图就添加到地图窗口了。(如果无聊的话你可以试试其他的地图,因为服
务商都不是中国的,所以,中国的数据还是谷歌的比较详细)


画哪儿的地图呢?就画个什邡的吧,谁让什邡最近这么火呢。

先在地图上找到什邡,地图缩放到中国-四川-成都,然后上面一点就是什邡了。
如果不好找,就用openLayer再添加一个谷歌的街道地图。

地儿是找着了,没有边界啊。现在到网上去找一张什邡的地图,看这里:
https://www.doczj.com/doc/0510956828.html,/articleimage/200805/scxsfxd.jpg

地图下载后 执行:Raster->Georeferencer->Georeferencer(或者直接点工具
栏上的配准图标)

在新弹出的窗口中点Open Raster工具。将下载的地图添加进来,需要说明的是
QGIS的配准方法与ArcMap稍微有一点点差别,但本质上是一样的。这时候Add
Point工具是默认选中的,QGIS需要至少添加4个配准点才能配准。先在图片上
找一个配准点点一下,然后会弹出一个框提示你输入地图坐标,这时候选“From
map canvas”,即从地图上拾取。点击后,配准窗口自动最小化,显示出地图窗
口,然后从地图上选取与刚刚选择的配准点对应的点,点击后会自动回到配准窗
口,点击确定,以添加该配准点。

下面的截图显示了我添加的四个配准点,由于我早就有什邡的边界的shp文件,
所以我投机取巧仅仅是示意一下,大家在配准的时候,可要仔仔细细,多添加几
个配准点,而且要确保清晰准确。配准后通过转换设定和开始配准工具,即可生
成带有坐标的tif位图。


https://www.doczj.com/doc/0510956828.html,/image.axd?picture=2012%2f7%2f02.jpg


回到地图主窗口,点添加位图工具,将配准后的tif图片加入。调整其透明度(双
击其所在的图层),检查配准情况。

配准合格后,我们新建一个shp文件(New Shapefile Layer工具)。

类型选择线,坐标系统默认即可,设置一个名为type的新属性,格式为text,
然后确定,我们将文件名命名为border.shp。

在图层窗口中选中border.shp,工具栏点“Toggle Editing”工具,开始进行
编辑,左键画,右键完成。

设置snapping,执行:设置(S)->Snapping options,设置border.shp的snapping
最大容许值,设置为0.005m,QGIS和ArcMap的这个值的单位好像不大一样,自
己试试看。


https://www.doczj.com/doc/0510956828.html,/image.axd?picture=2012%2f7%2f03.jpg
https://www.doczj.com/doc/0510956828.html,/image.

axd?picture=2012%2f7%2f04.jpg
然后画边界,县界、乡镇界的type值稍微区分一下。

完成后保存编辑,我们得到这个:



设置border.shp的样式,关闭tif图片,再添加个乡镇的点shp。

最后得到:




https://www.doczj.com/doc/0510956828.html,/image.axd?picture=2012%2f7%2f112.jpg
QGIS
教程【
GBPS
详解】
-
2
:绘制一张地图
(中)


6.
七月
2012
|
0
评论
|
by
codeychai


4、绘制道路和景点

根据之前所讲的,现在再把道路和景点临摹上去。等所有都完成后,去掉或隐藏
所有网络地图。

然后适当调整每个图层的现实样式,得到:



5、给城市和景点添加标注

双击城镇的图层,打开图层属性,找到“标签”的tab,启用标签,设置显示字
段name,并调整标签样式。

(请原谅我写的没有那么细致,因为一项项写出来实在是太费事了,都不难,自
己看看就能学会,这是我正式用QGIS的第二天,你看,我不也都自己学会了,
QGIS的操作方法跟ArcMap很像,应该很容易上手的)

因为景点太多了,我们用另一种方式给他添加标签。选中景点所在的图层,点击
工具栏上的“Labeling”工具,按提示设置label的样式。随着地图的缩放你会
发现label会自动调整自己的位置以不遮挡其他label。这个跟ArcMap的类似。


6、排版输出jpg图片

执行:文件(F)->New Print Composer

这时候会弹出个排版的窗口。

工具栏上按添加新地图工具,在白纸上拖出一个画幅,放置刚刚绘制的地图。通
过Move item Content工具,并配合滚轮,可以设置地图内容的位置和缩放大小。

我们选一个A3的纸张,设置为300dpi,对整个地图进行排版。输出后,得到一
份简约的什邡旅游地图:


https://www.doczj.com/doc/0510956828.html,/image.axd?picture=2012%2f7%2fQQ%e6%88%aa%e5%9b%be20120706175252.jpg


本次就先写到这,下次讲如何给地图加地形(可用于分析的地形,而非网络地图)。

QGIS
教程【
GBPS
详解】
-
3
:绘制一张地图
(下)


7.
七月
2012
|
0
评论
|
by
codeychai



7、添加DEM

美国的卫星数据有很多是免费的,虽然精度有限,但对于县域地图来说,已经足
够了。网上有很多免费的DEM可供下载,比如SRTM、ASTER GDEM等等,中
科院也有相关的镜像,可以从国内下载。国外的地址请自行谷歌,我这里贴一个
中科院的镜像地址:https://www.doczj.com/doc/0510956828.html,/admin/datademMain.jsp

我在这里用中科院的30米分辨率数字高程数据产品,在检索页面找到什邡市的
DEM数据,有两块。因为什邡市跨越了东经103、104两个经度段。将它们分别
下载下来。

解压后得到两个20M左右的img格式文件。


两个img对于什邡市地图来说,太大了。所以最好裁剪一下,当然了,如果你
的计算机硬件足够ok,也可以忽略这一步。

但在裁剪之前必须先将这两个img合并,或者你分别对两个img进行裁剪,但我
想那不是一个好主意。

合并两个img,执行:Raster->Miscellaneous->Merge

按提示输入两个img文件,并设置保存文件名。这里记得勾选一下No Date Value:
0,否则合并后有接缝。

同时勾选一下Load into canvas when finished,这样合并完之后会自动添加
到地图中去。点击确定,进行合并。

进行裁剪,执行:Raster->Extraction->Clipper

裁剪范围我用的事先准备好的shp文件,当然也可手动输入坐标范围。裁剪完成
后得到一张黑不溜秋的dem_clip。


https://www.doczj.com/doc/0510956828.html,/image.axd?picture=2012%2f7%2fQQ%e6%88%aa%e5%9b%be20120707230502.jpg


8、生成hillshade

执行:Raster->Analysis->DEM

设置输出文件名称,mode选hillshade。其他参数默认,然后确定。

将dem_clip和hillshade两层至于所有图层最后,然后hillshade置于最后。

调整dem_clip的透明度为50%,并将其Style调整为显示colormap,将Colormap
标签下添加10个色段。默认的色段颜色是蓝到红,做地形渐变很难看。调整其
为浅绿色到浅红色的渐变。(这一点不如ArcMap好使了,因为ArcMap有预置好
的色带可选,而QGIS则需要手动调,不过调好后可以存下来备用,下次用的时
候就方便了。)


https://www.doczj.com/doc/0510956828.html,/image.axd?picture=2012%2f7%2fQQ%e6%88%aa%e5%9b%be20120707231024.jpg


调整好个图层的样式后,回到print composer,设置地图版式和布局。然后就
可以输出地图了。

输出jpg后发现,栅格数据输出后带了几条线,是个bug。导出pdf也同样带这
条线。矢量数据输出则没有任何问题。


https://www.doczj.com/doc/0510956828.html,/image.axd?picture=2012%2f7%2fQQ%e6%88%aa%e5%9b%be20120707232557.jpg


小结:这几天试着学了一个QGIS,顺便出这个教程,对于制图而言,发现ArcMap
可以做的,QGIS基本都可以实现。有些情况下,ArcMap效率可能更高,毕竟是
商业软件和免费软件的区别。但对于GBPS来说,我想QGIS已经足够了!


今天画地图只是开个小头,接下的教程里会跟大家逐一介绍如何用QGIS对规划
中各个环节进行支撑,如何分析基础条件、资源、市场、空间布局,并对基础设
施规划和生态环境保护等做详细介绍。

再次声明,GBPS不是出几张坡度、坡向、高程的分析图,而是一套完整的规划
支持体系,如果以为GIS就是谷歌地图、GIS分析就是做坡度分析,那我也无话
可说,您可以出门右拐了……毕竟很多做规划的人并不懂GIS每个字母代表什
么意思。

Fil

ed in:
规划与
GIS
Tags:
QGIS
教程
,
GBPS


QGIS
教程【
GBPS
详解】
-
4
:将地图数据与
规划团队分享


11.
七月
2012
|
0
评论
|
by
codeychai


就目前国内规划项目组的成员组成来看,你可能是你所在的规划团队中唯一一个
懂GIS的人,其他人不会对GIS软件进行操作,那你的成果如何让其他人也能享
用?

将成果导出为jpg,这是一个不错的主意,但并不是所有的东西都转成jpg来的
好使。

前三次教程主要讲如何制作一副地图,随着数据的不断深入,它完全可以作为最
终规划图件的底图。而这一步在规划前期(项目实地考察前)即可基本完成。

当项目考察时,你可以将地图导出为高精度的jpg,这样,项目团队在考察过程
中就有了方向感。当然,有些情况下甲方会现场提供当地的一些地图资料,但在
未到达项目地之前,你做的地图就是给大家最好的空间指引,甚至有时候你会发
现,你做的地图会比他们给出的图件更有价值。

在项目考察的过程中,你用笔或者GPS设备记录下走过的节点,回到公司,你迫
不及待的将这些点输入到GIS中,并对之前的地图做出修正。

随着项目的推进,当团队成员开始对项目地的资源进行消化的时候,你会发现,
他们虽然都不会使用GIS分析软件,但他们都打开了电脑桌面上的Google Earth
或者在浏览器中拖拽着谷歌卫星地图。他们现在困惑的是:你给出的地图上面虽
然标注的很清楚,但他们不知道这些点究竟在GE里面处于一个什么样的位置,
他们在搜索框中,冒着被GFW封锁的危险,一次次的输入想要查询的内容……

其实GE是一款大众化的地图浏览软件,其对卫星地图的浏览功能很强大,最为
重要的是:你所在的项目组成员都会使用它!

现在要做的是:把QGIS地图导入到GE。


https://www.doczj.com/doc/0510956828.html,/image.axd?picture=2012%2f7%2fQQ%e6%88%aa%e5%9b%be20120711134800.jpg
在QGIS中的操作很简单,在相应的图层上点击右键,选save as即可。

保存格式选择Keyhole Markup Language(KML),然后起名,保存。

双击保存后的kml,我们就可以把该图层的信息在GE中加载了。

下面是加载了边界和旅游资源点的GE:



如果你的数据表中还有其他更多的信息,我相信,你的团队成员看到后,会大吃
一惊,并会毫不吝啬的夸奖你的!

ps:QGIS导出的格式为kml,而ArcMap可导出Kmz。Kmz可以看做是zipped kml,
这两种格式都是谷歌自家的格式,GE都能打开,但ArcMap导出Kmz的时候,会
把地图样式也打包进去,而QGIS导出的kml则将是GE的默认样式,你可以通过
在GE中重新修改样式来自定义点线面的样式。

不过这并不妨碍QGIS发挥其伟大
的功能为我们这些矮穷挫的屌丝规划师们提供福音。

Filed in:
规划与
GIS
Tags:
QGIS
教程
,
GBPS
,
GE







复制代码
复制代码
复制代码
QGIS二次开发教程(一)

QGIS二次开发教程一

——用QGIS的API编写自定义应用程序

教程一:使用QGIS Canvas API编写一个简单的地图显示程序

参考翻译自Quantum GIS官方网站

事实上,我们并不是所有的时候都需要一个庞大、完整的GIS桌面应用程序,有时候我们的应用程序主要
用于其他的目的,而我们所需要的只是在用程序中添加一个具有地图显示功能的小工具。譬如一个带有地
图显示功能的数据库前端。

接下来我们就创建一个简单的地图小工具,功能仅仅是加载一个shape文件并用随机颜色加以显示。但是
通过这个简单的例子你应该能体会到将QGIS作为一个嵌入式的地图组件的潜力。

首先,在我们的应用程序里添加必要的includes:



1 //

2 // QGIS Includes

3 //

4 #include

5 #include

6 #include

7 #include

8 #include

9 #include

10 //

11 // Qt Includes

12 //

13 #include

14 #include

15 #include



我们用QgsApplication代替Qt中的QApplication来创建应用程序,这样可以方便地调用QGIS中的许多静
态方法,比如得到库文件所在的路径等等。

各种数据的提供商plugins通过提供商注册表(QgsProviderRegistry)来管理,它会根据提供商自动加载相应
的plugins,我们所需要做的就是指定plugins所存放的目录,让应用程序实例化这样的提供商注册表。

QgsSingleSymbolRenderer是最基本的符号类,它用一种颜色表示点、线、多边形对象。默认情况下颜色
是随机选取的,当然,你也可以自己设定希望显示的颜色。每一个矢量图层都有一个对应的符号。

地图图层注册表(QgsMapLayerRegistry)用来管理现在正在使用的图层。QgsVectorLayer 继承自
QgsMapLayer,添加了矢量数据特有的功能。

最后,地图画布(QgsMapCanvas)才是问题的关键,我们的地图将被绘制在这个工具上。

现在,我们开始初始化我们的应用程序:



1 int main(int argc, char ** argv)


复制代码
复制代码
复制代码
2 {

3 // Start the Application

4 QgsApplication app(argc, argv, true);

5

6 QString myPluginsDir = "/home/timlinux/apps/lib/qgis";

7 QString myLayerPath = "/home/timlinux/gisdata/brazil/BR_Cidades/";

8 QString myLayerBaseName = "Brasil_Cap";

9 QString myProviderName = "ogr";



这样我们就得到了一个

qgsapplication。

变量myLayerPath指定了plugins所在的目录。

变量myLayerPath和myLayerBaseName指向要使用的shape文件。

变量myProviderName很重要,它告诉qgis加载数据文件需要使用哪个数据提供商。一般为”ogr”
或”postgres”。

现在我们可以开始创建图层了:

1 // Instantiate Provider Registry

2 QgsProviderRegistry::instance(myPluginsDir);

首先我们需要初始化提供商注册表。QgsMapLayerRegistry是一个单类(singleton class),因此我们使用
它的静态函数instance()传递供应商插件库的路径,在此之后它将在这个路径下查找提供商的插件。

接下来我们继续创建图层:



1 QgsVectorLayer * mypLayer =

2 new QgsVectorLayer(myLayerPath, myLayerBaseName, myProviderName);

3 QgsSingleSymbolRenderer *mypRenderer = new
QgsSingleSymbolRenderer(mypLayer->geometryType());

4 QList myLayerSet;

5

6 mypLayer->setRenderer(mypRenderer);

7 if (mypLayer->isValid())

8 {

9 qDebug("Layer is valid");

10 }

11 else

12 {

13 qDebug("Layer is NOT valid");

14 }

15

16 // Add the Vector Layer to the Layer Registry

17 QgsMapLayerRegistry::instance()->addMapLayer(mypLayer, TRUE);

18 // Add the Layer to the Layer Set

19 myLayerSet.append(QgsMapCanvasLayer(mypLayer, TRUE));




复制代码
复制代码
这段代码的意义显而易见。我们用前面定义的变量创建了一个图层,然后给这个图层分配了一个渲染器
(renderer)。在创建渲染器的时候,我们需要指定图层的几何类型,这个可以通过图层对象的
geometryType()函数得到。然后将图层对象layer添加到图层列表layerset和地图图层注册表
QgsMapLayerRegistry中,layerset告诉QgsMapCanvas那些图层需要渲染、它们的顺序如何。最后,我
们要保证这个图层是可见的。

现在我们创建一个地图画布用于显示地图图层。



1 // Create the Map Canvas

2 QgsMapCanvas * mypMapCanvas = new QgsMapCanvas(0, 0);

3 mypMapCanvas->setExtent(mypLayer->extent());

4 mypMapCanvas->enableAntiAliasing(true);

5 mypMapCanvas->setCanvasColor(QColor(255, 255, 255));

6 mypMapCanvas->freeze(false);

7 // Set the Map Canvas Layer Set

8 mypMapCanvas->setLayerSet(myLayerSet);

9 mypMapCanvas->setVisible(true);

10 mypMapCanvas->refresh();



这段代码也很简单。我们创建了一个画布,然后将它的范围设置为我们图层的范围。接下来打开反走样功
能,并设置背景颜色为白色,解冻画布,设置其为可见并刷新。

1 // Start the Application Event Loop

2 return app.exec();

3 }

在这最后一步中,我们所做的仅仅是启动Qt事件循环。是不是很简单?

这个例子中的源代码可以通过svn下载(当然,前提是安装了svn工具

),下载命令如下:

svn co https://https://www.doczj.com/doc/0510956828.html,/qgis/trunk/code_examples/1_hello_world_qgis_style

分类: C/C++, QGIS

标签: QGIS, 二次开发















































QGIS二次开发教程一

时间:2012-05-25 18:40来源:未知作者:admin浏览: 66人

用QGIS的API编写自定义应用程序 教程一:使用QGIS Canvas API编写一个简
单的地图显示程序 参考翻译自Quantum GIS官方网站 事实上,我们并不是所有
的时候都需要一个庞大、完整的GIS桌面应用

——用QGIS的API编写自定义应用程序

教程一:使用QGIS Canvas API编写一个简单的地图显示程序

参考翻译自Quantum GIS官方网站

事实上,我们并不是所有的时候都需要一个庞大、完整的GIS桌面应用程序,有
时候我们的应用程序主要用于其他的目的,而我们所需要的只是在用程序中添加
一个具有地图显示功能的小工具。譬如一个带有地图显示功能的数据库前端。

接下来我们就创建一个简单的地图小工具,功能仅仅是加载一个shape文件并用
随机颜色加以显示。但是通过这个简单的例子你应该能体会到将QGIS作为一个
嵌入式的地图组件的潜力。

首先,在我们的应用程序里添加必要的includes:

1 // 2 // QGIS Includes 3 // 4 #include 5 #include
6 #include 7
#include 8 #include 9
#include 10 //11 // Qt Includes12 //13 #include
14 #include 15 #include

QGIS二次开发教程一

QgsSingleSymbolRenderer是最基本的符号类,它用一种颜色表示点、线、多边
形对象。默认情况下颜色是随机选取的,当然,你也可以自己设定希望显示的颜
色。每一个矢量图层都有一个对应的符号。

地图图层注册表(QgsMapLayerRegistry)用来管理现在正在使用的图层。
QgsVectorLayer 继承自QgsMapLayer,添加了矢量数据特有的功能。

最后,地图画布(QgsMapCanvas)才是问题的关键,我们的地图将被绘制在这个
工具上。

现在,我们开始初始化我们的应用程序:

1 int main(int argc, char ** argv) 2 {3 // Start the Application4
QgsApplication app(argc, argv, true);5 6 QString myPluginsDir




= "/home/timlinux/apps/lib/qgis";7 QString myLayerPath =
"/home/timlinux/gisdata/brazil/BR_Cidades/";8 QString
myLayerBaseName = "Brasil_Cap";9 QString myProviderName =
"ogr";

这样我们就得到了一个qgsapplication。

各种数据的提供商plugins通过提供商注册表(QgsProviderRegistry)来管理,
它会根据提供商自动加载相应的plugins,我们所需要做的就是指定plugins所
存放的目录,让应用程

序实例化这样的提供商注册表。

变量myLayerPath指定了plugins所在的目录。

变量myLayerPath和myLayerBaseName指向要使用的shape文件。

首先我们需要初始化提供商注册表。QgsMapLayerRegistry是一个单类
(singleton class),因此我们使用它的静态函数instance()传递供应商插件
库的路径,在此之后它将在这个路径下查找提供商的插件。

变量myProviderName很重要,它告诉qgis加载数据文件需要使用哪个数据提供
商。一般为”ogr”或”postgres”。







QGIS二次开发教程一(2)

时间:2012-05-25 18:40来源:未知作者:admin浏览: 67人

现在我们可以开始创建图层了: 1 // Instantiate Provider Registry 2
QgsProviderRegistry::instance(myPluginsDir); 接下来我们继续创建图层:
1 QgsVectorLayer * mypLayer = 2 new Qg

现在我们可以开始创建图层了:

1 // Instantiate Provider Registry2
QgsProviderRegistry::instance(myPluginsDir);

接下来我们继续创建图层:

1 QgsVectorLayer * mypLayer = 2 new QgsVectorLayer(myLayerPath,
myLayerBaseName, myProviderName); 3 QgsSingleSymbolRenderer
*mypRenderer = new
QgsSingleSymbolRenderer(mypLayer->geometryType());if
(mypLayer->isValid()) 8 { 9 qDebug("Layer is valid");10 }11
else12 {13 qDebug("Layer is NOT valid");14 }15 16 // Add the
Vector Layer to the Layer Registry17




QgsMapLayerRegistry::instance()->addMapLayer(mypLayer, TRUE);18 //
Add the Layer to the Layer Set19
myLayerSet.append(QgsMapCanvasLayer(mypLayer, TRUE));

这段代码的意义显而易见。我们用前面定义的变量创建了一个图层,然后给这个
图层分配了一个渲染器(renderer)。在创建渲染器的时候,我们需要指定图层
的几何类型,这个可以通过图层对象的geometryType()函数得到。然后将图层
对象layer添加到图层列表layerset和地图图层注册表QgsMapLayerRegistry
中,layerset告诉QgsMapCanvas那些图层需要渲染、它们的顺序如何。最后,
我们要保证这个图层是可见的。

现在我们创建一个地图画布用于显示地图图层。

1 // Create the Map Canvas 2 QgsMapCanvas * mypMapCanvas = new
QgsMapCanvas(0, 0); 3 mypMapCanvas->setExtent(mypLayer->extent()); 4
mypMapCanvas->enableAntiAliasing(true); 5
mypMapCanvas->setCanvasColor(QColor(255, 255, 255)); 6
mypMapCanvas->freeze(false); 7 // Set the Map Canvas Layer Set 8
mypMapCanvas->setLayerSet(myLayerSet); 9
mypMapCanvas->setVisible(true);10 mypMapCanvas->refresh();

这段代码也很简单。我们创建了一个画布,然后将它的范围设置为我们图层的范
围。接下来打开反走样功能,并设置背景颜色为白色,解冻画布,设置其为可见
并刷新。

1 // Start the Application Event Loop2 return app.exec();3 }

在这最后一步中,我们所做的仅仅是启动Qt事件循环。是不

是很简单



QGIS二次开发教程一(3)

时间:2012-05-25 18:40来源:未知作者:admin浏览: 68人

这个例子中的源代码可以通过svn下载(当然,前提是安装了svn工具),下载
命令如下: 我们用QgsApplication代替Qt中的QApplication来创建应用程序,
这样可以方

这个例子中的源代码可以通过svn下载(当然,前提是安装了svn工具),下载
命令如下:

我们用QgsApplication代替Qt中的QApplication来创建应用程序,这样可以
方便地调用QGIS中的许多静态方法,比如得到库文件所在的路径等等。

svn co
https://https://www.doczj.com/doc/0510956828.html,/qgis/trunk/code_examples/1_hello_world_qgis_style




https://www.doczj.com/doc/0510956828.html,.tw/kumahl/qgis_1.8.0/splash.png
QGIS推出1.8.0版 ‘Lisboa’

2012年6月25日 發表評論 閱讀評論

去年6月QGIS推出1.7.0版本,官方並表示應該不會再進行1.X系列的更新,但相隔1年左右的時間,
仍繼續推出QGIS 1.8.0版’Lisboa’,相信這是為了能推出更完善的QGIS 2.0版本所做的準備。事實上,
在QGIS 1.8.0版中做了相較於前面版本中所沒有的大改變,以下介紹此版本中新增的功能:

>>下載安裝 QGIS 1.8.0版



*QGIS瀏覽器

. 1.8.0版本加入了一個獨立的應用程式 – QGIS Browser。這個應用程式的功能有點像ESRI
ArcGIS中的ArcCatalog,能在載入圖檔之前先預覽其縮圖或metadata。決定要載入後,可使
用拖曳的方式直接將圖檔加入QGIS 主程式中載入圖層。





https://www.doczj.com/doc/0510956828.html,.tw/kumahl/qgis_1.8.0/01_s.png
https://www.doczj.com/doc/0510956828.html,.tw/kumahl/qgis_1.8.0/03_s.png




*資料庫管理

. 本版本將原本是第三方所開發的資料庫管理Plugins(DB Manager)加入QGIS官方的核心元件。





https://www.doczj.com/doc/0510956828.html,.tw/kumahl/qgis_1.8.0/06_s.png
此功能可以使用拖曳的方式將圖層自QGIS主程式中上載至資料庫,或從資料庫中載入圖層,除
此之外,也提供SQL語法檢索及預覽縮圖及metadata檢索。







https://www.doczj.com/doc/0510956828.html,.tw/kumahl/qgis_1.8.0/05_s.png


*新增地型分析模組

. 下圖以台灣30米dtm為例進行套色





https://www.doczj.com/doc/0510956828.html,.tw/kumahl/qgis_1.8.0/07_s.png
https://www.doczj.com/doc/0510956828.html,.tw/kumahl/qgis_1.8.0/08.png


*可將數個檔案加入至群組中



*Log Message

o 記錄開啓程式後的所有動作







https://www.doczj.com/doc/0510956828.html,.tw/kumahl/qgis_1.8.0/09_s.png
https://www.doczj.com/doc/0510956828.html,.tw/kumahl/qgis_1.8.0/10_s.png


*客製化工作列



*可在檔案中自訂動作,設定完成後即可用滑鼠控制觸發動作




https://www.doczj.com/doc/0510956828.html,.tw/kumahl/qgis_1.8.0/11_s.png
https://www.doczj.com/doc/0510956828.html,.tw/kumahl/qgis_1.8.0/12.png


*比例尺列提供下拉式選單供選擇



*坐標系統選擇器的對話框更新




https://www.doczj.com/doc/0510956828.html,.tw/kumahl/qgis_1.8.0/13_s.png




*全新網頁集中管理QGIS Plugins




https://www.doczj.com/doc/0510956828.html,.tw/kumahl/qgis_1.8.0/14_s.png


*額外的圖層順序功能

o 提供另一個控制介面讓使用者在不影響圖層表現的情況下重新排列圖層(如以圖層的重
要性、或年代等等)







https://www.doczj.com/doc/0510956828.html,.tw/kumahl/qgis_1.8.0/15_s.png
轉貼至個人Facebook


此次的更新加入了許多全新的功能,在此僅列出部份,如有興趣可直接前往官網查看所有的更新項目。

轉貼至個人Facebook

Categories: QGIS Tags:










































QGIS二次开发教程之一 加载图层

2011-03-14 11:07:38| 分类: QGIS | 标签: |字号大中小 订阅

QGIS是一个基于GPL协议的免费的桌面GIS软件,如果要用其进行二次开发,需要用源码进行编译,生
成适合所使用开发环境的开发库,本教程使用vc8和qt4.7.1对其进行编译,生成基于vc8和qt4.7.1的开
发库,核心库主要包括:qgis_analysis.lib、qgis_core.lib、qgis_gui.lib三个库,开发前需要在vc8中设置
好include文件目录和lib文件目录。

首先建立一个基于QT的GUI应用程序工程,程序的主窗口类名称为:examp2,设置编译所需要核心库
文件,并且设置预处理指令:CORE_EXPORT=__declspec(dllimport)、
GUI_EXPORT=__declspec(dllimport)和ANALYSIS_EXPORT=__declspec(dllimport),建立好开发环境。

使用QGIS库加载图层的步骤是:

1) 创建图层,包括图层文件所在的路径和文件名称,读取图层文件数据的提供者。

2)将图层存储到图层管理器和绘制图层列表中。

3)绘制图层

下面分别说明这几个步骤。

使用QgsVectorLayer类创建矢量图层,创建图层时需要提供图层文件所在的路径和文件名,图层名称及
提供者名称,在examp2的构造函数中添加如下代码,创建图层:

LayerPath=QString::fromLocal8Bit("..\\兰州地图\\居民地.tab");
//设置图层,图层提供者为"ogr",图层名称为""。
QgsVectorLayer *pLayer1=new QgsVectorLayer(LayerPath,"","ogr");
if(!pLayer1->isValid()){
QMessageBox::about(this,"load layer","Layer is not valid");
return;
}

使用 QList myLayerSet和QgsMapLayerRegistry 类存储图层,定义如下变量:

QList myLayerSet; //绘制图层列表
QgsMapLayerRegistry *pMapLayer; //图层管理器

//将图层添加到图层管理器

pMapLayer->addMapLayer(pLayer1,true);

//添加图层到图层集中
myLayerSet.append(QgsMapCanvasLayer(pLayer1));

使用QgsMapCanvas类绘制图层,定义如下变量:

QgsMapCanvas *pMapCanvas;


//创建地图显示画板
pMapCanvas=new QgsMapCanvas(this,0);
pMapCanvas->enableAntiAliasing(true);
pMapCanvas->useImageToRender(false);
pMapCanvas->se

tCanvasColor(QColor(255,255,255));
pMapCanvas->freeze(false);
pMapCanvas->setVisible(true);
pMapCanvas->refresh();
pMapCanvas->show();

//设置绘制图层集
pMapCanvas->setLayerSet(myLayerSet);
//绘制图层

pMapCanvas->zoomToFullExtent();
pMapCanvas->refresh();

在创建图层之前,需要注册插件库,使用如下的代码注册插件库:

//注册QGIS插件
QString myPluginsDir="..\\plugins";
QgsProviderRegistry::instance(myPluginsDir);

通过上面几个步骤完成了图层加载的工作。

显示结果如下:


QGIS应用开发教程之一 加载图层 - 陈恒 - 陈恒的博客






















































QGIS二次开发教程之二 设置图层显示外观

2011-03-22 10:10:30| 分类: QGIS | 标签: |字号大中小 订阅

在教程一中加载图层后,采用QGIS默认的设置显示图层,通常在二次开发中为了使图层显示更加直观,
一般都需要对图层的显示方式定制,如在地图中,常用红色的十字符号表示医院,用不同的符号表示不同
级别政府所在地等,QGIS提供了以下两个类定制图层的显示外观:

QgsRenderer类:该类有4个子类,用于不同场合下的图层绘制,定制图层显示外观,一般采用
QgsSingleSymbolRenderer类,该类用单一的符号显示图层所有的图元要素。

QgsSymbol类,对QT的绘制进行了封装,提供定制绘制的符号,对于线状类型的图层,可以设置线的颜
色、线的宽度及线的样式,对于面状图层,可以设置充填颜色、充填样式,对于点状图层,可以设置点的
样式、颜色等等。

设置图层外观主要分为两步,第一步设置图层的符号对象,第二步将图层符号添加到
QgsSingleSymbolRenderer类中。

下面给出设置不同类型图层外观的代码:

1)对于点状图层

//设置点标号
QgsSymbol *pSym1=new QgsSymbol(QGis::Point);
//设置点的外轮廓线的颜色和线宽

pSym1->setColor(Qt::black);

pSym1->setLineWidth(0.3);
//设置充填颜色和充填样式

pSym1->setFillColor(QColor(228,108,119));
pSym1->setFillStyle(Qt::SolidPattern);
//设置符号大小

pSym1->setPointSize(1.0);
//该方法决定了标号的形状
//pSym1->setNamedPointSymbol("svg:education_school.svg");
pSym1->setNamedPointSymbol("hard:circle");
//设置绘制的符号

QgsSingleSymbolRenderer *mypRenderer1 = new
QgsSingleSymbolRenderer(pLayer1->geometryType());
mypRenderer1->addSymbol(pSym1);
//应用于图层

pLayer1->setRenderer(mypRenderer1);

需要注意的是:使用setNamedPointSymbol(QString)方法设置符号的显示样式,该方法提供了两种显示方
式,一种是"hard:符号类型"样式,采用QGIS内置的符号样式,如("hard:circle")表示显示圆形符号,另外




一种"svg:svg文件名"样式,表示已制定的svg文件显示点符号,如("svg:education_school.svg")表示以
education_school.svg文件显示符号,要使用svg样式,需要指定svg文件所在的路径,可以在main()函
数中,用如下方法指定:

QgsApplication a(argc,argv,true);
//设置svg文件的缺省路径
QStringList strList;
strList.append("..\\symbol");
a.setDefaultSvgPaths(strList);

2)对于面状图层

//设置面状标号
QgsSymbol *pSym3=new QgsSymbol(QGis::Polygon);
pSym3->setFillColor(QColor(196,230,197));
pSym3->setFillStyle(Qt::SolidPattern);
pSym3->setColor(QColor(255,255,0));
pSym3->setLineWidth(0.8);
//设置图层绘制器
QgsSingleSymbolRenderer *mypRenderer3 = new
QgsSingleSymbolRenderer(pLayer3->geometryType());
mypRenderer3->addSymbol(pSym3);
pLayer3->setRenderer(mypRenderer3);

3)对于线状图层

//设置线标号
QgsSymbol *pSym2=new QgsSymbol(QGis::Line);
pSym2->setColor(QColor(0,0,255));
//pSym2->setLineStyle(Qt::DashLine);
pSym2->setLineWidth(1.2);

//设置图层绘制器
QgsSingleSymbolRenderer *mypRenderer2 = new
QgsSingleSymbolRenderer(pLayer2->geometryType());
mypRenderer2->addSymbol(pSym2);
pLayer2->setRenderer(mypRenderer2);

设置绘制面板的背景颜色:

pMapCanvas->setCanvasColor(QColor(155,176,227));

显示结果:


QGIS二次开发教程之二 设置图层显示外观 - 陈恒 - 陈恒的博客





































































QGIS编译需要注意的问题

2011-03-07 16:19:28| 分类: QGIS | 标签: |字号大中小 订阅

QGIS是一个开源的GIS,虽然官方网站上提供了二进制包下载,但为了用其提供的SDK二次开发,必须
对其进行编译,生成适合自己使用的SDK库,使用vc8对其进行编译,需要注意的一点是:使用bison.exe
生成qgssearchstringparser.cpp 文件时会出错误,错误信息如下:

C:\GnuWin32\bin\bison.exe -oC:/bin16/src/core/qgssearchstringparser.cpp -d -v -t
C:/qgis-1.6.0/qgis-1.6.0/src/core/qgssearchstringparser.yy
if errorlevel 1 goto VCReportError
goto VCEnd
:VCReportError
echo Project : error PRJ0019: A tool returned an error code from "Generating
qgssearchstringparser.cpp"
exit 1

因此,必须手工生成该文件,在dos环境下,进入bison.exe文件所在的目录,执行下述命令:

c:\>cd GnuWin32

c:\gnuwin32>cd bin

c:\gnuwin32\bin>bison.exe -o C:/bin16/src/core/qgssearchstringparser.cpp -d -v -t
C:/qgis-1.6.0/qgis-1.6.0/src/core/qgssearchstringparser.yy
这里C:/qgis-1.6.0/qgis-1.6.0指的是ggis源码所在的目录,C:/bin16指的是cmake生成的vc工程文件所
在的目录,上述命令表示用qgssearchstringparser.yy在vc工程文件所在的目录下生成
qgssearchstringparser.cpp 文

件。

另外一个需要注意的问题是,指定postgresql库文件时,需要指定libpq.lib文件。





















































https://www.doczj.com/doc/0510956828.html,/uploads/201206/25/1340609128_4307.png
不用买彩票,就有
408
万!
SDCC
讲师专访:创新工场蔡学镛为何看好
Dart
2012

10
月移动开发者大
会精彩内容提前揭秘!


QGIS
二次开发第一讲(环境配置)


2012
-
06
-
25 15:47
43
人阅读
评论
(0)
收藏
举报




环境配置:vs2008 +Qt4.7.3+Qgis1.7.0链接库

新建
Qt
项目



vs
中新建
Qt Application
项目,然后配置
c c++
预处理器命令

常规包含目录
和连接
器中的
lib
文件设置


具体如下:





1.
预处理器定义(增加三个定义):





2.
附加包含目录设置(在此种添加编译好的
qgis

include
路径和
Osge4w

include
的路
径)



https://www.doczj.com/doc/0510956828.html,/uploads/201206/25/1340609294_4665.png
https://www.doczj.com/doc/0510956828.html,/uploads/201206/25/1340609443_9572.png


3.lib
文件目录设置(在附加库目录中增加
qgis
编译库的
lib
文件夹路径和
osGeo4w

lib
文件夹目录)





在附加依赖项里增加三个核心的
lib
文件



https://www.doczj.com/doc/0510956828.html,/uploads/201206/25/1340609633_4254.png








































































新建
QtApplication
项目


项目命名为
qgis1
,在
qgis1.h
文件中增加以下代码


// QGIS Includes
//
#include //
扩展了
Qapplication
以便可以获取
QGIS
的特定资源,比如主
题路径和数据库路径等。
#include //
是一个单体类来管理数据访问程序(
data provider
),用
于加载插件


#include //
是一个渲染类,利用
Qgssymbol
来显示所有特征,
可以用来渲染点,线
面用一个颜色(每个矢量图层必须有一个符号关联)
#include //
此类用来记录现在已经加载的地图图层,并且提供方法
来获取指向地图的指针或者删除之
#include //
矢量图层
#include //
一个类保存了指向图层的指针,和图层是否可见等信息。是
主要的地图区域,用于绘制地图。
//
// Qt Includes
//
#include g>
#include
#include



qgis1.cpp
文件的
qgis
构造函数中,添加如下代码


qgis1::qgis1(QWidget *parent, Qt::WFlags flags)
: QWidget(parent, flags)
{
ui.setupUi(this);
QString myPluginsDir = "C:
\
\
Program Files
\
\
qgis1.7.0
\
\
plugins";//
插件路径

(在编译好的
qgis
文件夹下的
plu
gins
文件夹)
QString myLayerPath = "E:/Qgis/code_examples/1_hello_world_qgis_style/data";//
图层路
径(可以替换成自己的路径)
QString myLayerBaseName = "test";//
图层名称
QString myProviderName = "ogr";//data provider
的名称,告诉程序改用什么来加载数据,
通常用
ogr

postgres



QgsProviderRegistry::instance(
myPluginsDir);//
初始化插件的目录
QgsVectorLayer * mypLayer = new QgsVectorLayer(myLayerPath, myLayerBaseName,
myProviderName);//
初始化矢量图层,三个参数如上介绍。



QgsSingleSymbolRenderer *mypRenderer = new
QgsSingleSymbolRenderer(mypLayer
-
>geometryType());//
分配一个地图渲染器,需要传入
几何类型(
ve
ctorlayer
是一个自我描述的类)
QList myLayerSet;//QgsMapCanvasLayer
存在于
QgsMapCanvas
类中,用于支持
mapcanvas
的数据
mypLayer
-
>setRenderer(mypRenderer);
QgsMapLayerRegistry::instance()
-
>addMapLayer(mypLayer, TRUE);//
实例化地图注册类
之后,然后增加图层。
myLayerSet.append(QgsMap
CanvasLayer(mypLayer, TRUE));//

list
数据中增加
mapCanvasLayer
//
创建
mapCanvas
QgsMapCanvas * mypMapCanvas = new QgsMapCanvas(0, 0);
mypMapCanvas
-
>setExtent(mypLayer
-
>extent());
mypMapCanvas
-
>enableAntiAliasing(true);//
开启反锯齿效果
mypMapCanvas
-
>setCanvasColor(QColor(
255, 255, 255));
mypMapCanvas
-
>freeze(false);
// Set the Map Canvas Layer Set
mypMapCanvas
-
>setLayerSet(myLayerSet);//
设定
mapCanvas
的数据集
mypMapCanvas
-
>setVisible(true);
mypMapCanvas
-
>refresh();
}


然后在
main.cpp
文件中,修改
main
函数代码如下:


int main(int argc, char *argv[])
{
QgsApplication a(argc, argv,true);//
在这里换成
QgsApplication
,方便调用
QgsApplication



https://www.doczj.com/doc/0510956828.html,/uploads/201206/25/1340624393_2636.png
的静态方法。
qgis1 w;
//w.show();
return a.exec();
}


最终效果图如下:(可以支持放大缩小)






























https://www.doczj.com/doc/0510956828.html,/uploads/201207/05/1341497007_6106.png
https://www.doczj.com/doc/0510956828.html,/uploads/201207/05/1341502035_5091.png
第一步:新建
Qt Application
项目,名称为:
qgis2
,完成
后,其解决方案的文件如下所示




第二步,设计
UI


(1)双击,qgis2.ui文件,弹出qtDesigner设计器,添加相应菜单(对应的Action命名)
如下图所示




https://www.doczj.com/doc/0510956828.html,/uploads/201207/05/1341502181_4357.png


(2)在面板中央的centralWidget中拖入一个QFrame容器(用来包含qgsmapcanvas),
命名为frameMap;

(3)在qtDesigner中,点击保存,退出。

(4)在项目解决方案中,有点点击qgis2.ui,点击编译,使其重新生成ui_qgis2.h这个文


第三步:修改
qgis2.h
文件


(PS:在Generated Files中有个ui_qgis2.h文件,此文件是有qgis2.ui文件自动生成的,
无需修改,如需用到此类,用法当如:Ui::qgis2Class,如下代码所示)

修改的qigs2.h文件如下:

[cpp]
view plain
copy
print
?


1. #ifndef QGIS2_H
2. #define QGIS2_H
3.
4. #include
5. #include "ui_qgis2.h"
6. #include
7. #include providerregistry.h>
8. #include
9. #include
10. #include
11. #include
12. #include
13. #include



14. #include
15. #include
16. #include
17.
18.
19. class
qgis2 :
public
QMainWindow,
private
Ui::qgis2Class
20. {
21. Q_OBJECT
22.
23. public
:
24. qgis2(QWidget *parent = 0, Qt::WFlags flags = 0);
25. ~qgis2();
26. public
slots:
27. void
zoomInMode();
28. void
zoomOutMode();
29. void
panMode();
30. void
add
Layer();
31.
32. private
:
33. Ui::qgis2Class ui;
34. QgsMapCanvas *mpMapCanvas;
35. QVBoxLayout *mpMapLayout;
36. QToolBar * mpMapToolBar;
37. QgsMapTool *mpPanTool;
38. QgsMapTool *mpZoomInTool;
39. QgsMapTool *mpZoomOutTool;
40. };
41.
42. #endif // QGIS2_H


第四步:修改
qgis2.cpp
文件


[cpp]
view plain
copy
print
?


1. #include "qgis2.h"
2.



3. qgis2::qgis2(QWidget *parent, Qt::WFlags flags)
4. : QMainWindow(parent, flags)
5. {
6. ui.setupUi(
this
);
7. QString myPluginsDir =
"c:/Program Files/qgis1.7.0/plugins"
;
8. QgsProviderRegistry::instance(myPluginsDir);
9. //
创建地图画布
10. mpMapCanvas=
new
QgsMapCanvas(0,0);
11. mpMapCanvas
-
>freeze(
false
);
12. mpMapCanvas
-
>enableAntiAliasing(
true
);
13. mpMapCanvas
-
>setCanvasColor(QColor(255,255,255));
14. mpMapCanvas
-
>useImageToRender(
false
);
15. mpMapCanvas
-
>setVisible(
true
);
16. mpMapCanvas
-
>refresh();
17. mpMapCanvas
-
>show();
18. mpMapCanvas
-
>setFocus();
19.
20.
21. //
将窗口部件布局
22. mpMapLayout =
new
QVBoxLayout();
23. mpMapLayout
-
>addWidget(mpM
apCanvas);
24. ui.frameMap
-
>setLayout(mpMapLayout);
25. setCentralWidget(ui.frameMap);
26.
27. //
创建
Action
行为
28. connect(ui.mpActionPan,SIGNAL(triggered()),
this
,SLOT(panMode()));
29. connect(ui.mpActionZoomIn,SIGNAL(triggered()),
this
,SLOT(zoomInMode()));
30. connect(ui.mpActionZoomOut,SIGNAL(triggered()),
this
,SLOT(zoomOutMode()));
31. connect(ui.mpActionAddLayer,SIGNAL(triggered()),
this
,SLOT(addLayer()));
32.
33. //
创建工具条功能
34. mpMapToolBar=addToolBar(tr(
"File"
));
35.
36. mpMapToolBar
-
>addAction(ui.mpActionAddLayer);
37. mpMapToolB
ar
-
>addAction(ui.mpActionPan);




38. mpMapToolBar
-
>addAction(ui.mpActionZoomIn);
39. mpMapToolBar
-
>addAction(ui.mpActionZoomOut);
40. //
创建
maptool
功能
41. mpPanTool=
new
QgsMapToolPan(mpMapCanvas);
42. mpPanTool
-
>setAction(ui.mpActionPan);
43. mpZoomInTool =
new
QgsMapToolZoom(m
pMapCanvas,FALSE);
44. mpZoomInTool
-
>setAction(ui.mpActionZoomIn);
45. mpZoomOutTool =
new
QgsMapToolZoom(mpMapCanvas,TRUE);
46. mpZoomOutTool
-
>setAction(ui.mpActionZoomOut);
47.
48.
49.
50. }
51.
52. qgis2::~qgis2()
53. {
54. delete
mpZoomOutTool;
55. delete
mpZoomInTool;
56. delete
mpPanTool;
57. delete
mpMapToolBar;
58. delete
mpMapCanvas;
59. delete
mpMapLayout;
60.
61. }
62. void
qgis2::panMode()
63. {
64. mpMapCanvas
-
>setMapTool(mpPanTool);
65. }
66. void
qgis2::zoomInMode()
67. {
68. mpMapCanvas
-
>setMapTool(mpZoomInTool);
69. }
70. void
qgis2::zoomOutMode()
71. {
72. mpMapCa
nvas
-
>setMapTool(mpZoomOutTool);



73. }
74. void
qgis2::addLayer()
75. {
76. //
读取矢量数据
77. QString myLayerPath =
"E:
\
\
Qgis
\
\
project
\
\
qgis2
\
\
data"
;
//
此处换成自己的矢量文件
78. QString myLayerBaseName =
"test"
;
79. QString myPoviderName=
"ogr"
;
80. QList myLayerSet;
81. QgsVectorLayer* myLayer =
new
QgsVectorLayer(myLayerPath,myLayerBaseName,myPoviderName);
82. if
(myLayer
-
>isValid())
83. {
84.
85. QgsSingleSymbolRenderer *myRenderer =
new
QgsSingleSymbolRenderer(myLayer
-
>geometryType());
86. myLayer
-
>setRenderer(myRenderer);
87. //
增加矢量数据
到图层注册
88. QgsMapLayerRegistry::instance()
-
>addMapLayer(myLayer,
true
);
89. //
设置画布的
extent
90. mpMapCanvas
-
>setExtent(myLayer
-
>extent());
91. //
设置画布的图层数据集
92. myLayerSet.append(QgsMapCanvasLayer(myLayer));
93. mpMapCanvas
-
>setLayerSet(myLayerSet);
94. }
95. else
96. {
97. return
;
98. }
99. }


第五步:修改
main.cpp
文件


[cpp]
view plain
copy
print
?


1. #include "qgis2.h"
2. #include plication>



https://www.doczj.com/doc/0510956828.html,/uploads/201207/05/1341503332_5935.png
3.
4. int
main(
int
argc,
char
*argv[])
5. {
6. QgsApplication a(argc, argv,TRUE);
7. qgis2 w;
8. w.show();
9. return
a.exec();
10. }





第六步:运行结果如下:




QGIS二次开发第三讲

分类: QGIS2012-07-09 20:38106人阅读评论(0)收藏举报

第三讲主要实现了矢量要素的标注(Label)功能,
代码是在第二节的基础上进行修改

第一步:在qgis2.h文件中,增加相关头文件,主要三个头文件如下:
qgslabel.h,qgslabelattribute.h qgsfield.h文件

具体代码如下所示:


[cpp] view plaincopyprint?

1. #include
2. #include "ui_qgis2.h"
3. #include

ication.h>
4. #include
5. #include
6. #include
7. #include
8. #include
9. #include
10. #include
11. #include
12. #include
13. #include
14.
15. #include
16.
17. //标注添加的头文件
18. #include //一个用来渲染label的类,label渲染属性可以直接指定或
者根据属性值动态指定
19. #include //此类保存了label渲染所需要的属性值,比如
字大小,位置等属性
20. #include //此类用于将字段包装成属性表或者是数据源的形式
21.
22. //添加QT 对话框的头文件
23. #include
24. #include





第二步:在qgis2.cpp文件,addlayer()函数增加代码,主要代码
如下:

[cpp] view plaincopyprint?


1. void qgis2::addLayer()
2. {
3. //读取矢量数据
4. QString myLayerPath ="../data";
5. QString myLayerBaseName = "test";
6. QString myPoviderName="ogr";
7. QList myLayerSet;
8. QgsVectorLayer* myLayer = new
QgsVectorLayer(myLayerPath,myLayerBaseName,myPoviderName);
9. if (myLayer->isValid())
10. {
11.
12. QgsSingleSymbolRenderer *myRenderer = new
QgsSingleSymbolRenderer(myLayer->geometryType());
13. myLayer->setRenderer(myRenderer);
14. QgsLabel * mypLabel;
15. //得到关联mylayer的label指针
16. mypLabel=myLayer->label();
17. QgsLabelAttributes * mypLabelAttributes;
18. mypLabelAttributes = mypLabel->layerAttributes();
19. //得到矢量图层的字段列表
20. //typedef QMap QgsFieldMap
21. QgsFieldMap myFields = myLayer->dataProvider()->fields();
22. for (unsigned int i=0;i23. {
24. QMessageBox::information(NULL,QString(tr("字段信息
")),QString(myFields[i].name()).toLocal8Bit(),QMessageBox::Yes);
25. }
26. //在这里用最后一个字段作为标注的字段
27. mypLabel->setLabelField(QgsLabel::Text,myFields.size()-1);
28. //设置label的颜色,需要用到labelAttribute对象
29. mypLabelAttributes->setColor(Qt::black);
30. mypLabelAttributes->setBufferEnabled(true);
31. mypLabelAttributes->setBufferColor(Qt::yellow);
32. int myType = QgsLabelAttributes::PointUnits;



33. mypLabelAttributes->setBufferSize(1,myType);
34.
35. //启用标注
36. myLayer->enableLabels(true);

37. //增加矢量数据到图层注册
38. QgsMapLayerRegistry::instance()->addMapLayer(myLayer,true);
39. //设置画布的extent
40. mpMapCanvas->setExtent(myLayer->extent());
41. //设置画布的图层数据集
42. myLayerSet.append(QgsMapCanvasLayer(myLayer));
43. mpMapCanvas->setLayerSet(myLayerSet)

;
44. }
45. else
46. {
47. return;
48. }
49. }


第三步:修改main.cpp文件,使其支持中文显示,具体代码如下:

[cpp] view plaincopyprint?

1. int main(int argc, char *argv[])
2. {
3. QgsApplication a(argc, argv,TRUE);
4. //设置支持中文显示
5. QTextCodec *codec=QTextCodec::codecForName("System");
6. QTextCodec::setCodecForLocale(codec);
7. QTextCodec::setCodecForCStrings(codec);
8. QTextCodec::setCodecForTr(codec);

9. qgis2 w;
10. w.show();
11. return a.exec();
12. }


最后程序执行效果如下图所示:


https://www.doczj.com/doc/0510956828.html,/uploads/201207/09/1341837875_3071.png








本讲主要实现了加载raster数据功能

主要用到的类是qgsrasterlayer,代码是在第二讲的
基础上进行修改完成的。

第一步:修改
qgis2.h
文件,增加以下头文件


[cpp]
view plain
copy
print
?


1. //4th
代码
2. #include
3. #include






第二步:修改
qgis2.cpp
文件,主要修改
addlayer
函数,
修改后的代码如下:


[cpp]
view
plain
copy
print
?


1. //4th
代码
2. QFileInfo myRasterFileInfo(
"../data/Abarema_jupunba_projection.tif"
);
3. QgsRasterLayer *mypLayer =
new
QgsRasterLayer(myRasterFileInfo.filePath(),https://www.doczj.com/doc/0510956828.html,pleteBaseName
());
4. if
(mypLayer
-
>isValid())
5. {
6. QMessageBox::information(NULL,QString(tr(
"
加载图层
"
)),QString(tr(
"
加载成功
"
)),QMessageBox::Yes|QMessageBox::No);
7.
8. mypLayer
-
>setDrawingStyle(QgsRasterLayer::SingleBandPseudoColor);
9. mypLayer
-
>setColorShadingAlgorithm(QgsRasterLayer::PseudoColorShader);
10. mypLayer
-
>setContrastEnhancementAlgorithm(QgsContra
stEnhancement::StretchToM
inimumMaximum,
false
);
11.
12. QList myLayerSet;
13.
14. QgsMapLayerRegistry::instance()
-
>addMapLayer(mypLayer,TRUE);
15.
16. mpMapCanvas
-
>setExtent(mypLayer
-
>extent());
17. myLayerSet.append(QgsMapCanvasLayer(mypLayer));
18. mpMapCanvas
-
>setLayerSet(myLayerSet);
19. }
20. else
21. {
22. QMessageBox::information(NULL,QString(tr(
"
加载图层
"
)),QString(tr(
"
加载失败
"
)),QMessageBox::Yes|QMessageBox::No );
23. }



备注:(1)baseName和completeBaseName的区别:baseName返回的字符不包含“.”;
而completeBaseName返回的字符不包含最后一个“.”之后的字符。

第三步:修改
main
函数,来支持中文显示,代码如下:


[cpp]
view plain
copy
print
?


1. QgsApplication a(argc, argv,TRUE);
2. QTextCodec *codec = QTextCodec::codecForName(
"System"
);
3. QTextCodec::setCodecForCStrings(codec);
4. QTextCodec::setCodecForLocale(codec);
5. QTextCodec::setCodecForTr(codec);
6. qgis2 w;
7. w.show();
8. return
a.exec()






http

://https://www.doczj.com/doc/0510956828.html,/uploads/201207/09/1341845244_1124.png
第四步:最后运行效果图如下所示:









相关主题
文本预览
相关文档 最新文档