Results tagged “gis” from 尚宁的中文日志

经过两天一夜,终于有了质的进步,为第二季的顺利开展奠定了良好的基础;第二季的顺利开展也是第一季能够得以不断写出来的重要前题,在不断的理解与顿悟中,将心得整理成铺垫。

转入正题:在一组组的图形矢量文件被绘制出来之后,就可以将它们整合到.map文件中,并通过ka-map显示到浏览器中了。这个时候每一个shape文件都被定义为一个层(Layer),每个层内只能有一种类型图,例如点层、线层、面层......一层层的Layers叠加在一起便形成了一张地图。

然而此时会遇到一个问题:现实世界中怎么可以有只由一种图形构成的图层呢?举例而言:当我们定义一张地图是由地面、房屋、植被所构成的,那么地面即可能是线、也可能是面;而房屋是面;植被就很可能是点、也可能是面所构成的。

因而此时需要至少五个层才能表示出三种地面类型来。当然有人会想到将由线构成的地面绘制在一个图层中;然后将由点构成的植被绘制在一个图层中;最后一个由面构成的图层中同时包含有道路、房屋和植被。如此便可通过三个图层来传达信息了。

上面的做法显然是不合理的,因为这种混合只会让数据和图层文件混淆,无法用于日后的研究或深入分析。

所以这个时候就要用到组(Group)的概念了,将由线构成的路面和由面构成的路面归为"Road"组,同理的将房屋和植被分别归为"Build"和"Tree",如此每一组表达一种现实物品,其下每一个组成员表达其中不同的结构类型,即可有效的进行区分和归类。

层名称和所属分组在.map中的定义很容易,有了上面的概念也就不难理解和撰写了。这里要说一个叫做TRANSPARENT的参数,默认状态下它是off的,直到WebGIS学习第二季我才了解了这个参数的目的──如果将它设置为on,那么便可在浏览器中设置每个组(Group)的现实状态和组与组之间的层压关系。

当TRANSPARENT被设置为on之后,ka-map的LEGEND功能中每一个组名称前便多出了一个复选框(check box),通过选择可设定该组内容是否显示在viewport视图中。同时可以通过上下调节按钮确定哪个图层在上面、在上面的图层会覆盖其下的图层,因而默认情况下对每一个图层的层压关系应该规划好,否则就会被遮挡住。

下一集将整理关于缩放级别的内容、下下集整理平面坐标系地图大小的概念、之后对当前几个比较流行的地图商业服务进行功能调查、并分析其每一个功能实现的可能性和功能框架。
GIS应用领域随着网络硬件的发展而得到快速推进,因而引发出了WebGIS领域,然而与传统客户端相比,WebGIS多少还会显现出一定的不足,例如WebGIS都没有采用无级缩放技术。

客户端中比较娱乐的是Google Earch,一个小巧的客户端带给用户的惊奇和实用性都是令人震撼的,你可以从距离地球上万米的高空俯视大地、然后逐渐靠近地面,那感觉就像从飞机上坠地作死,爽到极点。

可这种无级缩放如果想实现在网页内,想着虽然有思路,但实现起来恐怕很复杂,至少就ka-map而言要动大手术。基本思路是这样的:

1、在地图视中采用至少两个层,两层要能交替显示;

2、第一个层用于显示当前缩放级别的地图,当放大地图的时候只需要改变每张分割图片的大小,让这些增加了尺寸的图片自适应放大,这时的图片分辨率会逐渐降低;

3、利用第二个层接收新缩放级别的清晰图片,待新分割图片下载完毕之后替换第一层内容;

4、缩小的时候同上原理;

5、当放大或缩小不足以激发新级别的时候,就不进行新分割图片的调用,只使用当前图片,只通过改变当前图片大小来实现伪缩放;

6、当放大视图、并且未完成新分割图替换的时候,进行了缩小操作,就放弃第二层图片的读取操作,以此防止资源的过渡损耗。

上面的逻辑只是拍着脑袋想出来的,光这点儿东西想着头就大,还没有考虑浏览器是否能顺利申请到足够的资源用以流畅运行,同时也没有算法支持。

但可以肯定,无级缩放是可以实现在浏览器内部的,随着网络发展、浏览器技术发展,并且最关键的──等到WebGIS的实用性功能足矣完美到无须过多耗费程序员的时间之后,就有精力和能力去实现这一美丽而又令人惊叹的视觉效果了。
如果说前些天是知识获取的爆炸阶段,那么这几天就是知识的巩固和细化阶段。我不喜欢这个过程、太枯燥了,只希望这个阶段赶快结束,好能够再次进入到新的学习和探索的过程中。

今天主要完善了两个地方:1、首页面的汉化和布局调整;2、尝试对dbf数据库进行扩充;

一、首页面的汉化和布局调整:

这没有什么新鲜的,就是用个记事本打开首页进行修改。值得注意的是ka-Map采用了很多ajax技术和div技巧,因而有些div一旦删除和改名、就会影响到系统的正常运行。因而在修改之前应做好备份工作,如果采用版本管理,就会方便许多。

同时有一个简单的取巧方法,就是将需要删除的段落使用display:none直接隐藏,不删除、不注释,只让它不可见,同样达到删除页面冗余元素的目的、还无须担心出现问题。

二、给查询结果加上超链接:

可以想像,若以GIS做为一个网站的首页,那么网站其他页面都无法通过这个地图页面进入,那么网站将会局限在一个视图中。若查询结果含有超链接,就可以直接点击到内容页。

我的做法是直接在dbf数据库中为数据增加超链接,例如数据库表格规划为:id、title、hotlink,在.map文件的查询结果配置中将title和hotlink一并显示出来,而hotlink则是经过设计的html语句,其中的链接直接可以体现在查询结果中。

这样做的好处是简单方便,坏处也显而易见:不灵活。

凭感觉猜测,如果不采用dbf做为数据库,而使用那个叫postgis什么什么的东西,估计会更简单、甚至可以实现动态生成链接和内容,这是瞎乱猜测,未经测试。且Shape组文件中默认含有dbf,以懒惰为荣耀的我未深入研究此方面。

接下来的工作是:

1、如何根据不同的缩放级别显示不同数量的图标?也就是说为每个数据点设置显示级别;

2、搜索功能还不能使用,尽快激活这个功能,首页的几个功能按钮就都是真实可用的了;

3、当地图含有多个图层的时候,如何控制各图层的可见性?如何关闭某图层或打开某图层?

4、能否有更简单的方法来生成shp文件?能否脱离C/S结构,而用B/S结构来绘制Shape文件?
接触GIS至今,还没有牵扯到开发工作,主要都是进行部署、测试、修改各环境参数,我想至少要等到将现有软件和环境全部研究透彻、才能有可能有针对性的进行修改、改进和再开发。

这篇文章将对我现在接触到的关于GIS的软件进行一个大体介绍,其中牵扯到的依赖性程序暂时不说,因为一说就该收不住了。

先说最基本的,是一个叫做MapServe的服务程序,是经过编译的二进制CGI,没有它就无法将GIS应用于webGIS领域。

有了MapServe,前面要部署一个网站,也就是前台,网上有比较多的选择,我选择的是ka-Map,它对AJAX的表现比较好,考虑日后仿Google Earth,用这个框架应该比较易于实现。

ka-Map要想运行,需要地图配置文件、ka-Map自身的配置文件和地图图层文件:

地图配置文件是一个很复杂的.map文件,如果手工用记事本来写也没有问题,但其过于复杂、裸代码写起来很吃力,因而可以用一款叫做MapStorer的PHP程序来更直观的生成.map文件。

ka-Map自身的配置文件很简单,就是一个config.php文件,没有太多讲述的必要。

ka-Map所能使用的地图文件有六类,其中我用到的是Raster和Vector两类,Raster就是一个含有地理信息的tiff图片,而Vector我采用的是ERSI公司发布的Shape文件。

任何一组Shape文件包含三个主要文件,扩展名分别为dbf、shp、shx,其中的shp是矢量图、dbf是数据库,shx应该是链接图层中各物体与数据库的关联文件。

这组Shape文件据说可以由AutoCAD绘制的dwg文件经过mapinfo转换得到,但是我的助手折腾了好几天也没有搞定,而我又不用AutoCAD,所以只能想别的方法得到。

使用Grass可以绘制地图、并导出成Shape文件组,经过测试也确实可以使用,而且免费开源,所以我现在就是应用的这个软件。版本号为6.2.3,官网上似乎已经有了7系版本,尚未尝试。

至此,可以说基本的webGIS环境就有了,大体流程如下:

1、用grass创建raster图层和vector图层,导出为若干图层待用;

2、使用map storer对图层整合,生成.map文件,用于配置各图层的位置和展现方式;

3、使用ka-map在web server中调用地图,使用浏览器进行观察、操作。
利用Ka-map搭建的WebGIS遇到的第一个问题是投影系统的大小、比例关系;遇到的第二个问题是图形文件的创建和生成;这两个问题在将会在第一季中进行总结。

今天遇到的是第三、四个问题,分别是:

1、图层上的点如何改变样式?

2、利用Grass62创建的图层中文乱码问题如何解决?

下面将两个问题的解决方案记录一下。

问题一、图层上的点如何改变样式?

解决方案:在Ka-map中有一系列symbols文件,这些文件中给出了各种图例样式,例如实心园点、小方块、十字形、小叉子等等,还可以指定用图标做为地图图例。

我在搭建GIS的过程中遇到的最多的问题就是文件路径错误和缓存无法刷新,文件路径错误不会给出任何错误提示、而缓存也同样会造成"毫无效果"的假象,因而调试起来很费时间。

然而只要调通,会发现改变标点样式非常简单、甚至可以做出很多漂亮的图例来。现在正在考虑用科学家小H提供的六类图例进行地图标注,找到好看的小图标就是成功的标志了。

问题二、利用Grass62创建的图层中文乱码问题如何解决?

这个问题也不难解决,但是却让我感到无法实现易用性的要求。原因是Grass62的软件操作时、手工标点完成后弹出的数据录入窗口不支持UTF-8编码(至少在我的freeBSD系统上如此),因而录入到dbf数据库中的内容均为gb2312编码。

而在Ka-map上进行读取、显示的时候,却全部以UTF-8进行处理,自然会出现乱码。我现在的解决方案是利用PHP将dbf文件进行遍历转换,将其中全部数据转换成UTF-8再使用。

这样做的坏处显而易见:用grass62生成的dbf必须经过导出变成含有dbf的图形文件,然后再通过PHP将其中的dbf转换一下。若操作失误,就会重复两次转换或忘记转换,同时在使用grass进行地图绘制的时候看到的全部是乱码,暂时还没有想到更好的办法。

以下是将dbf通过PHP读取并进行转换的程序片断:

<?php
$dbf_filename='./test.dbf';
$dbf_handle=dbase_open($dbf_filename, 2);
$max_n=dbase_numrecords($dbf);
for($x=1; $x<=$max_n; $x++) {
        $record=array();
        $record=dbase_get_record_with_names($dbf_handle, $x);
        unset($record['deleted']);
    foreach($record as $key=>$value) {
            $record[$key]=iconv("gb2312", "UTF-8", $value);
    }
        $record=array_values($record);
        dbase_replace_record($dbf_handle, $record, $x);
}
dbase_close($dbf_handle);
exit;
?>


尚未解决的问题:

1、如何根据不同的缩放级别显示不同数量的图标?也就是说为每个数据点设置显示级别;

2、框选地图查看数据虽然可以使用了,但是通过搜索找到数据点还不能使用;

3、当地图含有多个图层的时候,如何控制各图层的可见性?如何关闭某图层或打开某图层?

4、数据结果内容中是否可含有超链接?含有超链接才能方便的跳转到具体的数据展现页面。

GIS学习笔记写法规范及引子

|
以前写的学习笔记,都是几篇文章当成一个系列,而且都是我在做完项目和开发接近尾声的时候才会去写。而这次学习GIS技术的时间相对较长、并且至今依然没有首尾、还在每日进步一点点的状态。

因而GIS的学习笔记分成两个主线来写,为了追求标新立异,我将这两个主线命名为"季",以下为大体的计划:

GIS第一季:可能会有4到6集左右,主要收集基础知识和基本搭建过程;

GIS第二季:从今天开始要写的东西,也是现今每天都在关注、研究、学习、掌握的内容;

前年还是去年给一个小公司做北京地图的时候,就接触了一些这方面的东西、但比较入门,主要是因为那个公司已经有了一个比较成型的框架。而今给某单位做同样的应用,却要从最基础的环境搭建,又有较多新收获。

一直想将整套东西放在网络上展示一下,但给雇主做的东西都有合同和版权,无法共享给大家了。如果有条件,我会找些共享地图、再去租个便宜些的VPS来做DEMO。
友情链接

Google