网页怎么设置交互式地图
网页怎么设置交互式地图
本文将向您展示为主的网站设置交互式地图有多种容易,包括在您的网站图和后端业主逻辑之间的更多层交互。
当您到达在网上上游地图的感觉很好时好,您总可以是可以什么以及期从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=“在里面()”>
<divID=“地图”></div.>
</身体>
</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的示例
<divID=“地图”风格=“宽度:600px;高级:500px;边框:1px实心黑色;”></div>
</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(这那这.div,这.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请求中还原此几何对象。