??xml version="1.0" encoding="utf-8" standalone="yes"?>
]]>
]]>
]]>
]]>
]]>
]]>
长久以来Q由于地理空间信息行业的固有特点Q在q一领域中存在着多种不同的文件或数据库格式。当用户使用了某个公司的数据存储格式之后Q常常就被迫使用同一个公司的软gQ以讉K他们自己的数据。如果希望用其它公司的软gQ就往往要耗费大量的精力把数据从一U格式{换成另一U格式,或者设法去dq些专有格式。在q个q程中,可能D的问题包?
◆ 数据丢失:例如一U格式中记录的数据可能无法或很难转移到另一U格式中;
◆ _ֺ损失:例如把数据从一个双_ֺ的格式中转移到单_ֺ甚至整型的格式中;
◆ 数据冗余:同一份数据要创徏多种格式的拷?
◆ q时信息:当一个版本的数据更新后,未能及时更新其它格式的版本,D目成员使用q时的数据而导致不必要的错?
◆费成本:大量的时间和金钱耗费于毫无生产性的工作?/p>
?strong style="background-color: #ffff66; color: black">FDO技术的帮助下,针对每种现有的数据存储格式,只要~写一D늨序,原有的数据存储“译”?strong style="background-color: #ffff66; color: black">FDO APIQ就可以提供l?strong style="background-color: #ffff66; color: black">FDO的应用程序访问。这?#8220;译”E序q?strong style="background-color: #ffff66; color: black">FDO Provider。只要安装了FDO ProviderQ应用程序就可以通过调用FDO接口来直接访问相应的数据存储Q而不再需要进行格式{换。因此,开发h员可以将更多的精力集中于应用E序逻辑Q而不是处理各U数据格式?/p>
Autodesk不仅制订?strong style="background-color: #ffff66; color: black">FDO API的标准,q开发了一pd?strong style="background-color: #ffff66; color: black">FDO Provider提供l用戗目前已包括:
◆ 文g型数据源:SDF、SHP;
◆ 数据库型数据?ArcSDE、Oracle*、MS SQL Server*、MySQL、ODBC;
◆ Web数据?W合OGC规范的WMS/WFSQ只读);
◆ 光栅数据?多种常见的二l光栅格式和DEM格式*Q只读)?/p>
Z推广FDO技术的应用QAutodesk与OSGeo合作Q将FDO作ؓ一个开攄标准发布Qhttp://fdo.osgeo.org/Q,q将已有?strong style="background-color: #ffff66; color: black">FDO Provider作ؓ免费的开源品A献给CQ列表中?L除外Q?/p>
在OSGeo的推动下Q?strong style="background-color: #ffff66; color: black">FDO正在成ؓ讉K地理I间数据格式的统一的标准,q且已经由开源社区的开发h员(而非AutodeskQ提供了更丰富的FDO ProviderQ包括OSGeo FDO Provider for PostGIS和OSGeo FDO Provider for GDAL/OGR。这些ProviderE序都基于标准的FDO接口Q因此应用程序可以轻杄使用它们来扩展其支持的格式?/p>
另外Q由?strong style="background-color: #ffff66; color: black">FDO Provider本nq不必须是开源的Q因此对于原先私有数据格式的所有者,即在不公开该格式的情况下,也可以通过发布FDO Provider使得其它开发h员和应用软g可以讉K该格式中存储的数据。借助FDO ProviderQ应用Y件还可以讉K遵@OGCQOpen Geospatial ConsortiumQ标准的WMS/WFSQ网l地?要素服务Q站点,从而获取基于Web的公开的地图数据资源?/p>
有了FDOQ企业就不再局限于某一数据格式的Y件供应商Q而是可以自由的选择功能更强大、h格更低廉的Y件来讉K其自w的数据资源Q从而可以降低成本,提高生力?/p>
SDFI间数据格式
Autodesk不仅推出?strong style="background-color: #ffff66; color: black">FDO技术以讉K现有的地理空间数据格式,q开发了新的开攄I间数据格式SDFQSpatial Data FormatQ?strong style="background-color: #a0ffff; color: black">SDF格式是基于开源数据库格式sqliteQhttp://www.sqlite.org/Q,q且针对大型GIS数据集的存储q行了优化?/p>
SDF是一U易于用的文g型空间数据格式,它能够在一个文件中以表格的方式存储多种地理要素Q包括多U几何类型(炏V线、多边Ş和圆弧)以及兌的属性信息。与SHP相比Q它更ؓy便携Q用双_ֺ存储Q支持真正的圆弧对象Qƈ且支持v量数据存储(可存放超q?00GB的数据)Q性能优越?/p>
而与Oracle{真正的数据库系l相比,它的成本更低廉,更易于复制和传送,因此更适合于个人或型pȝ使用。?strong style="background-color: #ffff66; color: black">FDO技术,q能够轻杄?strong style="background-color: #a0ffff; color: black">SDF转换成其它格式,因此当企业规模发生变化,需求从型pȝq化到大型数据库pȝӞ可以很方便的?strong style="background-color: #a0ffff; color: black">SDF的数据迁U进入Oracleq样的数据库?/p>
DWF囑Ş技?/strong>
DWFQDesign Web FormatQ图形格式是一U专为网l应用而设计的矢量囑Ş格式Q可其UCؓ“|络时代的电子图U?#8221;。DWF与AutoCAD DWG看v来相|但也有很大的不同?/p>
首先QDWF是高度压~的格式Q体U小巧,因此更便于网l传?其次QDWF是专为图形浏览、审阅和打印而设计的Q它忠实的再C原始囑ŞQ但却不可进行更改(只能dҎQ,因此能够保证数据的安全可靠?最后,DWF是一U智能的囑Ş格式Q它不仅支持囑ֱ控制、电子量、三l模型和多页囄集,更重要的是它q包含了对象的属性数据?/p>
例如Q在一个DWF的地图文件中Q审思h员不仅可以选中一个地块,用电子方式测量它的面U,q可以查看其中包含的地块属性,例如产权所有者、绿化率和徏{密度。当发现错误Ӟ可以在图上添加电子批注,然后DWF文g发回l制图h员修攏V因此,在基于网l的囑Ş览和审ҎE中QDWF是最佳的数据格式?/p>
DWF对于Web应用也有非常重要的意义。我们不仅可以在安装了DWF Viewer插g的Internet Explorer软g中直接浏览DWF文gQ更重要的是Q由于DWF是一U流媒体格式Q这意味着可以在文件下载的q程中逐步昄其中的内容,而不是等到整个文件下载完成之后才昄其全部内宏V因此,ZDWF技术的Web应用能提供更好的用户体验?/p>
MapGuide Open Source
MapGuide Open Source是Autodesk开源的地理I间信息技术的集大成者。它l合利用了多U开源技术,提供了一个先q的WebGISq_Q用于集成多U数据源Q徏立一个基于Web的地理空间信息应用系l,地理空间数据发布到Internet/Intranetq行׃n。ƈ且,׃MapGuide Open Source是专门针对WebGIS应用开发的Q因此非常容易学习和使用Q性能也更为出艌Ӏ?/p>
MapGuide Open Source是由Autodesk独立开发的全新产品Qƈ?005q?1月发布。尽其名称与以前的Autodesk MapGuide 6.5怼Q但是新的MapGuide是完全重新开发的Q用了与以前截然不同的技术,因此实际上是两个完全不同的品。新的MapGuide包含两个版本:开源版本MapGuide Open Source和商业版本Autodesk MapGuide Enterprise 2007?/p>
q两个版本的内核完全相同Q绝大多数功能也一P但商业版本提供了更多的高U功能(例如用于Oracle和SQL Server?strong style="background-color: #ffff66; color: black">FDO ProviderQ,q且可以获得Autodesk公司提供的技术支持和服务?/p>
与以前的Autodesk MapGuide 6.5相比QMapGuide Open SourceQ也同样适用于商业版本)使用了最新的行技术,因此更加卓越。其主要的新Ҏ如?
◆ HTMLQAJAXQ和DWF两种览方式
MapGuide Open Source可集成服务器端的多种数据源,q过HTML方式或DWF方式发送到客户端。这两种方式提供了几乎完全相同的界面和功能,包括动态的囑Ş~放和^UR图层控制、选中要素q查看属性数据、Q动提C、图上测量和~冲区分析等?/p>
在HTML方式中,服务器端的地理空间数据被转换成光栅图像发送到览器,使用AJAXQAsynchronous JavaScript and XMLQ技术进行用户交互,而无需在客L安装M插g。而在DWF方式中,发送到客户端的是DWF格式的矢量数据,使用览器内嵌的DWF Viewerq行查看Q因此能够提供更快的用户响应速度、更好的~放和打印性能Q另外还可以DWF文g保存到本C备脱机浏览?/p>
◆使用FDO数据讉K技?/p>
MapGuide Open Source使用FDO作ؓ数据讉K的接口,因此它能够无~直接读取多U地理空间数据格式,包括SDF、SHP、ArcSDE{。另外,在Autodesk MapGuide Enterpriseq一商业产品中还提供了对Oracle和SQL Server的支持。作ZƄqOGC认证的品,MapGuide Open Sourceq支持通过WMS/WFS集成和发布Web地图数据?/p>
◆ 更强大的囑Şq_
MapGuide Open Sourceq具有更强大的图形显C性能Q包括支持真彩色、TrueType字体、地囄号库、透明填充和智能的文字标注功能。另外,它还提供了更方便的用户交互界面。很多在以前的MapGuide 6.5中需要通过开发h员编E实现的常用功能Q现在都可直接从MapGuide产品中获取?/p>
◆ I间应用服务?/p>
׃MapGuide Open Source是在服务器端q行I间数据的访问、查询和分析Q因此这p予它一U强大的Ҏ,作ؓ一个空间应用服务器Q以“机器到机?#8221;的方式与其它应用pȝq行交互?/p>
单来Ԍ当另一个应用YӞ不限于Web览器)按照事先U定的方式向MapGuide Open Source服务器发送一个请求时QMapGuide Open Source接受q个hQ执行其操作Q例如查询某个指定区域内的地理空间数据)Q然后将操作的结果以事先U定的格式发送给该应用YӞ然后该Y件就可以按照其自w的需求对q回的信息进行处理?/p>
MapGuide作ؓI间应用服务器的一个最C子,是加拿大的Nanaimo市用它与Google Earthq行集成。该|站Qhttp://earth.nanaimo.ca/Q可以将市政府的MapGuide服务器中的空间数据输Zؓkml格式QGoogle Earth的文件格式)。于是,当用户在Google Earth客户端中打开一个包含MapGuide服务器地址的kml文gӞGoogle Earth客户端就向该MapGuide服务器进行查询?/p>
而MapGuide服务器接收请求后Q就查询该地区的I间数据q生成kml格式q回lGoogle Earth客户端。然后,Google Earth客户端就可以昄来自MapGuide的空间数据ƈ叠加到它自n的卫星媄像上?/p>
因此QMapGuide不仅仅是一个Web地图q_Q更是一个基于Web的空间数据引擎。用MapGuideQ可以很Ҏ的ؓ其它应用pȝ提供I间查询和分析功能,或是分布于多个pȝ中的I间数据集成C个客L上进行浏览?/p>
MapGuide Open SourceQ以及Autodesk MapGuide EnterpriseQ提供了如此之多的强大功能,因此能够用于架设企业U的地理I间信息应用pȝ?/p>
另外QAutodeskq提供了与之配套的开发工具Autodesk MapGuide StudioQ用于收集和整理地图数据、创建地图显C样式,以及集成?net、Java或PHP开发的应用E序逻辑Qƈ在发布之前对整个pȝq行预览。Autodesk MapGuide Studio是一个独立的商业软gQ但Autodesk也提供了可下载的免费试用版本Qƈ且可向开发商合作伙伴提供用于开发的许可?/p>
此外QMapGuide Open Sourceq能够与桌面软gAutodesk Map 3D 2007协同使用Q以化地囑ֈ建到发布的流E。Autodesk Map 3D 2007是基于AutoCAD的地囑ֈ作与~辑软gQ商业品)Q它也同样?strong style="background-color: #ffff66; color: black">FDO数据讉K技术,因此能够直接讉K多种地理I间数据格式Q用AutoCAD工具q行~辑Qƈ创徏地图昄样式和制作专题地图。用Map 3D制作的地囑֏以直接输出到MapGuide Open Source服务器上q行发布Qƈ且保持在Map 3D中做好的昄样式?/p>
采用LGPL授权
与开源Y件中行的GPL授权不同QAutodesk在MapGuide Open Source以及大部?strong style="background-color: #ffff66; color: black">FDO Provider中用的是LGPL授权。与GPL相比QLGPL授权是一U更为宽杄授权?/p>
如果您在自己开发的软g产品中包含了ZLGPL授权的品(例如在MapGuide Open Source的基上开发的应用pȝQ,LGPLq不要求开放您新增的这些代码(与之相反QGPL授权要求开放您新增的所有代码)。您所开发的新Y件可以是开攄或者私有的Q可以是免费的或者收费的Q没有Q何限?但如果修改了其中原品的部分代码Q那么您必须明确的指Z改的部分Qƈ公布修改后的代码。因此,与采用GPL授权的开源YӞ例如MapServerQ相比,MapGuide Open Source更加适合于商业应用?/p>
事实上,Autodesk MapGuide Enterprise 2007是ZMapGuide Open Source的一个商业品,它包含MapGuide Open Source的所有功能?/p>
Z让更多用户从MapGuide Open Source受益QAutodesk此软g捐献lOSGeo基金会。用户可从OSGeo|站下蝲和用该产品及其源代码?/p>
q意味着MapGuide Open Source不再属于Autodesk所有,而是属于以OSGeoZ表的全体开源社区。但同时也需注意QAutodesk不对MapGuide Open Source的用h供技术支持和M保障Q这些用户需通过开源社取支持。Autodesk仅对Autodesk MapGuide Enterprise的用h供支持和服务?/p>
l语
通过本文的介l,我们要的览了Autodesk在地理空间信息领域的一pd开源技术和产品。用来自Autodesk的开源技术,能够与其它开源Y件或商业软g集成Q徏立v完善的基于Web的地理空间信息应用系l,从而ؓ最q泛的用户共享地理信息,同时帮助企业降低成本Q提高生产力。Autodesk与OSGeo协作Q不断的为地理空间信息的开源事业做A献?/p>
? FDO数据讉K技?/p>
? MapGuide Open Source 站点架构
构造函C下面开始在map中初始化自己的events属?
this.events = new OpenLayers.Events(this,
this.div,
this.EVENT_TYPES,
this.fallThrough,
{includeXY: true});
再往下就注册?
if(this.eventListeners instanceof Object) {
this.events.on(this.eventListeners);
}
通过map自己的Events属?其实也是个object,是eventscȝ实例)中的onq个函数注册上,
我们要进入OpenLayers.Eventsc?br />---------------------------------------------------------------------------
---------------------------------------------------------------------------
看这个onҎ
/**
* Method: on
* Convenience method for registering listeners with a common scope.
*
* Example use:
* (code)
* events.on({
* "loadstart": loadStartListener,
* "loadend": loadEndListener,
* scope: object
* });
* (end)
*/
on: function(object) {
for(var type in object) {
if(type != "scope") {
this.register(type, object.scope, object[type]);
}
}
},
onq个函数参数q是W一步中我们传入的eventListenersQ就是那个哈希表
遍历Q这个“scope”键值是事g的“生源”对象,是q个键值对应的对象触发我们注册的事?br />register(type, object.scope, object[type])
type是事g名称
object[type]是处理事g的函数名
可以看一下第一步中传入的参?
eventListeners: {
"moveend": mapEvent,
"zoomend": mapEvent,
"changelayer": mapLayerChanged,
"changebaselayer": mapBaseLayerChanged
}
再进入eventscȝ另一个函?this.register(type, object.scope, object[type])
/**
* APIMethod: register
* Register an event on the events object.
*
* When the event is triggered, the 'func' function will be called, in the
* context of 'obj'. Imagine we were to register an event, specifying an
* OpenLayers.Bounds Object as 'obj'. When the event is triggered, the
* context in the callback function will be our Bounds object. This means
* that within our callback function, we can access the properties and
* methods of the Bounds object through the "this" variable. So our
* callback could execute something like:
* : leftStr = "Left: " + this.left;
*
* or
*
* : centerStr = "Center: " + this.getCenterLonLat();
*
* Parameters:
* type - {String} Name of the event to register
* obj - {Object} The object to bind the context to for the callback#.
* If no object is specified, default is the Events's
* 'object' property.
* func - {Function} The callback function. If no callback is
* specified, this function does nothing.
*
*
*/
register: function (type, obj, func) {
if ( (func != null) &&
(OpenLayers.Util.indexOf(this.eventTypes, type) != -1) ) {
if (obj == null) {
obj = this.object;
}
var listeners = this.listeners[type];
listeners.push( {obj: obj, func: func} );
}
},
到这里,我们能看到我们所说的核心Q那个哈希表Q把自己的值都赋给了eventscȝ一个属?listeners
/**
* Property: listeners
* {Object} Hashtable of Array(Function): events listener functions
*/
listeners: null,
q个事g机制的核心哈希表Q键名就是事件的名称,也就是参C的type,键值是一个对象{obj: obj, func: func}
当然q个对象中还有对象。。。?/p>
现在事g已经注册上了Q还有一个问题,register函数中提Cthis.eventTypesQthis.object
所以我们再回来看下eventscȝ构造函数?br />mapcM实例化events属性的情景:
this.events = new OpenLayers.Events( this, //指的是map
this.div,
this.EVENT_TYPES,
this.fallThrough,
{includeXY: true});
我们可以和eventscȝ构造函数对比一下参敎ͼ׃明白了?
/**
* Constructor: OpenLayers.Events
* Construct an OpenLayers.Events object.
*
* Parameters:
* object - {Object} The js object to which this Events object is being
* added element - {DOMElement} A dom element to respond to browser events
* eventTypes - {Array(String)} Array of custom application events
* fallThrough - {Boolean} Allow events to fall through after these have
* been handled?
* options - {Object} Options for the events object.
*/
initialize: function (
object,
element,
eventTypes,
fallThrough,
options)
{
OpenLayers.Util.extend(this, options);
this.object = object;
this.element = element;
this.fallThrough = fallThrough;
this.listeners = {};
// keep a bound copy of handleBrowserEvent() so that we can
// pass the same function to both Event.observe() and .stopObserving()
this.eventHandler = OpenLayers.Function.bindAsEventListener(
this.handleBrowserEvent, this
);
// if eventTypes is specified, create a listeners list for each
// custom application event.
this.eventTypes = [];
if (eventTypes != null) {
for (var i=0, len=eventTypes.length; i<len; i++) {
this.addEventType(eventTypes[i]);
}
}
// if a dom element is specified, add a listeners list
// for browser events on the element and register them
if (this.element != null) {
this.attachToElement(element);
}
},
上面events的初始化是发生在map的初始化中,this.events.on(this.eventListeners);之前的,所以上面提到的register函数中的this.eventTypesQthis.object 明意思了Q?br /> this.object(this是指的eventsc?是map,也就是说map是我们第一步传入参C的注册事件的“发生源”,Q比如button是onclik的“发生源”,“发生源”是本h自定义的。。不知道是否有合适的U呼Q术语应该就是srcElementQ?br />this.eventTypes(this是指的eventsc?是mapcM定义的一个常?this.EVENT_TYPES(this是指的mapc?
查到mapcM的这个常?EVENT_TYPES: [
"preaddlayer", "addlayer", "removelayer", "changelayer", "movestart",
"move", "moveend", "zoomend", "popupopen", "popupclose",
"addmarker", "removemarker", "clearmarkers", "mouseover",
"mouseout", "mousemove", "dragstart", "drag", "dragend",
"changebaselayer"],
所以我们在初始化map的时候传入的参数中,注册的事仉是来自于q个帔R中的
MapGuide ?/span> Fusion 框架最为核心的地图 Widget Q就是采用了 OpenLayers 框架?/span> Fusion 框架?/span> OpenLayers q行包装Qؓ其添加了更多的功能,从而之能够更W合 Fusion 框架q与其余 Fusion lgq行交互?br />
非常有趣的是Q由?/span> OpenLayers 所采用的术语跟 Fusion 采用的ƈ不是十分一_甚至 Fusion 不同部分采用的术语也不是十分一_所以同一个名字在不同地方表达的意思却很可能ƈ不相同。所以,在详l介l?/span> Fusion 如何?/span> OpenLayers q行包装之前Q有必要对两者之间的术语q行一下区分,以免当您阅读到相x料时感到疑惑?/span>
OpenLayers 认ؓQ用L到的由多个图?/span> (layer) l成的一张地?/span> (map) 。地图本w与加蝲的数据源格式无关Q与数据源格式相关的是图层。因此,地图cd有一个( OpenLayers.Map Q,而图层类却有很多Q这些类都以 OpenLayers.Layer 作ؓ命名I间Q如 OpenLayers.Layer.Google/Yahoo/MapGuide/WMS/Vector {等?/span>
q样的结构有一个问题,那就是所有的囑ֱ之间是^行的关系Q这是很不利于图层管理的。我们假设有q样一张地图:该地囑含有十二个图层,有九个来自于不同数据源的囑ֱ和三个位于顶层的 Vector 层。那么,我如果想用代码去处理所?/span> Vector 的层Q就必须遍历所有的层,依次比较是不?/span> Vector 层,再对 Vector 层进行处理。解册个问题的Ҏ很简单,那就是引入层U结构,允许用户把图层分l。比如上面的例子中,把三?/span> Vector 分成一l,比如命名为“标记”组Q届时只需要对标记l中的每一个层q行处理卛_?/span>
q也正是 Fusion 对于 OpenLayers 众多改进中的一个。而问题也正是q里引入的:地图 Widget 在给q种层l构命名的时候,Zh意料地采用了另外的命名方式:地图 Widget 把图层组命名为“地囄?/span> (map group) Q把l里面的囑ֱ命名?/span> (map) 。下面代码是CZ数据?/span> Library://Samples/Sheboygan/FlexibleLayouts/Slate.ApplicationDefinition 布局文g对于地图定义的那一部分Q用户可以在 MapGuide Studio 中通过点击位于 Map 面板上的 “Edit Map Group?/span> 按钮来查看这部分内容?/span>
<?xml version="1.0" encoding="utf-8"?> <MapSet xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> <MapGroupType id="Sheboygan"> <Map> <Type>MapGuide</Type> <SingleTile>true</SingleTile> <Extension> <ResourceId>Library://Samples/Sheboygan/Maps/Sheboygan.MapDefinition</ResourceId> <SelectionAsOverlay>true</SelectionAsOverlay> <SelectionColor>0x0000FFA0</SelectionColor> </Extension> </Map> <Extension /> </MapGroupType> </MapSet> |
布局文g中地囑֮义的部分代码
其实Q?/span> MapGuide q样做是有原因的。这个问题源于不同品之间定位的不同Q?/span> OpenLayers 框架的目的是在同一张地图上面显C多个数据源。所以在 OpenLayers 看来Q一个来?/span> MapGuide 的地图仅仅是一个层而已。然而,?/span> MapGuide 内部Q一?/span> MapGuide 地图内是包含多个 Layer Q具体表现就是一?/span> MapDefinition 里可以包含多?/span> LayerDefinition 。所以,如果 Fusion ?/span> MapGuide 叫做一?/span> Layer 的话Q又该如何称呼里面的 Layer 呢?
鉴于q样的考虑Q?/span> Fusion 才做了这U概念上的映: Fusion 中的地图 Widget 对应 OpenLayers 里面的地图; Fusion 里面的地囄是一个逻辑概念Q从而Ş成一U逻辑上的层l构以便理Q?/span> Fusion 中的地图实际对应?/span> OpenLayers 里面的图层?/span>
但事情到q里q没有结束,接下来的事情可能会让您有些意外:在编写地?/span> Widget 实现代码ӞZ能够便于?/span> OpenLayers 中的cd应v来, Fusion 地图(也就?/span> OpenLayers 中的囑ֱQ称?/span> Layers Q注意,不是 Layer Q,q要求每一个地囄代码都承自 Fusion.Layers 。比如, MapGuide ?/span> Layers 的名U就叫做 Fusion.Layers.MapGuide ?/span>
下表ȝ?/span> Fusion ?/span> OpenLayers 之间q种概念映射关系
Fusion 概念 |
Fusion 代码命名 |
OpenLayers 概念 |
OpenLayers 代码命名 |
地图 |
Fusion.Layers |
囑ֱ |
OpenLayers.Layer |
地图l?/span> |
|
无对应概?/span> |
|
地图 Widget |
Fusion.Widget.Map |
地图 |
OpenLayers.Map |
Fusion ?/span> OpenLayers 之间的概忉|关p?/span>
在阅?/span> Fusion ?/span> OpenLayers 的源代码或学习他们的 API Ӟ一定要注意两者术语上的区别?/span>
本节中,我们提到?/span>
Fusion
引入了地囄q一个概c这只是
Fusion
对于
OpenLayers
众多改动中的一个。下面我们来看看到底
Fusion
?/span>
OpenLayers
q做了哪些改动?/span>
Fusion 对于 OpenLayers 的改q?
Z便于 Fusion 的其他组件能够与地图q行交互Q?Fusion 对于 OpenLayers q行了较为全面的包装。一般来_如果您不是开?Fusion.Layers 的开发h员,除了使用一?OpenLayers 的一些工h的函数之外Q您甚至都不需要知?OpenLayers 的存在。但是,仅仅q行包装是不够的Q由?OpenLayers ?Fusion 定位的不同, Fusion 必须?OpenLayers q行扩展才能适应更ؓ复杂的模型?
1. Fusion 中添加了选择集的概念?OpenLayers 在同一张地N面显C多U不同数据源的方面确实做的很好,遗憾的是Q它~少选择集这一臛_重要的概c对?OpenLayers 来说Q选择集完全是可有可无的,因ؓ它的目的在于地囑ֱC出来,而且Q很多地图根本就没有选择集这L API Q比?Google 地图{等。但对于 Fusion 则不同,我们很难惌没有选择集,用户该如何利?MapGuide q行理。所以, Fusion 加入了选择集这个概念,q且要求实现 Layers 的地图(比如 MapGuide Q实现选择集功能。我们可以看刎ͼ Fusion.Widget.Map 中不但有诸如 get/set/clear/hasSelection q样控制和读取选择集的函数Q而且?MAP_SELECTION_ON ?MAP_SELECTION_OFF q两个事件来通知监听者地N择集的当前状况?
2. Fusion 开放了更多的事件。借助?Fusion 自己独立实现的事件机Ӟ Fusion 允许用户接收到更多种cȝ事gQ比?Session 是否已创建、地囑ֽ前忙与否、选择集状态变更、当前图层(q个?Fusion 中的囑ֱQ不?OpenLayers 的)变化{等?
3. Fusion 允许地图的实现类q回自n支持哪些比例,q就使得用户可以直观的知道自己当前羃攑֜囑ֈ什么程度?
4. 允许用户随时讄当前地图的背景图片和地图上的光标形状。这对于直观地反应地囑ֽ前状态是是否有用的?
5. 支持右键菜单。虽然在览器上实现右键菜单相对单一些,但是通过使用地图 Widget ?setContextMenu Q代码编写者就可以直接把已l准备好?div 作ؓ右键菜单Q再也不需要直接与底层鼠标事g打交道了?
地图的定?
前面在介l?Fusion ?OpenLayers 术语不同的时候,摘录了应用程序定义中对于地图部分的定义。通过解析q个定义Q?Fusion 了解了应该如何加载该地图。下面,我们来看看q个定义中到底都定义了哪些东ѝ?
?Fusion 中,一个地囄用一?MapGroup q行标签定义Q?MapGroup 里面?Map 标签是对于一个地囄定义了?
1. Type: 该标{标CZ地图的类型。所?MapGuide 地图该标{值均?MapGuide 。当 Fusion d到该地图?Type Ӟ׃用对应的 “Fusion.Layers. 标签??来初始化该地图。比?MapGuide 地图׃?Fusion.Layer.MapGuide 来初始化?
2. SingleTile: 如果该项为真Q则表示该项不采用分块服务?
3. Extension: 该于扩展 Map 标签Q来为地囑ֈ始化提供更多的信息。各?Fusion.Layers 的实现类可以自行军_光要的内容Q以及如何解释这些内宏V对?MapGuide 而言Q有以下常见的扩展:
a) ResourceId: MapDefinition 的资?Id Q通过?Id Q?Fusion 可以知道加蝲哪一个地囑֮义?
b) SelectionAsOverLay: 如果该项?true Q那么将会?GETDYNAMICOVERLAY 来获取地图,否则采用 GETMAPIMAGE 来获取地图。前者是新版本才支持的,可以把选择集和地图本nl制成两张地图。如果您使用?MapGuide 版本比较旧,您可以把该项讄成ؓ false
c) SelectionColor: 该项表示用什么颜色来昄选中的要素?
现在成熟的地囑^台均不同E度上支持瓦片生成方式,而且每个WebGIS产品均有各自不同的瓦?Tile)l织方式。MapGuide OS/E 的和Bing Map、Google Map、TMS的组l方式有很大不同Q如果可以知道存储方式就可以自己实现MapGuide ProviderQ部|地图时则不需要安装MapGuide OS/E。现分析下以供有~h使用?/p>
public override Uri GetUri(int x, int y, int zoomLevel)
{//适用于MS Silverlight mapControlQxy列号QzoomLevel为当前地图比例?br /> string tileRowGroup = “?
string tileColGroup = “?
if (x >= 0 && y >= 0 )
{
tileRowGroup += (Math.Floor(x/tileRowsPerFolder) * tileRowsPerFolder).ToString();//tileRowsPerFolder=30
tileColGroup += (Math.Floor(y / tileColumnsPerFolder) * tileColumnsPerFolder).ToString();
string tilePath = ?S?+ Math.Floor(zoomLevel)
+ ??+ basemaplayergroupname
+ ?R?+ tileRowGroup
+ ?C?+ tileColGroup
+ ??+ (x % tileRowsPerFolder)
+ “_?+ (y % tileColumnsPerFolder)
+??+ this.format;//png
return new Uri(this.url + tilePath);
}
return null;
}