基于openlayers的最短路径规划

2023-10-28

之前的文章讲到了如何构建空间数据库,矢量数据如何入库,如何构建拓扑网络,如何自定义查询函数,如何构建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 οnlοad='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 οnlοad='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);
  }
 }
 
  


本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

随机推荐

  • Jmeter---BeanShell解析JSON格式的响应数据

    首先 分析一下接口的响应数据 了解接口返回数据的结构类型 如下数据所示 我们想要获取的是normalList里面的status值 但是响应结果是列表 可能是会存在多个记录 所以在实现过程中我们通过遍历normalList中的所有数据 或者是
  • JAVA 线上故障排查完整套路,从 CPU、磁盘、内存、网络、GC 一条龙!

    原文链接 https mp weixin qq com s MZOcDjKm4oy9mGEG3R QYA 作者 fredal https fredal xin java error check CPU 磁盘 内存 GC问题 网络 线上故障主
  • 获取网卡名称存入数组 对网卡执行相关操作

    背景 由于服务器网卡获取ip异常 需要对做bond网卡进行相关网络操作 bond网卡操作 正常执行nmlic命令 环境问题对要执行的网卡本身只有四行命令 为了防止出现多业务网卡和vlan主网卡的情况 这里选择自动获取bond网卡执行相关操作
  • 修改@vue/cli搭建的项目中默认icon图标

    今天使用 vue cli搭建了一个项目 然后想修改一下网页的icon图标 但是在public文件夹下直接替换图标 不会改变网页的icon图标 文件夹目录如下 用项目logo的icon文件替换原始的icon 重启项目还是vue默认的icon
  • 「面试题」20+Vue面试题整理

    微信搜索 前端食堂 你的前端食堂 记得按时吃饭 本文已收录在前端食堂 Github https github com Geekhyt front end canteen 感谢Star 从镜片的厚度和黄黑相见的格子衬衫我察觉到 面前坐着的这位
  • JS des加密解密

    引用库 des解密 function decryptByDES ciphertext var keyHex CryptoJS enc Utf8 parse 秘钥 var decrypted CryptoJS DES decrypt ciph
  • 《计算机网络基础与应用》笔记

    文章目录 前言 1 1认识网络 1 2 认识网络标准及通信协议 1 3认识数据通信技术 1 4选择网络的拓扑结构 2 1考察网络传输介质 2 2考察网络设备 2 3实现网络结构化布线系统 2 4配置网络设置 2 5实现局域网的硬件连接 3
  • 深度学习-图像识别FPN(Feature Pyramid Networks)

    文章目录 一 FPN 二 FPN的整体架构 FPN应用于RPN层 四 FPN总结 一 FPN 卷积网络的一个重要特征 深层网络容易响应语义特征 浅层网络容易响应图像特征 但是到了物体检测领域 这个特征便成了一个重要的问题 高层网络虽然能响应
  • InitializingBean讲解

    InitializingBean讲解 Spring中有两种类型的Bean 一种是普通Bean 另一种是工厂Bean 即FactoryBean 工厂Bean跟普通Bean不同 其返回的对象不是指定类的一个实例 其返回的是该工厂Bean的get
  • cx_Oracle使用方法

    正确安装好cx oracle之后 要使用它来连接到oracle数据库进行操作 具体应该分3步走 第一步 导入cx Oracle 建立连接 gt gt gt import cx Oracle 导入模块 gt gt gt db cx Oracl
  • SpringBoot入门 快速创建并部署web后端

    这两天学习了springboot些框架开发 发现用它开发真的是简单便捷 就像是它的设计初衷所描述的那样 它虽然没有提出任何新的技术 但却将之前的spring技术集成了 他让spring变得更加好用 于是将最近的学习内容总结一下 分享给大家
  • 基于MATLAB的线激光三维彩色扫描仪

    暑期做的一个项目 开始并不是很熟悉 在网上查找的资料也不是很具体 但是自习学习了理论知识之后还是比较容易的做出来这个项目 现在开源整个项目 由于篇幅有限 本文适合稍微有点点基础的朋友 源码见底部 先显示下最后结果 一 硬件设计 主要有步进电
  • struts2与hibernate整合遇到的问题

    1 问题描述 今天练习struts2和hibernate整合 结果各层都写好了浏览器还出现了service实例空指针的错误 控制台只是提示没有找到什么值栈啊什么的 解决过程 查看各层代码 配置文件是否写的有问题 都没问题 后来就找是不是包的
  • 如何登录GItHub

    1 找到hosts 2 用管理员权限运行 3 打开终端 4 执行cmd 5 再执行notepad hosts 6 会自动弹出hosts 7 查找3个需要添加在hosts最后的内容 1 github com IP地址查询 https gith
  • Pandas常用函数操作示例

    一 概述 本文主要记录一些常用的pandas 操作示例 可收藏用作日常编码中的速查手册 用到的示例可以在下面的索引分类中找到 二 目录 文章目录 一 概述 二 目录 三 示例 1 pandas 创建 Series 通过 list 创建 se
  • CentOS7 学习 10 常用指令 7 压缩、解压缩

    索引 gzip 压缩 gunzip 解压 zip 压缩 unzip 解压 在项目打包发布中常用 这个和windows一样 tar zcvf xx tar gz 要压缩的文件file tar zxvf xx tar gz C 解压到的路径di
  • ELK日志收集系统

    Kibana 数据分析工具 提供数据的聚合 分析功能 数据的可视化 用图表展现数据 分析图标可进行分享 或在web应用中引用图表 Kibana汉化 docker cp kibana usr share kibana config kiban
  • 一篇“从入门到上手”的PCB设计教程

    一篇 从入门到上手 的PCB设计教程 这是一篇面向神马都不懂的小白玩家的PCB设计教程 希望能帮助大家快速上手PCB的设计 1 预备知识 1 1 常用工具 1 做图工具 Altium Designer 2 PCB板加工 嘉立创 3 元件封装
  • react的onClick自动触发等相关问题

    react分页组件遇到的问题 private getFirst const pageNo this state if pageNo gt 3 return span 首页 span else return private changePag
  • 基于openlayers的最短路径规划

    之前的文章讲到了如何构建空间数据库 矢量数据如何入库 如何构建拓扑网络 如何自定义查询函数 如何构建wms服务 本文讲解如何基于openlayers晚上最短路径规划功能 一 基于openlayers3 1 构建网页 这里只是一个简单的网页