公交站点和公交路线信息录入完毕之后,可以在Geoserver上面进行预览(Geoserver在打开的时候可能你保存过登陆信息,可以自动以admin的身份登陆,但是它的数据存储却不是自动开启的,需要手动输入postgreSQL的登录名、密码来启用数据存储,接着才能预览这个数据存储中的图层)。另外,Geoserver上预览图层的时候,只能预览单一图层,想要同时预览两个图层的话,可以新建图层组,然后添加图层,计算边界,完成。还可以对图层的样式进行修改,在style那边可以看到已有的style类型,还有下面的HTML代码,可以通过编程的形式自己写一个样式应用到图层中,也可以使用udig好像,这个东东进行可视化的样式修改,它会自动生成样式,供导入到geoserver上使用。burg是红旗点,还有红色的路线,还有标志不同级别区域的样式,比较丰富!
后端怎样连接到数据库,然后进行算法编写和交互呢?
之前打电话问的同学,她用的SQLserver和VS,那边程序连接到数据库有两种方式,一个是在VS中设置连接到SQLserver数据库,一个是自己写语句连接数据库。另外不是还有个动态数据库么。但是我木有找到连接PostGIS的,问了大神,大神说用啥啥啥,我不会弄,也不记得了。后来在PostgreSQL官方文档中看到了连接方式,它有自己提供的C编程接口:Libpq库。接着就是在VS中的一通设置,这个设置也为难死我了,各种找,脑子里连个关键词都没有。后来在一个求助帖子中看到别人的回复,才设置成功的。
怎样连接Libpq库?
搜“VS如何连接到外部库” 需要修改“项目”中的“属性”:
配置属性->VC++目录->包含目录(添加....PostgreSQl\9.3\include),库目录(添加.....PostgreSQL\9.3\lib)
C和C++->常规->附加包含目录(添加PostgreSQL\9.3\include)
链接器->常规(添加include again),->输入(添加lib\libpq.lib)
接着应该就可以使用Libpq中的函数了。
数据库连接函数:
/*建立连接*/
PGconn* conn=PQconnectdb("host=localhost port=5432 user=postgres password=niguanwoa dbname=osm2 options='-c client_encoding=GBK'");
还有其他函数可以进行连接的,有的有自己默认的参数顺序。
用PQfinish来结束与数据库的连接。
连接完成之后向数据库传输查询语句:
PGresult* res=PQexec(conn,"SELECT ....."); 引号内就是你想在数据库中执行的SQL语句
PQclear(res)释放这个查询结果。
PQexec这个函数是不可以传参数的,但是编程中会经常使用到传参,比如i=0到n 查i点到某固定点的距离,就需要传参数了:
res=PQexecParams(conn,"SELECT ST_Distance((SELECT way FROM planet_osm_station WHERE station_id=$1),(SELECT way FROM planet_osm_station WHERE station_id=1)) ",
1,
NULL,
paramValues,
NULL,
NULL,
0);
paramValues是 char**类型的参数,在定义的时候是这样定义的:
paramValues: char* paramValues[1];
给paramValues赋值的时候也卡了好久,想传进去的数值在调试的时候发现,执行PQexecparams之前还是正确的,但是一执行paramValues里的值就变了,当然这个查询也是失败的。究其原因,感觉是自己指针和数组分不太清,学的不牢靠,然后就乱了。
首先需要说的是,想穿进去的参数是十进制的数值,但是paramValues的类型却是char**,定义的时候是一个指向数组的指针,我理解的就是paramValues[0]就是一个数组类型,又因为是char,所以我认为就是存放一个字符串的,这就需要你先把数字变成字符串,我自己写了一个转换函数,可以把较小的数值转换成字符串,但是总之传过去总是错的。
解决:
数字和字符串之间的转换方式:
数字转换成字符串:
int a;char a_s[10];
itoa(a,a_s,10);
a_s里面装的就是a的字符串形式了
字符串转换成数字:
a=atoi(a_s);
在网上还看到了其他的转换方式,还有sprintf 和sscanf来做的,但是我用在我这边,不知道哪一步或者哪一个变量的定义有问题,还是不能用,后来就用的itoa atoi
(#include <winsock.h>)
这样处理了之后,paramValues[0]=a_s;就可以顺利的传值了。
怎样检查SQL语句执行的状态?
一般可以在执行完一个查询语句之后,接着:fprintf(stderr,"%s",PQerrorMessage(conn));
如果没有出错就不会打印出信息,出错了的话会告诉你详细的信息,如返回的结果行数-1,或者主键值113已经存在。
用完之后记得在合适的位置PQclear(res);