网页怎么设置交互式地图
本文将向您展示为主的网站设置交互式地图有多种容易,包括在您的网站图和后端业主逻辑之间的更多层交互。
当您到达在网上上游地图的感觉很好时好,您总可以是可以什么以及期从api获得什么。同样,人才可以需要地图的后端逻辑。让我们看一般来的实现实现起伏起伏。
创建gis应用程序时的常见问题
选择选择种表示层:javascript,flash,小程序,ActiveX
地图赋数的含量
表示层和后端逻辑之间的通信
如何如何使其可
推介会
当然,您希望以出色的/卓越的/优异的/杰出的方案。使用applet,flash或iftivex等丰富的ui客户端将为之您提供需的几乎别没有东西,而且是一个旦这种方向的地图,人民将不喜欢不再这些组件安装到web的韦斯因器中。对于那些别无,在整机上安装户外组件或不宜安服装的人来说,这可怜会出来不错。我诚信javascript是一个j是个合理的选择。用来进入您的网站,他/她将立即看到地图,并且不需要其他操或安装。我是谷歌地图已经已经明了这种方法。
初始
当您要呈现javascript地图时,应该提供一流初始化幂来自来译地图的基本外观。一行方法是没有一般豆,并在呈现页面时代获取值。是,在不锈钢中使用地图,则需要复制并粘贴一流的javascript,并为新页面一豆。这种方法不适合使用的是使用内部使用组件。
我们需要使用作一尾图模板,并在使用内部的不足页面中重复使使用该模板。地图模板应位于网站和javascript之间。使用JavaScript组件的模板技术有用诸如ApacheVelocity之击。
沟通
JavaScript有一个个:ajax。
速度与可以
地图由基因和妇女层成。基本应该是静态的,将它们预先渲染并另存为一个图形是一个是一个好的。户外的层通常具有一般特点的信息(例如,学校边界)。
让我们开展地图。
使用森林制作地图
我选择openlayers框架是因为它它简单的易且基础MVC。Openlayers中的别无,是基于基因的,您需要做的,您您需要的。我♥openlayers的人们的人们的事情事情非常兴奋,因为它简单的。
首先,我们需要需要知道是GISWMS仪器。WMS(网络地图服务)是用途渲染地图的开放标准。大多数地图仪器支持WMS。WMS特价定义:
如何如何和地图作为图表(GetMap)。
如何如何和提供有关地图内容的信息,例如某个位置的值(getfeatureinfo)。
如何如何并의의의ithersi交付的地图类型(getcapability)的信息。
openlayers将wms形式为地图的主要图。您可在互联网上找到找到许多的WMS服务仪。这是来自openlayers示例目录的示例:
<HTML.XMLNS=.“http://98link.com”>
<头>
<样式类型=“文字/css”>#地图{宽度:100%;高级:100%;边框:1px纯黑色;}
</风格>
<脚本SRC=“OpenLayers.js”></脚本>
<脚本类型=“文字/javascript”>
<!-varlon=5;varlat=40;varzoom=5;var地图,层;
函数init(){地图=新的OpenLayers.map('地图');tallay=newopenlayers.layer.wms.untiled(“OpenLayersWMS”,“http://98link.com",{layers:a'basic'});map.addlayer(图层);
map.setCenter(新OpenLayers.lonlat(Lon,Lat),缩放);}
//->
</脚本>
</头>
<身体onload=“在里面()”>
<pID=“地图”></p.>
</身体>
</html.>
由于仅具有功能,并且映射逻辑未装配在类中,因此很难重用此脚本。是的,由于wms会根据请求行行地图渲染,因此它可会很,尤其因此它可以很,尤其。户外,您需要有一个WMS器具。
避免使用wms服务毒器的一道是没有一组预渲染的地图图片,称为图片。这些图片可以为一件儿更多层渲染,它们它们是使用标准格式(如gif,png或jpeg)的图表。由于地图渲染中不出仪器API,因此您可以从地图中获得出色的/卓越的/优异的/杰出的性能。
我已经使用ArcGIS缓存为基因设备了一件图表。磁盘空间现处于很便宜,您可以以不成文的缩放级别大厦地图,以加入地图的速度。
这是基本地图的代码:
<HTML.XMLNS=.“http://www.98link.com”>
<头>
<styletype=“text/css”>
</style>
<脚本src=“OpenLayers.js”></脚本>
<脚本SRC=“ags.js”></脚本>
<脚本类型=“文本/javascript”>
<!-//创建一击设备出来重用mygisrender=OpenLayers.Class.Create();mygisrender.prototype={LON:-107.0612,经度:38.9435,缩放:0,映射:null,BaseLayer:null,
函数(){},
函数(){this.map=this.createmap();this.baselayer=this.CreateBaseLayer();this.map.addlayer(this.baselayer);this.addcontrols();},
createmap:function(){返回新的openlayers.map('地图',{maxextent:新的openlayers.bounds(-205.075,10.14911608,-49.1132,88.112),MaxResolution:0.15228550153247,分享:新数组(0.15228550153247,7.61427507662349E-02,3.80713753831174E-02,1.90356876915587E-02,
 9.51784384577936E-03),tilesize:新的openlayers.size(256,256),Tileorigin:新的OpenLayers.lonlat(-400,400),单位:“度”,控制控制:[]});},
createBaseLayer:函数(){返回新的openlayers.Layer.ags(“AGS”,“http://arcgisserver/ArcGiScache/Phis/Plyers”,{图片名称:“_Alllayers”,类型:“PNG”,Tileorigin:新的openlayers.lonlat(-400,400)});},
addControls:function(){this.map.addcontrol(newOpenLayers.Control.PanzoomBar());this.map.addcontrol(newOpenLayers.Control.Navigation());this.map.addcontrol(newopenlayers.controloll.mouseposition());this.map.setCenter(新的openlayers.lonlat(this.lon,this.lat),this.zoom);},
class_name:“mygisrender”}
//全局全局化函数init(){varmymap=newmygisrender();mymap.init();}//->
</脚本>
</头>
<身体onload=“在里面()”>显示显示使用ArcGISServer9.2的MapCache的openLayers的示例
<pID=“地图”风格=“宽度:600px;高级:500px;边框:1px实心黑色;”></p>
</body>
</html>
示例:http://98link.com/maps/arcGis.html
如您所见,我这里有一个控制地图行为的类。使用类而不是函数集将使我们能够重用它,尤其是当我们需要更改其行为时。例如:
MyGisRender1=OpenLayers.Class.create();mygisrender1。原型=OpenLayers.Class.inherit(Mygisrender,{
addControls:function(){
//调调使用继承的方法mygisrender。原型.addcontrols.apply(这);
//
为之做我们的工作.map.addcontrol(新的OpenLayers.Controll.Mousetoolbar());
},
 CLASS_NAME:“MyGisRender1”
});
示例:http://98link.com/maps/arcGis1.html
在那里,我们向地图添加了一些新控件
这些示例的最大缺点是诸如缩放,范围等硬编码参数。正如我之前提到的,我们可以使用暴露给页面的Javabean并从中获取值。如果地图存在于不同的Web页面中,则可以使用Spring框架将适当的bean发送到那里。但是,如果在设置bean时需要一些简单的逻辑怎么办?例如,我们需要在地图上添加一些点:
points.push(新OpenLayers.Geometry.Point(-72那42)));points.push(新OpenLayers.geometry.Point(-71那42)));points.push(新OpenLayers.geometry.Point(-73那42)));points.push(新OpenLayers.geometry.Point(-70那42)));points.push(新OpenLayers.geometry.Point(-71那41)));
我们需要用JSP标签或apache速度之类的模板方法。速度更好,是没有内容都都都在同中,而jsp标记将在jsp页面中。我们来到一下:
#foreach($p在$shape.points中间)points.push(新的openlayers.geometry.point($p.lat,$p.lon));#结尾
这是地图速度模板的示例:
http://98link.com/maps/mapvector.vm.
额外的层
该地图可能包含其他图库。我们为此有ogswms规范,如果您需要诸如卫星图画之迹,则可以很容易将插入插入。但正正确我之外所所,大多数互联网wms服务都很慢。openlayers支持wms,但仅在基础图片的模式下。通讯,从wms服务同时请求大厦20-40个磁贴,这会导致性能问题。在里里,我加入了一代新的openlayerswms图片类,它一次只包含一张图片:
createmap:函数(){
返回新OpenLayers.map('地图'那{maxextent:新OpenLayers.Bounds(-205.075那10.14911608--49.1132那88.112),MaxResolution:0.15228550153247那单一:“度”,控制项:[]});
},
createBaseLayer:function(){
返回新的CRISatalliteImage(“si1”,
“http://terraserver-usa.com/ogcmap6.ashx?version=1.1.1&request=GetMap&Layers=DOQ&Styles=&SRS=EPSG:4326&format=image/jpeg&Exceptions=se_xml“);
}那
示例:http.://98link.com/maps/arcgis2.html.
该该具备可访问仪器的URL。根据用词交互,可以更改url,以便根据wms请求规范获得所需的图象。用途可爱使用URL并将其指向任何地,以便拥有一个自定义层。
地图特价选择
可通过使用openlayers矢载性图象基地或通讯创建其他层来到地图上的某些要素。例如:
http://98link.com/maps/selection.html.
在此示例中,我们继承了基层地图以重用出基本属性,然后定义一饰为[satesselected]的新事件。在方法AddControls中,我们创建了一卷新的量级(该该将允许我们管理矩形,圆形和多重之象的估计,然后订阅事件鼠标单位[点击]。在地图上下鼠标鼠标,将将使用硒酸酯方法。在这这方法中,我的用途统计_env。该函数有带有状态及其基本信息的矩形矩形。在状态中选择一个时,将创建一个新的,并将其添加到地图中。同样,我们批发事件[sateselected],然后用药可在某某地注册注册并进行管理。
首先让我们看一下销量选择:
mygisrenderselection.=OpenLayers.Class.Create();mygisrenderselection。原型=OpenLayers.Class.inherit(Mygisrender,{
//定义向量vlayer:null,
//增加事件类型event_types:['Satesselected'],事件:null,
 //构造数初始化:函数(){
 //使用MygisRender构造数mygisrender。原型.Initialize.apply(这);
 //初始化我们的事件
 这.Events.=新的OpenLayers.Events(这那这.p,这.event_types);
 }那
addControls:function(){
//调调使用继承的方法mygisrender。原型.addcontrols.apply(这);
//
为之做我们的工作.map.addcontrol(新的OpenLayers.Controll.Mousetoolbar());
 //创建销量层,并将其添加到地图
 此.vlayer.=新OpenLayers.Layer.Vector(“可编辑”);
 这个.map.addLayer(这个.vlayer);
this.map.events.register(“click”,this,this.selectState);
},
selectState:function(evt){
varlatlon=this.map.getLonLatFromViewPortPx(evt.xy);
为(VAR我=0;我<。STATES_ENV长度;我++){
如果(STATES_ENV[I].extent.containsLonLat(latlon,真)){
 varenv=STATES_ENV[i].extent;
 //创建几何形状(矩形)
 VAR点=[
 新OpenLayers.Geometry.Point(env.left,ENV。顶部),
 新OpenLayers.Geometry.Point(env.left,env.bottom),
 新OpenLayers.Geometry.Point(env.right,env.bottom),
 新OpenLayers.Geometry.Point(env.right,信封顶部),
 新OpenLayers.Geometry.Point(env.left,信封顶部)
 ];
 //将其添加到矢量层
 varring=newOpenLayers.Geometry.LinearRing(points);
 这个.vlayer.addfeatures(新的OpenLayers.Feature.Vector(新的OpenLayers.geometry.Polygon([戒指])))))));
 //批发
 此事件..events.triggerevent.(“sateselected”,sourse_env[i]);
休息;
}
}
},
 CLASS_NAME:“MyGisRenderSelection”
});
//全局初始化
函数init(){
varmyMap=newMyGisRenderSelection();
myMap.init();
mymap.events.register(“sateselected”那这,功能(选择){
警报('您已选择'+选择.State);
});
}
我拍了用来一流批量来到定义别状态,但在于在实际应用中,它应该是一个ajax调用。此演示中间用途了矩形,但应使用多边形好地与与形状保持一道。
OpenLayers可以像Google一样在地图上添加标记并在消息窗口中显示一些HTML。您可以在示例目录中找到示例。
矢量选择看起来很快,但是如果要选择复杂的形状,则选择速度会很慢,因为Web浏览器必须显示很多点。在这种情况下,我建议使用服务器端图像渲染并将所选内容显示为附加图像层。
图像选择层必须具有透明背景。为此,我实现了类CRIOneTileLayer,您可以在war文件中看到它。它具有URL作为输入,应在其中编码所选功能,并添加BOX参数以获得适当的范围,然后将请求发送到服务器。在这种情况下,服务器端实现应由开发人员完成。
矢量地图绘制并将形状发送回服务器
OpenLayers框架具有允许您绘制不同种类的矢量形状的控件。例如:
http://98link.com/maps/Vector.html
在这里,我们像前面的示例一样创建矢量层,并添加了新控件EditingToolbar。这个控件允许我们在地图上绘制形状,但是我们有一个提交按钮,我们想在服务器端查看数据。我编写了函数mapFormPrepare,它允许您修改HTML表单的DOM模型。基本上,它添加了一些参数,并且这些参数将在提交后发送到服务器。
MyGisRenderVector=OpenLayers.Class.create();
MyGisRenderVector。prototype=
OpenLayers.Class.inherit(MyGisRender,{
//定义向量层
vlayer:null,
addControls:function(){
//调用继承的方法
MyGisRender。原型.addControls.apply(this);
//
为此做我们的工作。map.addControl(newOpenLayers.Control.MouseToolbar());
 //加载向量层
 这.vlayer=新OpenLayers.Layer.Vector(“可编辑”);
这个.map.addLayer(这个.vlayer);
//在
此.map.addControl(newOpenLayers.Control.EditingToolbar(this.vlayer))中添加编辑工具栏;
},
 mapFormPrepare:function(mapFormName){
 varfeatures=this.vlayer.features;
 varform=document。表格[mapFormName];
 vari=0;
 
 如果(!特征=空&&。特征长度>0){
 对于(I=0;我<。特征长度;我++){
 VAR几何=特征[I].geometry;
 varstr=null;
 如果(geometry.CLASS_NAME==“OpenLayers.Geometry.Point”){
 str=“POINT:”+geometry.x+“,”+geometry.y
 }
 如果(geometry.CLASS_NAME==“OpenLayers.Geometry.Circle”){
 str=“CIRCLE:”+geometry.x+“,”+geometry.y+“,”+geometry.radius;
 }
 if(geometry.CLASS_NAME==“OpenLayers.Geometry.Polygon”){
 str=“POLYGON:”+此.componentGeometry2String(geometry.components[0].components)
 }
 if(geometry。“OpenLayers.Geometry.LineString”){
 str=“LINE:”+此.componentGeometry2String(geometry.components)
 }
 if(str!=null){
 varinput=document.createElement(“input”);
 input.id=“MAP_FEATURE”+i;
 输入。名称=“MAP_FEATURE”+i;
 输入。值=str;
 输入。类型=“隐藏”;//字段的类型-可以是任何有效的输入类型,如文本,文件,复选框等
 形式.appendChild(输入);
 varlatlon =this.map.getCenter();
 varzoom =this.map.getZoom();
 varinputForm=document.createElement(“input”);
 inputForm.id=“MAP_FEATURE”+i;
 inputForm。名称=“MAP_FEATURE”+i;
 inputForm。value=“MAP:”+latlon.lat+“,”+latlon.lon+“,”+zoom;
 inputForm。类型 =“隐藏”;
 形式.appendChild(inputForm);
 inputForm=document.createElement(“input”);
 inputForm.id =“MAP_FEATURE_POST”;
 inputForm。名称 =“MAP_FEATURE_POST”;
 inputForm。值 =“真”;
 inputForm。类型 =“隐藏”;
 形式.appendChild(inputForm);
 },
 CLASS_NAME:“MyGisRenderVector”
});
您可以从请求中读取它们,例如:
公共类MapDataManager{
 私有静态字符串MAP_FEATURE=“MAP_FEATURE”;
 公共静态列表<GeometryObject>parseFromRequest(的javax。的servlet。ServletRequest中请求){
 intfeatureId=0;
 字符串值=null;
 List<GeometryObject>list=新的ArrayList<GeometryObject>();
 而((值=请求。的getParameter(MAP_FEATURE+FEATUREID))!=空){
 GeometryObjectOBJ=ParsingFactory。createGeometryObject(值);
 if(obj!=null){
 列表。加(obj);
 }
 featureId++; 
 }
 退货清单;
 }
}
您将在war文件中找到完整的课程。
MapsforEnterprise应用程序
现在该看看如何将OpenLayers插入Web应用程序中了。
首先,我们需要定义所有配置参数,例如最大和默认范围,缩放级别以及切片或WMS服务器位置。让我们使用Spring框架,并定义USA地图的范围和一些用于图块处理的参数:
<beanid=“extent”class=“org.maps.Extent”>
 <属性名称=“maxY”值=“88.112”/>
 <propertyname=“minY”value=“10.14911608”/>
 <属性名称=“maxX”值=“-49.1132”/>
 <属性名称=“minX”值=“-205.075”/>
 </bean>
 <beanid=“defpoint”class=“org.maps.Point”>
 <propertyname=“lat”value=“38.9435”/>
 <propertyname=“lon”value=“-107.0612”/>
 </bean>
 <beanid=“origin”class=“org.maps.Point”>
 <propertyname=“lat”value=“400”/>
 <propertyname=“lon”value=“-400”/>
 </bean>
 <beanid=“tileSize”class=“org.maps.Size”>
 <属性名称=“w”值=“256”/>
 <属性名称=“h”值=“256”/>
 </bean>
 <beanid=“map”class=“org.maps.BaseMap”>
 <propertyname=“extent”ref=“extent”/>
 <属性名称=“defpoint”ref=“defpoint”/>
 <propertyname=“origin”ref=“origin”/>
 <propertyname=“tileSize”ref=“tileSize”/>
 <propertyname=“baseLayerName”value=“data”/>
 <propertyname=“baseLayerUrl”value=“maps”/>
 <属性名称=“maxResolution”值=“0.15228550153247”/>
 <propertyname=“resolutionList”>
 <列表>
 <value>0.15228550153247</value>
 <value>7.61427507662349E-02</value>
 <value>3.80713753831174E-02</value>
 <value>1.90356876915587E-02</value>
 <value>9.51784384577936E-03</value>
 </list>
 </property>
 </bean>
接下来,我们需要指定一个将渲染地图的Bean,并且需要提供速度配置:
 <beanid=“mapRender”class=“org.maps.MapRender”>
 <propertyname=“baseMap”ref=“map”/>
 <propertyname=“velocityEngine”ref=“velocityEngine”/>
 </bean>
 <beanid=“velocityEngine”class=“org.springframework.ui.velocity.VelocityEngineFactoryBean”>
 <propertyname=“resourceLoaderPath”>
 <值>/</值>
 </property>
 </bean>
最后,我们将使用以上所有内容:
 <beanid=“vectorMap”class=“org.maps.VectorMap”>
 <propertyname=“mapRender”ref=“mapRender”/>
 <propertyname=“mapTemplate”
 value=“/WEB-INF/map-templates/mapVector.vm”/>
 </bean>
基本配置参数(例如范围,缩放或地图)只是POJOBean,带有用于属性的获取器和设置器。BeanmapRender具有两个POJO属性:velocityEngine和baseMap。最重要的是,它通过调用setGisMapping方法来渲染地图脚本并将springbean绑定到speedbean:
公共字符串getRenderedMap(HttpServletservlet,字符串templateName,
 MapRenderExtramapRenderExtra)引发异常{
 字符串响应=“”;
 VelocityContextvc=新的VelocityContext();
 模板t=getVelocityEngine()。getTemplate(templateName);
 StringWritersw=新的StringWriter();
 setGisMapping(vc,servlet);
 如果(mapRenderExtra!=null){
 mapRenderExtra。setExtraVelocityParameters(vc);
 }
 Ť。合并(vc,sw);
 响应=sw。functiontoString(){[nativecode]}();
 回报响应;
 }
 受保护的voidsetGisMapping(VelocityContextvc,HttpServletservlet){
 vc。放(“CTXPATH”,小服务程序。的getServletContext()。getContextPath());
 vc。put(“map”,getBaseMap());
 }
如您所见,它将baseMapbean和ctxPath绑定到速度上下文,以便将它们用作速度模板中的变量。请注意,它具有参数mapRenderExtra。这只是一个接口,允许类调用此方法来提供其他实现,您可以在其中指定额外的速度绑定。这将使我们能够使用力度模板作为基础模板,然后根据需要添加任意数量的模板。该接口只有一种方法:
公共接口MapRenderExtra{
 无效setExtraVelocityParameters(VelocityContextvc);
}
这是我们地图的基础。现在我们将创建一个控制器:
公共类VectorMapController实现MapRenderExtra{
 私有HttpServletservlet;
 列出<GeometryObject>形状;
 私有静态字符串MAP_FEATURE=“MAP_FEATURE”;
 公共字符串getMapScript(的HttpServlet的servlet){
 此。servlet=servlet;
 ApplicationContextspringContext=(ApplicationContext)servlet
 。getServletContext()
 。的getAttribute(
 WebApplicationContext中。ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE);
 VectorMap豆=(VectorMap)springContext。getBean(“vectorMap”);
 字符串templateName=bean。getMapTemplate();
 字符串scriptString=null;
 尝试{
 scriptString=bean。getMapRender()。getRenderedMap(servlet,
 templateName,this);
 }catch(异常e){
 //TODO自动生成的catch块
 e。printStackTrace();
 }
 返回scriptString;
 }
 公共空隙parseFromRequest(的javax。的servlet。ServletRequest中请求){
 intfeatureId=0;
 字符串值=null;
 List<GeometryObject>list=新的ArrayList<GeometryObject>();
 而((值=请求。的getParameter(MAP_FEATURE+FEATUREID))!=空){
 GeometryObjectOBJ=ParsingFactory。createGeometryObject(值);
 if(obj!=null){
 列表。加(obj);
 }
 featureId++;
 }
 形状=列表;
 }
 @覆盖
 publicvoidsetExtraVelocityParameters(VelocityContextvc){
 vc。放(“vectorShapeData”,形状);
 }
}
请注意,我们实现了MapRenderExtra接口,因为我们将对地图进行一些自定义:
 公共无效的setExtraVelocityParameters(VelocityContextvc){
 vc。放(“vectorShapeData”,形状);
 }
在这里,我们通知MapRender类应该访问先前的方法:
VectorMap豆=(VectorMap)springContext。getBean(“vectorMap”);
 字符串templateName=bean。getMapTemplate();
 字符串scriptString=null;
 scriptString=bean。getMapRender()。getRenderedMap(servlet,
 templateName,this);
this由于我们已在此控制器中实现MapRenderExtra,因此我们正在发送“”。由于我们试图将Geometry对象发送到地图,因此需要添加一个额外的速度上下文变量。通过调用parseFromRequest方法从HTTP请求中还原此几何对象。