导航:首页 > 源码编译 > qgis编译

qgis编译

发布时间:2022-01-30 18:56:16

⑴ mapserver的mapfile文件怎么调式

一、手工修改:

这种方式槛太高,首先需要了解mapfile文件的结构,需要熟读Mapfile宝典《Mapfile
Reference》,搞清楚每个参数的详细含义,一般人没有个把星期是搞不懂的。

二、其它软件输出:

目前部分开源软件支持输出MapServer格式的文件,像QGIS
,MapWinGIS等,ArcGIS也有相关的插件可以输出mapfile,但它们输出的文件往往会丢失很多信息,像符号等很容易丢失,而且容易出错,在MapServer中无法直接使用,还需要打开做进一步修改,也就是说还需要了解Mapfile的文档结构。

我一直在想为什么MapServer就没有配置工具呢?其实,关于MapServer的工程文件配置界面,已经有其他人做过相关的开发,有几个这方面的开源项目,都是BS架构开发的,个人感觉比较好的是maplab,做的比较深入,功能也相对比较丰富,但不知道什么原因,这些项目到目前为止都停止开发了,maplab最后的版本可能是maplab-<?xml:namespace
prefix = st1
/>,比较老了,已经不支持现在的MapServer5,,可能是维护起来比较困难,大家都放弃开发了。

工作中我们也有这方面的需求,开发一个mapfile生成工具,这个光荣的任务是由我来承担的,由于我以前是做组件开发的,相对来说更熟悉CS架构,并不打算用BS的方式来开发。MapServer可以生成的C#类库,本来想用它在C#中直接做用户界面,但不知道什么原因,在ASP.NET项目中用C#调用这些类库是没有问题的,但在Windows应用程序项目中便问题多多(难道是封装出来的类库只能再BS架构中用?)。时间紧迫没精力去研究太深,后来我索性用自己最擅长的技术了,管他麻不麻烦,先实现了再说。具体实现就是将MapServer的C类库重新封装成了一系列COM接口,然后再在C#中调用自己封装的接口来做界面,很快地便实现了一个小工具。有人可能会问,为什么不直接用VC做界面,没什么原因,就是我不喜欢,太麻烦,C#开发界面多方便,呵呵。

总体来说我对这个小工具还是很满意的,功能也不多,就像是一个小型的GIS软件,由地图显示、图层列表、工具条和菜单几个部分组成,可以直接打开MapServer的mapfile文件并显示,如果打开map文件出错可以显示详细的错误信息,也可以新建一个mapfile文件,直接向mapfile中添加图层,对其配置符号,设置标注,可见比例尺等。对打开的mapfile文件可以进行缩放等各种浏览操作,mapfile的各种属性配置基本都可以修改并实时的体现在工具的显示界面中,修改到自己满意了之后,可以将mapfile文件输出,直接在MapServer中调用。

甚至可以加上属性查询、空间量算等功能,所有MapServer能实现的功能都可以做到这个小工具中,当然这些都是后话了,工作中不需要这些所以也就没有实现。

完成之后,发现这就是一个小型的桌面GIS系统,虽然开始开发的时候感觉这么做走了弯路,现在想想这也是一条可取之路,开源软件的更新频率很高,如果MapServer的底层库函数发生了变化,也只需要将它的C类库重新编译一次就可以继续使用了,即使MapServer扩展了功能模块,我们也只需要再增加相关的接口便可以。维护起来相对比较简单,软件的持续更新也就有了保障。

⑵ 加载自定义的QGIS插件时,出现异常:qt_metacast(const char *_clname)的_clname是错误指针。

#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
#define MUNMAX 5
struct studentInfo{ //结构类型定义
int num;
float basic;
float spe;
float choose;
float peop;
float lib;
};
struct stuType{
studentInfo stu[MUNMAX];
int num;
};
void DisplayMenu();

int choiceItem();
int f(int);
void putone(struct stuType* as,int num);
void sum(struct stuType *p);
void Init(struct stuType*);
void PrintInfo(struct stuType);
void Print_aInfo(struct stuType,int);
void Input_aInfo(struct studentInfo*);
void Input_allInfo(struct stuType*,int num);
int Search(struct stuType);
void modify(struct stuType*);
void main()
{

struct stuType student;
int choice,index,a;
system(\"color 4e\");
Init(&student);

do{

choice=choiceItem();
switch (choice){
case 0:printf(\"\\n再见!\");break;
case 1:Input_allInfo(&student,MUNMAX);break;
case 2:putone(&student,f(a)); break;
case 3rintInfo(student);break;
case 4:modify(&student);break;
case 5:if ((index=Search(student))!=-1)
Print_aInfo(student,index);
else printf(\"\\n不存在这个学生.\");
break;
case 6:Init(&student);break;
case 7:sum(&student);break;
}
}while(choice);
}

void DisplayMenu() //显示菜单
{
COORD coordScreen = ;

HANDLE hCon = GetStdHandle(STD_OUTPUT_HANDLE);
SetConsoleCursorPosition(hCon, coordScreen);
printf(\"========= MENU =========\\n\");
printf(\"\\n (1) 通过键盘输入全部学生的学分;\");
printf(\"\\n (2) 通过键盘修改某位学生的学分;\");
printf(\"\\n (3) 显示该班所有学生学分完成情况;\");
printf(\"\\n (4) 全部课程的学分高低进行排序;\");
printf(\"\\n (5) 给定学号,显示该学生学分完成情况;\");
printf(\"\\n (6) 初始化程序;\");
printf(\"\\n (7) 一些统计信息;\");
printf(\"\\n (0) 退出系统;\");
printf(\"\\nchoice,please:\");
}

int choiceItem() //菜单选择
{
int choice;
do{
DisplayMenu();
scanf(\"%d\",&choice);

}while(choice<0||choice>7);
return choice;
}
int f(int a)
{
do
{
printf("请输入要修改学生的学号(1-5):");
scanf("%d",&a);
}while(a-1<0||a-1>4);
return a-1;
}
void Init(struct stuType* s) //初始化
{
s->num=0;
}

void Print_aInfo(struct stuType s,int index) //输出一个学生的信息
{
printf("\n学号:%d\n基础课学分:%-6.1f\n专业课学分:%-6.1f\n选修课学分:%-6.1f\n人文类课程学分:%-6.1f\n实验性课程学分:%-6.1f\n ",s.stu[index].num,s.stu[index].basic,s.stu[index].spe,s.stu[index].choose,s.stu[index].peop,s.stu[index].lib);

}

void PrintInfo(struct stuType s) //输出所有学生的信息
{

if (s.num==0) {
printf("\n无学生信息.");
return;
}
for (int i=0;i<s.num;i++){
printf("\n学号:%d\n基础课学分:%-6.1f\n专业课学分:%-6.1f\n选修课学分:%-6.1f\n人文类课程学分:%-6.1f\n实验性课程学分:%-6.1f\n ",s.stu[i].num,s.stu[i].basic,s.stu[i].spe,s.stu[i].choose,s.stu[i].peop,s.stu[i].lib);

}
}
void putone(struct stuType* as,int num)//修改一个学生信息
{
Input_aInfo(&as->stu[num]);
}

void Input_aInfo(struct studentInfo* as) //输入一个学生的信息
{
do
{
printf("请输入学生的学号:");
scanf("%d",&as->num);
}while(as->num<1||as->num>5);
printf("请输入学生的基础课成绩:");
scanf("%f",&as->basic);
printf("请输入学生的专业课成绩:");
scanf("%f",&as->spe);
printf("请输入学生的选修课成绩:");
scanf("%f",&as->choose);
printf("请输入学生的人文课成绩:");
scanf("%f",&as->peop);
printf("请输入学生的实验课成绩:");
scanf("%f",&as->lib);
printf("\n");
}

void Input_allInfo(struct stuType* s,int num) //输入多个学生的信息
{
printf("\n请输入 %d 组信息.\n",num);
for (int i=0;i<num;i++){
if (s->num==MUNMAX){
printf("\n已经输入过成绩,不能重复输入,只能按2更改原始数据!");
break;
}
Input_aInfo(&s->stu[s->num++]);
}
}

int Search(struct stuType stu) //查找
{
int num;
do
{
printf("\n输入学生学号(1-5):");
scanf("%d",&num);
}while(num<1||num>5);
for (int i=0;i<stu.num;i++)
if (stu.stu[i].num==num)
return i;
return -1;
}

void modify(struct stuType *p) //排序
{int i,j;float temp;
for(i=0;i<4;i++)
for(j=0;j<4-i;j++)
{if(p->stu[j].basic>p->stu[j+1].basic){
temp=p->stu[j].basic;
p->stu[j].basic=p->stu[j+1].basic;
p->stu[j+1].basic=temp;}
if(p->stu[j].spe>p->stu[j+1].spe){
temp=p->stu[j].spe;
p->stu[j].spe=p->stu[j+1].spe;
p->stu[j+1].spe=temp;}
if(p->stu[j].choose>p->stu[j+1].choose){
temp=p->stu[j].choose;
p->stu[j].choose=p->stu[j+1].choose;
p->stu[j+1].choose=temp;}
if(p->stu[j].peop>p->stu[j+1].peop){
temp=p->stu[j].peop;
p->stu[j].peop=p->stu[j+1].peop;
p->stu[j+1].peop=temp;}
if(p->stu[j].lib>p->stu[j+1].lib){
temp=p->stu[j].lib;
p->stu[j].lib=p->stu[j+1].lib;
p->stu[j+1].lib=temp;}
}

printf("全部课程成绩的排序结果为:\n基础课:");
for(i=0;i<5;i++)
printf("%-6.1f",p->stu[i].basic);
printf("\n专业课:");
for(i=0;i<5;i++)
printf("%-6.1f",p->stu[i].spe);
printf("\n选修课:");
for(i=0;i<5;i++)
printf("%-6.1f",p->stu[i].choose);
printf("\n人文课:");
for(i=0;i<5;i++)
printf("%-6.1f",p->stu[i].peop);
printf("\n实验课:");
for(i=0;i<5;i++)
printf("%-6.1f",p->stu[i].lib);
}
void sum(struct stuType *p)
{int i,b1=0,b2=0,s1=0,s2=0,c1=0,c2=0,p1=0,p2=0,l1=0,l2=0;
for(i=0;i<4;i++)
{if(p->stu[i].basic>=90.0)
b1++;
if(p->stu[i].basic<50.0)
b2++;
if(p->stu[i].spe>=90.0)
s1++;
if(p->stu[i].spe<50.0)
s2++;
if(p->stu[i].choose>=90.0)
c1++;
if(p->stu[i].choose<24.0)
c2++;
if(p->stu[i].peop>=90.0)
p1++;
if(p->stu[i].peop<8.0)
p2++;
if(p->stu[i].lib>=90.0)
l1++;
if(p->stu[i].lib<20.0)
l2++;
}
printf("\n基础课程90学分以上的有%d个,不及格的有%d个",b1,b2);
printf("\n专业课程90学分以上的有%d个,不及格的有%d个",s1,s2);
printf("\n选修课程90学分以上的有%d个,不及格的有%d个",c1,c2);
printf("\n人文课程90学分以上的有%d个,不及格的有%d个",p1,p2);
printf("\n实验课程90学分以上的有%d个,不及格的有%d个",l1,l2);

⑶ 听说你有qgis源码,可以发给我看看吗。[email protected]谢谢。

QGIS源码可以在这儿下载:
http://www.qgis.org/wiki/Download#Sources_and_Sample_Dataset

这个是编译的步骤:
http://www.qgis.org/wiki/Building_QGIS_from_Source#Building_on_Windows

这儿是SVN https://svn.osgeo.org/qgis/trunk/qgis/

⑷ 我在搞qt实现电子地图,不过刚开始学习,不知到如何,想找份代码来看看!!你有的话发份我谢谢!

Qt电子地图?QGIS啊,不给邮箱我咋发?而且太大了,不好发的。我给你个网址吧...
这个网址可以找到源代码,以及安装版。http://www.qgis.org/wiki/Download
这儿是QGIS官网http://www.qgis.org.
开源的,就是有点大,编译,和阅读,改动都比较吃力。

⑸ qgis.exe无法定位程序输入点sqlite3_rtree_geometry_callback于动态链接库sqlite3.dll 怎么解决

这种一般是版本问题,你使用的dll版本中没有该函数。换个版本试验一下

⑹ qgis能连接mysql数据吗

CMake编译中选择编译Oracle一项以后,编译的qgis才会有连接Oracle数据库的功能。
编译qgis以后,可以通过添加矢量图层中选择Oracle数据库,或是添加Oracle空间图层,或是添加Oracle GeoRaster图层来连接Oracle数据库。

⑺ 关于gis系统相关文件打开的问题

你在mapgis的"文件转换"中,把该格式的文件先转一下.转成相应的wl,wp,wt文件试一试.如果成功的话就可以用mapgis"图形编辑"打开了.仅供参考

⑻ 如何导入PostgreSQL数据库数据

说起数据库,大家耳熟能详的商业数据库产品当推Oracle、微软的SqlServer和IBM的

DB2等,而开源数据库中则有两大产品MySQL和PostgreSQL。

PostgreSQL 是一种对象-关系型数据库管理系统(ORDBMS),也是目前功能最强大、

特性最丰富和最复杂的自由软件数据库系统。它起源于伯克利(BSD)的数据库研究计划,

目前是最重要的开源数据库产品开发项目之一,有着非常广泛的用户。

PostgreSQL 可以说是最富特色的自由数据库管理系统,也有人认为可以是最强大的自由

软件数据库管理系统。PostgreSQL 是唯一支持事务、子查询、多版本并行控制系统、数据完

整性检查等特性的唯一的一种自由软件的数据库管理系统。能在多平台下---包括Linux、

FreeBSD和Windows等---运行,并且支持多语言的开发。

在两大开源数据库产品的对比中,一般认为MySQL速度更快,所以得到更为广泛的使

用;而PostgreSQL性能更为先进,PostgreSQL 提供很多 MySQL 目前所不支持的特性,比

如触发器、视图、存储过程等等,在记录数超千万之后性能表现尤其出色。

当前的最新版本是PostgreSQL 8.2.3,官方网站是:

www.postgresql.org

1.2 什么是PostGIS

PostGIS在对象关系型数据库PostgreSQL上增加了存储管理空间数据的能力,相当于

Oracle的spatial部分。PostGIS最大的特点是符合并且实现了OpenGIS的一些规范,是最着

名的开源GIS数据库。

当前的最新版本是PostGIS 1.2.1,官方网站是:

www.postgis.org

二 PostgreSQL和PostGIS的安装

2.1 在windows下安装。

新版本的PostgreSQL在其安装程序中集成了PostGIS,只需要在安装过程中选中

PostGIS和pgsql项就可以了。

2.2 在Debian下安装PostGIS

# apt-get install postgresql-8.1 postgresql-8.1-postgis

当前Etch中的版本:PostgreSQL是8.1.7,而PostGIS是1.1.6,虽然不是最新的版本,

但已经足够了。

还需要做的工作是:

1) 创建一个专门用于PostGIS的数据库并为专用数据库导入PostGIS支持:

# su – postgres

$ cd /usr/share/postgresql-8.1-postgis

$ createdb wen1

$ createlang plpgsql wen1

$ psql -d wen1 -f lwpostgis.sql

$ psql -d wen1 -f spatial_ref_sys.sql

2) 创建一个专门的用户,并把相应的数据库和数据表的属主设置为该用户:

# su – postgres

$ psql

$ create user wen1 password ‘123456’;

$ alter database wen1 owner to wen1;

$ alter table spatial_ref_sys owner to wen1;

$ alter table geometry_columns owner to wen1 ;

3) 修改PostgreSQL配置文件以便可以远程使用。

修改PostgreSQL的配置文件/etc/postgresql/8.1/main/Postgresql.conf,将其中的一句:

listen_address=’localhost’

前面的注释去掉,并把’localhost’该为’*’。

修改Postgresql的配置文件/etc/postgresql/8.1/main/pg_hba.conf,在文件后面加一句:

host all all 192.168.0.0/24 password

这句的意思是:同网络中192.168.0.*的机器可以以密码的形式使用所有的数据库。更具

体的参数意义直接看该配置文件中的注释就可以了。

这里一定要配置正确,否则无法在远程连接PostgreSQL数据库。

2.3 源码安装PostgreSQL和PostGIS

参阅以前写的老文章。

三 PostGIS的使用

要使用PostGIS,需要两方面的预备知识,一是要熟悉基本的SQL语法;二是熟悉

PostgreSQL数据库的基本使用。

(一) 快速入门

我们使用前面创建的数据库wen2,用户为wen1,现在创建一个包含三个点的数据库

test1:

首先在Etch下以wen1登陆,然后打开wen2数据库:

$ psql -d wen2 ;

再在PostgreSQL的控制台下输入以下命令

wen2=> create table test1 (myID int4, pt geometry, myName
varchar );

wen2=> insert into test1 values (1, 'POINT(0 0)', 'beijing'
);

wen2=> insert into test1 values (2, 'POINT(31.5 60.87)',
'shanghai' );

wen2=> insert into test1 values (3, 'POINT(10.77 85.902)',
'tianjin' );

这样我们利用PostGIS创建了一个包含三个点的GIS数据表。

为了能在QGIS中打开这一图层,我们还需要为数据表创建一个主键:

wen2=>alter table test1 add primary key (myID);

可以看到PostGIS的使用其实就相当于使用一个经过扩展的SQL语法,上述语句熟悉

SQL语法的人一看都很熟悉,都是普通的SQL语句,不同的只不过是增加了PostGIS特殊的

geometry数据类型。

你可以再试试这些SQL语句:

select * from test1;

select myID,AsText(pt) from test1;

select Distance(pt, 'POINT(0 0)') from test1;

(二) PostGIS的Geometry数据类型

Geometry可以说是PostGIS最重要的一个概念,是“几何体”的意思,由于PostGIS很

好地遵守OGC的”Simple Feature for Specification for
SQL”规范,目前支持的几何体类型包

含其实例有:

POINT(1 1)

MULTIPOINT(1 1, 3 4, -1 3)

LINESTRING(1 1, 2 2, 3 4)

POLYGON((0 0, 0 1, 1 1, 1 0, 0 0))

MULTIPOLYGON((0 0, 0 1, 1 1, 1 0, 0 0), (5 5, 5 6, 6 6, 6 5, 5
5))

MULTILINESTRING((1 1, 2 2, 3 4),(2 2, 3 3, 4 5))

而geometry具体表现又有两种形式,一种叫做WKT(Well Known Text)形式,如上面的

例子。或者使用如下SQL语句浏览:

select AsText(pt) from test1;

另一种叫做“Canonical Form”形式,看上去是一串古怪的数字,其实是一种增强的十六

进制编码,使用如下SQL语句就可以浏览了:

select pt from test1;

(三) 读写PostGIS数据

建设好PostGIS数据库之后,我们现在需要进行读写GIS数据了,包括把GIS写入到

PostGIS数据库中以及在应用程序中使用PostGIS数据库的数据。读写PostGIS目前主要有以

下四种方式:

3.1 使用psql语言

Psql语言是PostgreSQL内嵌的一个命令行工具,其语法基本上和标准的SQL语法是一

致的,可以使用Psql工具,结合标准SQL语法和一些PostGIS的扩展对PostGIS数据库进行

读写操作。

具体例子如上面“快速入门”中的例子。

这种方式功能强大,但全部需要手工操作,烦琐且繁重。

3.2 使用一些小工具

有两个很有用的小的转换工具,一是shp2pg;一是ogr2ogr

3.2.1 shp2pgsql和pgsql2shp

shp2pgsql和pgsql2shp是PostGIS自身携带的一对在Shape文件和PostGIS数据库之间进

行转换的工具,在Debian中安装好PostGIS之后,这两个程序已经位于可执行文件的搜索路

径上,因此可以在系统中任何位置使用。

假如当前目录下有完整的china.shp文件(应该有三个同名不同扩展名的文件),需要把其

中数据输入到上述的wen2数据库中的数据表china_postgis中,具体操作为(操作用户为

wen1):

$ shp2pgsql china china_postgis > tmp.sql

$ psql -d wen2 -f roads.sql

这个工具很好用,缺点在于使用范围有限,只针对Shape文件格式。

3.2.2 ogr2ogr

PostGIS本身的shp2pg工具只把shape文件转换到PostGIS 数据库中,那如何把其他的

GIS数据加入呢?比如说MapInfo的mid格式,ESRI的e00格式呢?这就要使用ogr这个工

具了。

Ogr目前是gdal的一个组成部分,那什么是gdal呢?其官方主页(http://www.gdal.org)上

如此介绍:

GDAL is a translator library for raster geospatial data formats
that is released under an X/MIT

style Open Source license by the Open Source Geospatial
Foundation. As a library, it presents a

single abstract data model to the calling application for all
supported formats. It also comes with a

variety of useful commandline utilties for data translation and
processing.

简单地说,Gdal是一个各种Gis数据格式的转换软件库,ogr则是转换矢量GIS数据的

软件库。

目前ogr能够支持的数据格式包括:

Arc/Info Binary Coverage、DWG、ESRI Personal
GeoDatabase、ArcSDE、ESRI

Shapefile、GML、GRASS、Mapinfo File、Microstation DGN、ODBC、Oracle
Spatial和

PostgreSQL等。应该说,这就基本包括了我们平常用到的所有矢量型GIS文件格式了。

Gdal支持的栅格数据格式参阅http: //www.gdal.org/formats_list.html

下面我们从源码编译安装gdal---因为我在Debian下使用apt方式安装的gdal并不支持

postgresql数据库,其实更为简便的方法也许是去gdal.org下载一个Fwtools的工具包,可以

直接运行不用繁琐的编译,既有Windows的,也有Linux下用的,只不过这个包有些大。

1) 下载最新的gdal-1.3.2

2) 解压

3) ./configure --prefix=/opt/gdal
--with-pg=/opt/pg/bin/pg_config --without-ogdi

这里我习惯把软件安装在/opt目录下。

--with-pg参数很重要,使ogr可以支持PostGIS,后面的参数是我的PostGIS安装的地方。

我在这里编译很多次失败,经过仔细查找,发现问题出在ogdi上,所以暂时我只好使

它不支持ogdi。

4) make

5) make install

下面是使用过程,假设现在我要把一个rai.mid文件导入到数据库data1中:

$ ogr2ogr –f Postgresql PG:dbname=data1 rai.mid

注意,f参数后面跟的是导入的数据类型,最后那个文件才是要导出的文件。PG后面说

明的是数据库的名字,需要是已经创建好的数据库,而数据表则由程序自动创建。还要特别

注意权限问题,以上命令我是由postgres用户执行的。

还有一个要注意的是主键问题。一般情况下,你使用shp2pg或者 ogr2ogr向postgis中

增加了Gis数据后,在GIS客户端添加postgis图层的时候,常常会因为数据表没有定义主键

而出错,解决的办法是,在服务器上使用psql或者其他sql工具,使用命令:

alter table table_name add primary key (column_name);

另外我们发现ogr竟然是不支持最常见的GIS格式e00格式,好象是因为版权方面的原

因吧。解决的方法就是去sf.net查找相关工具。我在上面就找到一个e002pg工具,支持将

e00文件导入到postGIS数据库中。

3.3 在其他GIS软件中读写PostGIS数据

比如在QGIS中,能够打开PostGIS图层,还有SPIT插件可以把Shape文件输入到

PostGIS数据库中。

其他GIS软件如uDig,Grass等,甚至连ArcInfo都支持或部分支持读写PostGIS数据。

3.4 利用接口在应用程序中读写PostGIS数据

广大的开源GIS程序员几乎为每一种程序设计语言设计好了读写PostGIS的接口,如利

用PostgreSQL的JDBC库,可以使用java语言在程序中读写PostGIS数据;利用libpq库,

可以使用C语言读写PostGIS数据。

(四) 使用PostGIS函数

4.1 PostGIS函数

要能熟练使用PostGIS,掌握PostGIS的所有函数是关键。通过掌握这些PostGIS函数,

我们能够高效、稳定地处理各种地理数据。由于PostGIS的函数设计时都遵守OpenGIS规范,

我们也可以把这些PostGIS叫做OpenGIS函数。

4.2 PostGIS函数的分类

PostGIS函数大致可以分为以下四类

1) 字段处理函数

这类函数当前一共有3个,分别是:

AddGeometryColumn(var1,var2,var3,var4,var5,var6):为已有的数据表增加一个地理几何

数据字段。Var1代表数据表的模式(schema)的名字,一般是public,也可以省略,则使用当

前的缺省模式;var2是已有的数据表的名字;var3是新的地理数据字段的名字;var4是

SRID值,不确定的话就取-1吧;var5是地理数据的类型,可以是POINT等;var6是指该几

何数据是二维还是三维数据。

前面的SQL语句 create table test1 (myID int4, pt geometry, myName
varchar )更规范的写

法为:

create table test1 (myID int4, myName varchar );

select AddGeometryColumn('test1','pt',-1,'GEOMETRY',2);

DropGeometryColumn函数显然是删除一个地理数据字段的;

SetSRID函数显然是设置SRID值的。

2) 几何关系函数

这类函数目前共有10个,分别是:

Distance Equals Disjoint Intersects Touches Crosses Within
Overlaps Contains Relate

3) 几何分析函数

这类函数目前共有12个,分别是:Centroid Area Lenth PointOnSurface Boundary
Buffer

ConvexHull Intersection SymDifference Difference GeomUnion
MemGeomUnion

4) 读写函数

这类函数很多,主要是用于在各种数据类型之间的转换,尤其是在于Geometry数据类

型与其他如字符型等数据类型之间的转换,函数名如AsText、GeomFromText等,其作用是

显然的。

4.3 PostGIS函数使用示例。

假设在我们的wen2数据库中,有两张表,一张为guojia,是从“国家基础地理数据”

网站下载的国界数据表,数据类型为LINE;二为shengqu_polygon,也从同一个网站下载,

地理数据类型为多边形。

1) 查询我国边境线的长度:

wen1=> select sum(length(the_geom)) as lenth from guojie;

2) 查询我国面积最大的省区名字:

wen1=> select name area(the_geom) as myarea

from shengqu_polygon

order by myarea DESC

LIMIT 1;

(五) 使用PostGIS扩展函数

除了上述遵循OpenGIS的函数之外,PostGIS还自行扩展了一些当前OpenGIS规范之外

的函数,主要包括以下几类:

5.1 管理类函数

扩展的管理类函数主要包括一些软件版本查询函数,如

postgis_version()、postgis_geos_version()、postgis_proj_version()函数等,分别查询当前的

PostGIS的版本及其使用的Geos和Proj库的版本。

5.2 数据类型的输入输出函数

除了OpenGIS定义的地理数据类型之外,PostGIS还对数据类型进行了扩展,这种扩展

主要是两方面的扩展,一是把二维的数据向三维和四维扩展;二就是在WKT和WKB数据

类型基础上扩展出EWKT和EWKB数据类型。

PostGIS提供了在这些地理数据类型和常用数据类型如字符型、浮点型数据之间进行转

换的函数。

5.3 量算函数

如length3d函数是对length2d函数的扩展。

5.4 几何操作函数

如addBBox(geometry)函数给所给的几何体加上一个边框。

如simplify(geometry,tolerance)函数可以对折线和多边形利用Douglas-Peuker算法进行一

些节点进行删除,从而使表现的图形更简单而清晰,在网络传输数据时具有更高的效率。

5.5 操作符号

5.6 其他扩展函数

(六) 建立PostGIS索引

当数据库的记录增大的时候,如果没有建立索引的话,操作的效率就显着下降。

POstGIS建议当记录数超过几千的时候就应该建立索引,而GIS数据库一般都是海量数据,

所以对PostGIS而言,索引就非常重要。

Shapfile文件为ESRI公司的文件存储格式,并且得到了业界广泛的支持。Shapfile格式是一种简单的,用非拓朴关系的形式存储几何位置和地
理特征的属性信息的格式。虽然GeoServer采用Shapfile文件可以快速的创建网上地图服务,但它的缺点确很明显:

1、Shapefile只支持一个图层,在实际中没有意义。

2、直接保用SHP文件不安全,Shapfile文件很容易被病毒或其他原因误删除。

3、GeoServer中用Shapfile文件作数据源的效率是很低的。

4、Shapfile中的汉字GeoServer不能解析,会出现乱码。

5、数据库可以方便的对地理信息进行查询。

用PostGIS管理空间数据

PostGIS支持GIST空间索引(附录1)、规范窗体,能很大的提高处理效率。


OGC格式只提供二维的几何体,且相关联的SRID从未深入的用于输入输出请求,PostGIS支持OpenGIS组织"Simple
Features for
SQL"规范指定的所有GIS对象和函数,并进行了扩展,格式是EWKB、EWKT,其中增加了对3DZ,3DM和4D
坐标系的支持(当然三维、四维数据的OGC标准还未完全制定),深入引进了SRID信息。

空间数据表结构:PostGIS中存在两个必需的元数据表格, SPATIAL_REF_SYS(空间参考表格) 和
GEOMETRY_COLUMNS(几何体属性列),两个表用于存储空间数据库使用的坐标系统数字ID和文本描述。

PostGIS的shp2pgsql命令可以将Shapfile直接导入到数据库中也可以导出为SQL文件,推荐先导出为SQL文件再将此文件在SQL运行窗口中执行可将数据导入数据库。

Shapfile到SQL语句:

shp2pgsql 路径shp数据文件名 新建的数据表名 >
路径SQL文件名.sql

Shapfile直接入库:

shp2pgsql -c 路径shp数据文件名 新建的数据表名 数据库名|psql -d 数据库名

举例说明:

如将一Shapfile文件“c:road.shp”导入到数据表“road”中,数据库为“sjzmap”。

1、运行“命令提示符”。

2、切换至PostgreSQL数据库安装目录中的bin目录下。

3、执行此目录下的shp2pgsql命令:“shp2pgsql c:road.shp road >
c:road.sql”。

4、如将此文件直接导入数据库(不推荐):“shp2pgsql -c c:road.shp road
sjzmap | psql -d sjzmap”。

5、使用pgAdmin3
选择数据库,再导入表。

⑼ c++ signal/slots 开源库有哪些

C++在“商业应用”方面,曾经是天下第一的开发语言,但这一桂冠已经被java抢走多年。因为当今商业应用程序类型,已经从桌面应用迅速转移成Web应用。当Java横行天下之后,MS又突然发力,搞出C#语言,有大片的曾经的C++程序员,以为C++要就此沉沦,未料,这三年来,C++的生命力突然被严重地增强了。主力原因就是开源的软件、基础软件(比如并发原生支持,比如Android必定要推出原生的SDK)、各种跨平台应用的出现。

开源C++库必须具有以下特点:必须是成熟的产品、跨平台的产品、相对通用的库。

一、通用标准类
STL:C++标准模板库,呵呵,它也是开源的嘛。
boost:C++准标准库,它是强大地,江湖称之“千锤百炼”。

deelx (轻量级的正则表达式解析类库,国产),boost里有强大的正则表达式解析库,但如果你只想要一个表达式解析,不想要拖上庞大的boost库时……支持一下国货。
iconv /iconvpp : (C形式的编码转换函数库,

二、XML解析库
C++的XML相关库不少,但是大部分其实都是C库,使用起来自然不那么轻便。其中基于DOM的有TinyXml,基于SAX的当然是Xerces。前者小巧快捷,便于使用,适合做数据交换。后者则是全功能的XML解析器。
xerces-c :最强大的XML解析库了,不是仅仅在开源库里,你尽管把商业的算在内。当然,它的变体,被IBM拿去卖钱的那个版本,多了数百兆的东东来支持各国编码转换,是更强大,但我觉得有小小的,开源的iconv在前不就够了?

xml相应的c开源库有expat,基于SAX,应用广泛。

xsd (XML 与 C++数据结构的绑定工具)。(商业使用要钱)
三、数据库
mysql / mysql++: 不用介绍吧。现在Oracle手里,但我很放心。

四、多媒体类

SDL (Simple DirectMedia Layer/多媒体直接访问层,用于游戏编程)。
相应的c开源库有ffmpeg、mpeg4、aac、avc、libmad、mpeg1、flac、ac3、ac3、matroska着名的多媒体播放器 TCPMP 天下闻名的跨平台、嵌入式手持设备视频播放器,

五、网络开发类
gSOAP SOAP协议的C++支持库及代码生成工具。

ACE 大型网络编程的首选库。
除了ACE之外,还有很多系统和网络编程方面的程序库。比如在线程库方面,还有ZThread、boost::thread,如果放大到C/C++领域,还有APR,还有CII。在文件和目录操作方面,boost也有相应的组件,而在网络编程方面有socket++,还有boost::asio,未来的 C++0X中几乎肯定有一个网络编程和一个线程库。然而目前看来,ACE仍然是进行系统和高性能网络编程的首选,其地位在一段时间内不会被撼动。它不但是一个实用的程序库、框架集,还是一个典范的设计模式应用范例,非常值得学习。
六、GUI库
BCG Windows平台下界面设计的第三方库,可以让你的界面更美好,更具时 代感。

wxWidgets :使用wxWidgets ,开发者可以基于同一套代码,为Win32, Mac OS X, GTK+, X11, Motif, WinCE等平台开发应用程序。wxWidgets库可以被C++, Python, Perl, and C#/.NET等开发语言使用。跟其它有些同样支持跨平台GUI开发工具不同,基于wxWidgets的应用,拥有真实本地化的视觉及使用效果——因为,wxWidgets使用(各)平台原生的控件,而不是简单通过贴图去模拟。wxWidgets是使用广泛的,自由的,开源的,成熟的。
QT-------------界面(GUI)开发,支持C++/Java/Python/...多种语言。跨平台。最主要的好处是,API非常优美!Qt本身也不仅仅只是做GUI编程,实际它基本上可以做OS-API可以做的任何事情。象网络/数据库/OpenGL/...都提供完美的支持。
传统上Qt被认为是可移植的GUI库,但实际上Qt现在已经是一个比较完整的可移植应用程序框架了,其中包含了大量的工具,比如正则表达式、Web和 Socket类、2D和3D图形、XML解析、SQL类等,甚至还包括了一个完整的容器类库,不过其王牌还是GUI。在目前的跨平台GUI框架中,Qt成熟度最高,已经被一些大公司应用在关键产品中。由于Trolltech对Qt采用的al license模式,该产品既可以从开源社区获得支持,又能够赚取足够的商业利润,因此其前景也令人比较有信心。
Qt的主要技术特色是其元对象模型。Qt实际上使用的并不是标准的C++,而是标准C++的一个扩展。它通过元对象模型扩展,实现了着名的signal/slot机制,而这一机制也成为Qt的最大特色和优势。
与Qt类似的可移植GUI框架还有wxWidget、FOX等
六. 计算机视觉
OpenCV,因特尔自主的开源库。支持C/C++/Python接口。这个感兴趣的朋友可以玩一下。如果结合OpenCV,你可以做一些外行人觉得很酷的程序。比如说用它的人脸识别函数,来对你的摄像头进行处理,判断人的动作等
七. 图形图像处理
GDAL,处理大图像。要是GIS专业的人肯定会语言到非常大的tif影像,动则几个GB的航空影像。GDAL对大图像的读写支持是非常棒的(像多波段的图像都可以搞定)。支持C++/Java/Python...
国外开源的GIS软件QGIS就是用了gdal
c的图形图像库较多,libjpeg、libpng、zlib、tiff、JBIG、最着名的开源形图像处理软件Cximage
八、内存管理:boost::smart_ptr,Hans-Boehm GC
C/C++的内存管理是一个永恒的话题。一般来说,C++的开发者倾向于自己管理内存。然而,出乎很多C++开发者意料的是,近期C++的一些领袖人物已经公开宣称,如果不配备自动内存管理机制,用C++编写安全可靠的大型程序是非常困难的。而Bjarne Stroustrup也曾对中国开发者建议,如果没有特别的理由,应该在大型项目中使用自动内存管理工具。因此,今天的C++开发者应当积极地学习和应用自动内存管理设施。
说到自动内存管理,比较轻量级的做法是boost::smart_ptr,而激进的做法是引入完整的GC机制。目前开源而又比较可靠的GC中,Hans- Boehm GC无疑是最受信赖的。作为一个保守的GC,Hans-Boehm GC在性能和功能方面都算是卓越。特别是,使用这个GC,你仍然可以delete、free来自己管理内存,对于我们编程习惯的冲击比较小。
九、密码及安全:OpenSSL
安全是今天进行C/C++编程无法回避和必须重视的问题。然而编写安全的应用程序,特别是跟网络相关的C/C++应用程序,是一件十分困难的事情。可以说,整个业界目前在这个进程上仍然处于“初级阶段”。特别是涉及到大量的安全、密码学相关的算法、规范,如果让开发者自己摸索,其工作量和难度达到了不现实的程度。因此必须借助可靠的相关程序库才有可能提高程序的安全性。在这方面,OpenSSL是目前最好的选择,其内容之全面可靠,已经成为业界标杆。然而,由于安全编程固有的复杂性,即使使用penSSL,开发工作仍然是非常繁琐的。因此我们也希望能够尽快看到更简单、更易用的C/C++安全程序库。
十、矩阵计算:MTL
自1995年以来,C++在科学计算领域当中取得了巨大的突破。这主要归功于template技术的高级应用,使得C++在科学计算的性能方面取得了巨大的进步,一大批优秀的C++科学计算库涌现出来。比如Blitz++、POOMA、MTL、Boost::uBLAS。而这其中,MTL就功能丰富程度、性能、开发支持和成熟程度来讲,是比较突出的一个,因此可以优先考虑。值得一提的是,2002年,MTL与后来被Intel收购的KAI C++配合,曾经在性能评测中击败了FORTRAN。
十一、分布式对象中间件:ICE
ICE是分布式对象中间件领域里的后起之秀,可以大致地将其视为“改进版”的CORBA。目前应用在一些大型项目当中,其中包括波音公司主持的下一代陆军作战系统。
ICE的一个特别价值是其代码的范例意义。由于ICE的出现较晚,开发者比较系统地应用了新的C++编程风格,所以成为了研读C++代码的良好目标。
十二、正则表达式:boost::regex
正则表达式是编程工作中最强有力的工具之一。C++的正则表达式支持一直以来是一个软肋。大约在2001年左右,boost中出现了regex库,初步解决了这个问题。但是最初的regex无论在效率上还是可靠性方面都有一些问题,后来经过一次大规模的翻修之后,达到了比较完善的程度。
其他可以选择的替代品还有C语言的pcre库,Qt中的QRegExp类等。
十三、配置管理:Lua
随着软件系统越来越复杂,对软件的可配置型提出了越来越高的要求。传统上只要通过命令行参数来配置的系统,现在可能需要越来越多的方式和机制。目前越来越受欢迎、并且得到越来越多证实的做法,是将Lua嵌入到C/C++程序中,而用Lua程序作为配置脚本。这种做法的优势是,Lua语言强大灵活,可以适应复杂的配置要求。同时,Lua便于嵌入C/C++程序,而且编译执行速度非常快,可以说是目前解决C/C++程序配置管理问题的一个出色方案。

阅读全文

与qgis编译相关的资料

热点内容
工作三年的大专程序员 浏览:728
java毕业设计文献 浏览:143
筹码集中度指标源码 浏览:482
listsortjava 浏览:186
plc闪光电路编程实例 浏览:299
socket编程试题 浏览:206
华为的服务器怎么设置从光驱启动 浏览:871
程序员真的累吗 浏览:328
学信网app为什么刷脸不了 浏览:873
天蝎vs程序员 浏览:996
单片机下载口叫什么 浏览:190
程序员的道 浏览:926
云服务器不实名违法吗 浏览:558
怎样查看文件夹图片是否重复 浏览:995
文件怎么导成pdf文件 浏览:808
打开sql表的命令 浏览:103
安卓手机如何面部支付 浏览:38
天元数学app为什么登录不上去 浏览:825
明日之后为什么有些服务器是四个字 浏览:104
安卓系统l1是什么意思 浏览:26