当前位置:首页> 科技评论 > 网页怎么设置交互式地图

网页怎么设置交互式地图

2021-04-17 22:12:30 来源: 网络   编辑: 佚名   浏览(731)人   
0

网页怎么设置交互式地图

 本文将向您展示为主的网站设置交互式地图有多种容易,包括在您的网站图和后端业主逻辑之间的更多层交互。  
当您到达在网上上游地图的感觉很好时好,您总可以是可以什么以及期从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请求中还原此几何对象。

【版权与免责声明】如发现内容存在版权问题,烦请提供相关信息发邮件至 1439028666@qq.com ,我们将及时沟通进行删除处理。 本站内容除了 98link( http://www.98link.com/ )特别标记的原创外,其它均为网友转载内容,涉及言论、版权与本站无关。