基于openlayers的最短路径规划

之前的文章讲到了如何构建空间数据库,矢量数据如何入库,如何构建拓扑网络,如何自定义查询函数,如何构建wms服务,本文讲解如何基于openlayers晚上最短路径规划功能。

一、基于openlayers3

1.构建网页,这里只是一个简单的网页

<!DOCTYPE html>
<html lang='en'>
<head>
	<meta charset='utf-8'/>
	<title>indoornavigation</title>
	<script type='text/javascript' src='ol-debug.js'></script>
	<script type='text/javascript' src='closure/goog/base.js'></script>
	<script type = 'text/javascript' src='mapinit.js'></script>
	<script type='text/javascript' src='mapclick.js'></script>

</head>

<body onload='init();'>
	<div style="position: absolute; top: 50px; left: 80px; width: 300px; height: 100px;">
		<button id="clear">路径清除</button>
		<div id='map_element' style='width:1800px;height:800px;'></div>

	</div>
</body>
</html>

2.初始化函数

        var map;
		var startPoint;
		var destPoint;
		var vectorLayer;
		function init()
		{
			//定义地图边界
			var extent= [12960129.562300, 4788641.902700, 12986389.084400, 4817845.581900];
			var layers=[
                new ol.layer.Tile({
                    source:new ol.source.TileWMS({
                        url:'http://10.16.35.14:8080/geoserver/tingchechang/wms',
                        params:{
                            'LAYERS':'tingchechang:minidata',
                            'TILED':true
                        },
                        serverType:'geoserver'
                    })
                })
            ];  

			map=new ol.Map({  

                layers:layers,
                target:'map_element',
                view:new ol.View({
                    projection:new ol.proj.Projection({
                        code:'EPSG:900913',
                        units:ol.proj.Units.METERS  

                    }),
                     center:[12971103,4809571],
                    extent:extent,
                    zoom:12  

                }) ,
				controls: ol.control.defaults({
				attributionOptions: {
					collapsible: false
					}
				})
            });
			// The "start" and "destination" features.
        startPoint = new ol.Feature();
        destPoint = new ol.Feature();

		// The vector layer used to display the "start" and "destination" features.
		vectorLayer = new ol.layer.Vector({
			source: new ol.source.Vector({
			features: [startPoint, destPoint]
			}),
			style:new ol.style.Style({
				image:new ol.style.Icon(({
					size:[24,36],
					anchor:[0.5,0.75],
					anchorXUnits:'fraction',
					anchorYUnits:'fraction',
					src:'marker.png'
				}))
			})
		});
		map.addLayer(vectorLayer);

		//添加比例尺,单位m
            var scaleLineControl=new ol.control.ScaleLine();
            scaleLineControl.setUnits(ol.control.ScaleLineUnits.METRIC);
            map.addControl(scaleLineControl);
            //缩放工具条
            var zoomSilder=new ol.control.ZoomSlider();
            map.addControl(zoomSilder);  

		map.on('click', clickMap);

		//清空路径规划结果
		var clearButton = document.getElementById('clear');
		clearButton.addEventListener('click', function(event) {
		// Reset the "start" and "destination" features.
		startPoint.setGeometry(null);
		destPoint.setGeometry(null);
		// Remove the result layer.
		map.removeLayer(result);
});
		}	

3.单击添加起点终点marker及路径规划函数

var params = {
  LAYERS: 'tingchechang:tingchechang',
  FORMAT: 'image/png'
};
var result;
function clickMap(event)
{
	if (startPoint.getGeometry() == null) {
    // First click.
    startPoint.setGeometry(new ol.geom.Point(event.coordinate));console.info(event.coordinate);
  } else if (destPoint.getGeometry() == null) {
    // Second click.
    destPoint.setGeometry(new ol.geom.Point(event.coordinate));
    // Transform the coordinates from the map projection (EPSG:3857)
    // to the server projection (EPSG:4326).
    var startCoord = (startPoint.getGeometry().getCoordinates());
    var destCoord = (destPoint.getGeometry().getCoordinates());
    var viewparams = [
      'x1:' + startCoord[0], 'y1:' + startCoord[1],
      'x2:' + destCoord[0], 'y2:' + destCoord[1]
	  //'x1:' + 12952117.2529, 'y1:' + 4836395.5717,
      //'x2:' + 12945377.2585, 'y2:' + 4827305.7549
    ];
    params.viewparams = viewparams.join(';');
    result = new ol.layer.Image({
      source: new ol.source.ImageWMS({
        url:'http://10.16.35.14:8080/geoserver/tingchechang/wms',
        params: params
      })
    });
	console.info(result);
    map.addLayer(result);
  }
}

二、基于openlayers2

1.构建网页

<!DOCTYPE html>
<html lang='en' >

<head>
	<meta charset='utf-8'/>
	<title>Indoor Navigation</title>
	<script type='text/javascript' src='OpenLayers.js'></script>
	<script type = 'text/javascript' src='mapinit.js'></script>
	<script type = 'text/javascript' src='mapClick.js'></script>
</head>

<body onload='init();'>
	<div style="position: absolute; top: 50px; left: 80px; width: 300px; height: 100px;">
	<button id="clear">路径清除</button>
		<div id='map_element' style='width:1800px;height:800px;'></div>

	</div>
</body>
</html>

2.初始化函数、

var map;
var points,routes;
var startPoint;
var destPoint ;
var  map;
var markerLayer;
var icon;
function init() {
			//定义地图边界
            var bounds= new OpenLayers.Bounds(0.002256,-0.008496,0.008017,-0.000448);
            var options = {
                projection: "EPSG:4326",
                center: new OpenLayers.LonLat(0.005,-0.0002),
            };
            map = new OpenLayers.Map('map_element',options);
            var baseLayer = new OpenLayers.Layer.WMS("OpenLayers WMS",
                //geoserver所在服务器地址
                'http://10.16.35.14:8080/geoserver/navigation/wms',
                {
                    layers: 'navigation:road'
                },
				{
					minScale: 545000
				}
				);  

     map.addLayer(baseLayer);
	 //添加control空间
           // map.addControl(new OpenLayers.Control.LayerSwitcher());
            map.addControl(new OpenLayers.Control.MousePosition());
            map.addControl(new OpenLayers.Control.ScaleLine());
            map.addControl(new OpenLayers.Control.Scale);             

            map.zoomToExtent(bounds);
	 // The vector layer used to display the "start" and "destination" features.
		markerLayer = new OpenLayers.Layer.Markers("markers");

		map.addLayer(markerLayer);

		var size = new OpenLayers.Size(21,25);
		var offset = new OpenLayers.Pixel(-(size.w/2), -size.h);
		icon = new OpenLayers.Icon('marker.png',size,offset);

		//清空路径规划结果
		var clearButton = document.getElementById('clear');
		clearButton.addEventListener('click', function(event) {
		// Reset the "start" and "destination" features.
		startPointSet = false;
        endPointSet = false;
		// Remove the result layer.
		 markerLayer.removeMarker(startPoint);
		 markerLayer.removeMarker(destPoint);
		startPoint.destroy();
		destPoint.destroy();
		map.removeLayer(result);
		});

		map.events.register('click', map, onMapClick);

}

3.单击添加起点终点marker及路径规划函数

var startPointSet = false;
var endPointSet = false;
var startCoord;
var destCoord

var result;
function onMapClick(event)
{
     // 显示地图屏幕坐标
    if (!startPointSet) {
	var lonlat = map.getLonLatFromPixel(event.xy);
	startPoint = new OpenLayers.Marker(lonlat);
	markerLayer.addMarker(startPoint);
	startCoord = new OpenLayers.Geometry.Point(lonlat.lon,lonlat.lat);
	startPointSet = true;
  }
  else if (!endPointSet) {
    // Second click.
	var lonlat = map.getLonLatFromPixel(event.xy);
	destPoint = new OpenLayers.Marker(lonlat);
    markerLayer.addMarker(destPoint);
	destCoord = new OpenLayers.Geometry.Point(lonlat.lon,lonlat.lat);
	endPointSet = true;
    // Transform the coordinates from the map projection (EPSG:3857)
    // to the server projection (EPSG:4326).

    var viewparams = [
      'x1:' + startCoord.x, 'y1:' + startCoord.y,
      'x2:' + destCoord.x, 'y2:' + destCoord.y
	  // 'x1:' + 12952117.2529, 'y1:' + 4836395.5717,
     // 'x2:' + 12945377.2585, 'y2:' + 4827305.7549
    ];
    viewparams = viewparams.join(';');
    result = new OpenLayers.Layer.WMS("resLayer",
	'http://localhost:8080/geoserver/navigation/wms',
	{	FORMAT: 'image/png8',
	    transparent: true,
		LAYERS: 'navigation:resRoad',
		viewparams:viewparams
	},
	{isBaseLayer:false,
	opacity: 1,
	}

	);
    map.addLayer(result);
  }
 }
时间: 2024-10-30 10:46:00

基于openlayers的最短路径规划的相关文章

最短路径规划中创建基于geoserver的wms服务

上篇文章写了求任意两点间最短路径的sql函数,这篇文章讲一下如何把上面介绍的子功能整合到系统中去. 1.geoserver登录 首先单击geoserver安装路径下的start Geoserver 待geoserver启动后,在浏览器中输入,http://localhost:8080/geoserver/web/ 输入用户名密码登录geoserver 2.创建工作区 单击左侧工作区,如下图所示: 会进入新建工作区页面,单击"添加新的工作区",如下图所示 在弹出的工作区设置中输入新工作区

基于pgrouting的路径规划之一

最近接触pgrouting.把学习的结果记录下来. 利用pgrouting进行路径规划只能导入line数据,mutiline会出错.这一点在进行数据导入的时候需要注意. 一.创建数据库 有两种方法: 1.pgadmin可视化工具创建 直接把数据道路postgis模版数据库或以postgis模版数据库为模版创建数据库,这样创建的数据库直接支持空间查询和空间分析. 2.命令行创建数据库 创建数据库 createdb -U postgres routing 让数据库支持PostGIS和pgRoutin

基于OpenLayers的地图应用中图标汉化

    在OpenLayers中图标默认是英文的,但是作为中国人,且做出来的地图产品主要是面向中国人,英文的图标对我们来说自然是不可接受的,因此需要对其进行汉化.这个功能做起来也很简单.只需要添加如下几个语句即可: OpenLayers.INCHES_PER_UNIT["千米"]=OpenLayers.INCHES_PER_UNIT["km"]; OpenLayers.INCHES_PER_UNIT["米"]=OpenLayers.INCHES_

C#实现A*算法

在游戏开发中,AI的最基本问题之一就是寻路算法或称路径规划算法,在三 年前,我曾实现过 基于"图算法"的最短路径规划算法,然而在游 戏中,我们通常将地图抽象为有单元格构成的矩形,如: 这个微型地图 由3*3的单元格构成,当然,实际游戏中的地图通常比它大很多,这里只是给出 一个示例. 由于游戏地图通常由单元格构成,所以,基于"图算法 "的路径规划便不再那么适用,我们需要采用基于单元格的路径规划算法 .A*算法是如今游戏所采用的寻路算法中相当常用的一种算法,它可以保证在

A*算法的C#实现

     在游戏开发中,AI的最基本问题之一就是寻路算法或称路径规划算法,在三年前,我曾实现过基于"图算法"的最短路径规划算法,然而在游戏中,我们通常将地图抽象为有单元格构成的矩形,如:           (本图源于这里)      这个微型地图由3*3的单元格构成,当然,实际游戏中的地图通常比它大很多,这里只是给出一个示例.      由于游戏地图通常由单元格构成,所以,基于"图算法"的路径规划便不再那么适用,我们需要采用基于单元格的路径规划算法.A*算法是如今

基于pgrouting的任意两点间的最短路径查询函数二

    在前面的博文中写过一篇查询任意两点间最短路径的函数,当时对pgrouting不熟悉,功能很low.现在对该函数进行扩展,支持用户自己输入查询的数据库表,这一点看似简单,其实意义很大,在做室内导航的时候当用户所在的楼层变化的时候最短路径函数查询的数据表名称也会发生变化,不可能一栋大楼里的道路都是一样的吧,另外进行跨楼层的最短路径规划时,需要查询从A到楼梯口的最短路径和楼梯口到B的最短路径,这些都需要进行最短路径规划的时候能够自己选择数据表.     先解释一下最短路径规划的处理步骤,首先要

OpenLayers中基于Filter的WFS查询

打算实现的功能:基于OpenLayers实现对地图中城市POI模糊查询,并且能提供基于位置的查询(GIS中就是基于圆的查询,通俗的说就是当确定用户位置后,可以查询用户周边一定范围内的POI)和基于多边形的查询(用户自己画出多边形,实现在多边形范围内的POI查询),设定的界面如下图所示 1.      界面实现 页面的body主体实现如下:    <body onload="init()"> <div id="searchDiv" style=&qu

浅谈基于OpenSSL安全会话的实现

一.概述SSL SSL(Secure Socket Layer)安全套接字层,早期netscape公司想让工作在应用层中的各种协议在传输数据实现数据安全的目的,在应用层与tcp层之间引入的半层结构:SSL不仅是一种协议,也是一个库,能够实现让应用层的某种协议传输数据到tcp层之前调用SSL的功能:比如:应用层的HTTP.SMTP.FTP等协议到tcp层之前经过SSL的调用,在tcp层以HTTPS.SMTPS.FTPS形式传输数据:现在主流的版本是SSLv2.SSLv3. 二.了解OpenSSL

wfs方式获取最短路径

之前有几篇文章结束基于pgrouting的最短路径规范,获取最短路径用的是wms方式,这样的好处就是路径样式可以预先是geoserver中设置好,且路径渲染由geoserver在后台渲染.但是用户的需求是无穷无尽的,加入用户要求结果路径的样式需要动环效果该怎么做呢?          Wms方式获取的地图是后台渲染好的图片,如果要在前端做出动画效果,就需要用wfs的方式来请求最短路径了,这样做的思路是先获取到结果路径中的点坐标,拿到了点数据,剩下的动画啦.样式啦就可以随心所欲的制作了.