王朝网络
分享
 
 
 

WebGIS设计与实现原理

王朝other·作者佚名  2006-12-14
宽屏版  字体: |||超大  

WebGIS设计与实现原理

褫其华衮,示人本相系列之一

2006-2-18

cheungmine

1 什么是WebGIS

我的定义是:在internet领域内,向WWW服务器请求地图数据或与之相关的操作,从而获得地图并呈现给最终用户的过程。几点共识是:客户端不必安装任何插件(当然必要的浏览器和XML支持是少不了的);服务端动态生成地图(强调这一点,是因为这样的Webgis引擎才符合工业标准。否则只能称为带有地图图片的网站)。符合上述定义的Webgis的优点是显而易见的:

(1)地图由服务器动态按需生成,发送给客户端只是最终生成的图片(我的经验是png格式为好),对客户端的要求降到最低。

(2)利用服务器的中心控制、监视和审计,保障了数据的安全和实现的一致性。

(3)方便部署的特征,使升级和扩展都异常简单。

因此,我希望以后在谈论Webgis的时候,再也不要听到Plugin、ActiveX、Applet之类的字眼。

2 Webgis技术原理

说了一大堆,就要谈到核心实现了。别以为我在这里胡吹海侃,我确实是真的把自己的体会和经验(教训)无偿的奉献给莘莘学子。我的体会是:

(1)一种技术,如果太过复杂,就称不上是好技术。比如质能方程E=MC­­*C其简单和优美。所以,我以为宇宙的定律就是简单的规则,当然,多数我们还没发现。

(2)一种实现,如果要写一大堆的代码,仍然不是一种好的实现。就比如夸一个人长的美,说一千道一万,不如就2个字:好看。

秉承这个原则,下面介绍我的技术:

(1)客户端(IE)采用AJAX,直接调用服务端的Services。

(2)服务端编写Web Services,响应客户的请求。

原理就这些,为什么我就不说了,如果你不知道,说明你还需要学啊学啊学。

3 Webgis实现

先说服务端的实现。按上面说的,就是写Web Services(Web服务)。可能目前没有比写Web Services更时髦的了。还有人说Google Web API要代替传统的Win32API。其实这完全是2种计算模式,谁也代替不了谁。许多专家就喜欢炒作,把媒体那一套应用到我们这个技术领域,误导消费者。

其实,若不是浏览器大行其道,Webgis算个啥啊。这社会从来就没公平过,好好的C/S不用,非强迫我们在浏览器里搞啊搞的。没办法,就搞吧,看谁搞得过谁?

写Web Services有很多语言可写,什么C#、Java、C++等等等等。需要一套称之为Webgis API的东西。设计这样一套API让AJAX调用。怎么设计呢,我会把我的接口公布出来,供大家参考漫骂。

其实最重要的是服务端的地图生成引擎(引擎就是发动机)。我自己实现了一个(带VVT-i的啊),没有的要自己实现,或者买个现成的(比如MapObjects)。

该说客户端了。AJAX吗,其实就是JavaScript + XMLHttpRequest(微软版本)对象啊。就别用什么Webservices.htc了,虽然是微软写的,还真他妈不好用。我从高人那里抄了一个,改了改,就用上了。看我上篇文章啊,那个是100%的源代码,没错误的啊。

剩下的再说就显得多余了。画个体系结构图吧:

(图象怎么显示不出来??)

WebGIS体系结构图

4 小贴示

看到这里你是不是觉得恶心了,提示就提示干嘛贴示啊。不是有国内北大高人翻译《ATL 技术内幕》非满纸的“控制”。我看了就别扭,国内叫“控件”,这个还比较舒服。翻译的就别提多牵强了。

(1)服务端要以多线程(IIS进程)服务请求。

(2)地图引擎加载数据,要能够静态和动态2种模式载入。

(3)绝对不要想着传矢量的数据,传图片最好,哪怕未来网络带宽提高100倍。

(4)写的要绝对健壮,不然把IIS搞瘫了。

(5)记得在服务端保持客户状态啊。

5 附录:Webgis WebServices 接口和方法

也许一不小心成了标准呢?其实就是想让读者在做这方面的设计时,有个参考,反面典型也好。我把修改数据方面的API去掉了,太危险了,还是不说出来的好。

// Webgis接口方法说明

// 2006年8月

// ATL Server Webgis Services Created by cheungmine@gmail.com

//////////////////////////////////////////////////////

// 关于MtkWebgisService

//////////////////////////////////////////////////////

// 取得服务相关信息

HRESULT about([out, retval] BSTR *Info);

// 取得服务器日期时间

HRESULT svrtime([out, retval] mtkTime *time);

//////////////////////////////////////////////////////

// 登入与登出, login必须是第1个调用的服务端方法

//////////////////////////////////////////////////////

// 登入系统, 获得用户令牌和全图URL, 以后任何方法调用必须给出令牌

HRESULT login([in] BSTR Username, [in] BSTR Password);

// 登出系统, 注销用户令牌

HRESULT logout();

//////////////////////////////////////////////////////

// 基本信息

//////////////////////////////////////////////////////

// 当前MTK Canvas版本

HRESULT version([out, retval] BSTR *Ver);

// 取得全部图层信息, 以XML内联返回

HRESULT mapinfo([out, retval] BSTR *xmlInfo);

// 取得全部图层信息, 返回生成的XML的URL

HRESULT mapxml([out, retval] BSTR *xmlURL);

// 取得图层信息, 以XML内联返回

HRESULT layinfo([in] LONG LayerIndex, [out, retval] BSTR *xmlInfo);

// 取得图形属性信息, 以XML内联返回. 若图层索引为>=MTK_TMPLAYER_INDEX, 则在临时层上

HRESULT shpinfo([in] LONG LayerIndex, [in] LONG fromShapeIndex, [in] LONG fetchCount, [out, retval] BSTR *xmlInfo);

// 取得图形属性信息, 返回生成的XML的URL. 若图层索引为>=MTK_TMPLAYER_INDEX, 则在临时层上

HRESULT shpxml([in] LONG LayerIndex, [in] LONG fromShapeIndex, [in] LONG fetchCount, [out, retval] BSTR *xmlURL);

//////////////////////////////////////////////////////

// 地图浏览和点查

//////////////////////////////////////////////////////

// 刷新地图, 取地图imgURL

HRESULT refresh([out] DOUBLE* Scale, [out, retval] BSTR *imgURL);

// 地图控制显示比例

HRESULT scale([out] DOUBLE* minScale, [out] DOUBLE* maxScale);

// 按比例显示地图, 不改变当前地图中心位置

HRESULT zoom([in] DOUBLE Scale);

// 指定视图位置放大或缩小地图, 指定放大缩小的百分比

HRESULT zoomat([in] mtkPoint Pos, [in] SHORT Percent);

// 开窗显示地图, 指定视图上的2点

HRESULT zoomext([in] mtkPoint Pos1, [in] mtkPoint Pos2);

// 开窗显示地图, 指定地图上的2点

HRESULT zoomext2([in] mtkPoint Pt1, [in] mtkPoint Pt2);

// 移动地图, 指定视图上的2点

HRESULT move([in] mtkPoint fromPos, [in] mtkPoint toPos);

// 选中图形对象, 指定视图上的点. 返回对象的sid负值和所在的图层索引和对象信息

HRESULT identify([in] mtkPoint Pos, [out] LONG* _sid, [out] LONG* layId, [out, retval] BSTR* shpInfo);

// 设置图层状态属性, 指定层的索引和状态名称, 状态值

HRESULT setlayer([in] LONG LayerIndex, [in] mtkEnumLayerState State, [in] bool bVal);

// 以指定视图上的点为中心, 定位地图

HRESULT centerat([in] mtkPoint Pos);

// 以指定地图坐标点为中心, 定位地图

HRESULT centerat2([in] mtkPoint Pt);

// 地图翻页, 指定方向Up,Down,Right,Left和页面重叠百分率0%~100%"

HRESULT flip([in] mtkEnumFlip Direction, [in] SHORT Overlap);

// 清除选中的对象

HRESULT clear();

//////////////////////////////////////////////////////

// 地图测量, 视图上的点串

//////////////////////////////////////////////////////

// 地图测量, 返回距离, 面积和地图单位

HRESULT measure([in] mtkPoints PathPoints, [out] DOUBLE* Length, [out] DOUBLE* Area, [out] BSTR* Unit);

// 地图测量, 返回距离, 面积和地图单位

HRESULT measure2([in] BSTR PathString, [out] DOUBLE* Length, [out] DOUBLE* Area, [out] BSTR* Unit);

//////////////////////////////////////////////////////

// 坐标变换: 视图(view)与数据(data)之间的正反坐标变换

//////////////////////////////////////////////////////

// 取得地图当前数据坐标范围

HRESULT extent([out] DOUBLE* MinX, [out] DOUBLE* MinY, [out] DOUBLE* MaxX, [out] DOUBLE* MaxY);

// 视图点变换到数据坐标点

HRESULT vp2dp([in] LONG VX, [in] LONG VY, [out] DOUBLE* DX, [out] DOUBLE* DY);

// 数据坐标点变换到视图点

HRESULT dp2vp([in] DOUBLE DX, [in] DOUBLE DY, [out] LONG* VX, [out] LONG* VY);

// 视图点串变换到数据坐标点串

HRESULT vs2ds([in] BSTR VS, [out, retval] BSTR* DS);

// 数据坐标点串变换到视图点串

HRESULT ds2vs([in] BSTR DS, [out, retval] BSTR* VS);

//////////////////////////////////////////////////////

// 空间查询与分析

//////////////////////////////////////////////////////

// 重置过滤器. 清除所有以前设置的过滤器

HRESULT resetFilters();

// 设置过滤器, 可以多次调用此方法以设置多个过滤器, 只要服务端支持多过滤. 返回过滤器总数

HRESULT addFilter([in] mtkFilter Filter, [out, retval] LONG* Count);

// 根据条件查找图形对象, 返回查询到的对象数. 查询结果图层为临时层, 索引为i+MTK_TMPLAYER_INDEX

HRESULT findShapes([in] LONG LayerIndex, [in] BSTR SqlClause, [in] bool UseFilters, [out, retval] LONG* Count);

// 生成缓冲区图形, 返回目标图形sid. 此操作都在跟踪层中

HRESULT bufferShape([in] LONG sid, [in] DOUBLE Distance, [out, retval] LONG* sidDst);

// 将非跟踪层中的图形数据保存到跟踪层中, 返回图形sid

HRESULT trackShape([in] LONG LayerIndex, [in] LONG ShapeIndex, [out, retval] LONG* sid);

//////////////////////////////////////////////////////

// 图形编辑

//////////////////////////////////////////////////////

// 创建新图形对象, 返回图形对象的ID

HRESULT createShape([in] mtkEnumGeometry GType, [out, retval] LONG* sid);

// 向新图形对象中增加视图上的点, 象素坐标

HRESULT addPt([in] LONG sid, [in] mtkPoint Pos);

// 向新图形对象中增加点, 地图坐标

HRESULT addPt2([in] LONG sid, [in] mtkPoint Pt);

// 向图形对象中增加单一属性, 指明列索引0-based, 列值

HRESULT setCol([in] LONG sid, [in] SHORT colId, [in] BSTR colVal);

// 清除指定sid的图形. 绘制的图形都保存在跟踪层中. sid=0全部删除

HRESULT clearShape([in] LONG sid);

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
>>返回首页<<
推荐阅读
 
 
频道精选
 
静静地坐在废墟上,四周的荒凉一望无际,忽然觉得,凄凉也很美
© 2005- 王朝网络 版权所有