首页 > 其他分享 >WebGIS设计与实现原理

WebGIS设计与实现原理

时间:2023-01-27 11:31:31浏览次数:42  
标签:地图 DOUBLE WebGIS HRESULT LONG 设计 BSTR 原理 out


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 [email protected]

//

//
关于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





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

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





//
生成缓冲区图形, 返回目标图形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);

标签:地图,DOUBLE,WebGIS,HRESULT,LONG,设计,BSTR,原理,out
From: https://blog.51cto.com/mapaware/6024042

相关文章

  • 模板方法设计模式
    模板方法设计模式1.说明核心是:定义一个模板类,在模板类中规定其整体的骨架并确定哪些方法是允许子类可以去重写的,哪些是不允许子类去重写的.用来保证核心算法不被破坏.......
  • 《RPC实战与核心原理》学习笔记Day10
    11|负载均衡:节点负载差距这么大,为什么收到的流量还一样?什么是负载均衡?当我们的一个服务节点无法支撑现有的访问量时,我们会部署多个节点,组成一个集群,然后通过负载均衡,......
  • 【分布式技术专题】「分布式缓存专题」针对于缓存淘汰算法之LRU和LFU及FIFO原理分析
    前提概要无论是浏览器缓存(如果是chrome浏览器,可以通过chrome:://cache查看),还是服务端的缓存(通过memcached或者redis等内存数据库)。缓存不仅可以加速用户的访问,同时也可......
  • 容斥原理与反演相关
    目录目录一些容斥原理规定容斥原理\(\text{Min-Max}\)容斥一些反演规定反演是什么?二项式反演一些容斥原理规定本文中集合指代非可重集。用大写字母记一个集合,例如......
  • 浅谈PHP设计模式的享元模式
    简介:享元模式,属于结构型的设计模式。运用共享技术有效地支持大量细粒度的对象。适用场景:具有相同抽象但是细节不同的场景中。优点:把公共的部分分离为抽象,细节依赖于抽......
  • 浅谈PHP设计模式的中介者模式
    简介:中介者模式,属于行为型的设计模式。用一个中介对象来封装一系列的对象交互。中介者是各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变他们之间的交互。......
  • 编译原理分析器大作业之字幕分析器
            写这篇文章的主要目的呢是分享一下编译原理大作业——电影字幕分析器,分享一下我的做法,可能采用的做法不是特别好的用法,希望各位多多指点,觉得文章不错给点小......
  • 《RPC实战与核心原理》学习笔记Day9
    10|路由策略:怎么让请求按照设计的规则发到不同的节点上?我们在真实的环境中,服务提供方是以集群的方式对外提供服务,这对于服务调用方来说,就是一个借口会有多个服务提供方......
  • UTF8 最初设计编码最长时 6 字节
    UTF8最初设计编码最长时6字节。2002年MySQL觉得3字节就足够了,于是写死UTF8最长3字节存储。2003年的UTF8新标准,规定最长是4字节编码。但没有问题,毕竟4字......
  • C++语言课程设计任务书[2023-01-26]
    C++语言课程设计任务书[2023-01-26]课程设计要求及评分标准:一、教学目标和基本要求本课程全面系统的学习面向对象程序设计的基本概念,基本语法和编程方法。正确理解掌握C......