离线地图解决方案(十):最短路径规划

最短路径规划,采用开源数据库postgres、开源路径分析项目pgRouting进行。

pgRouting是一个基于PostgreSQL/PostGIS的项目,目的是提供路径分析的功能。

基于postgres和pgrouting实现路径规划功能,大致分为以下几个步骤:

1、矢量路网数据导入

2、为矢量路网数据添加字段并构建拓扑关系

3、编写两点间路径规划函数

4、对外发布两点间路径规划接口

5、前端展示路径规划结果

Postgres和pgRouting的安装以及矢量数据的导入,请参看本博客相关文章,在此不再重复。

矢量路网数据导入界面如下:

数据导入后,创建用于路径规划的字段,进行拓扑关系建立等,

测试路径规划是否正常,在sql查询窗口中输入路径规划sql,并获取路径规划结果

创建两点间路径规划查询函数:如下图所示

发布路径规划服务,很多项目采用Geoserver发布wfs服务的方式发布路径规划服务,这样又得部署一个geoserver服务器,离线地图解决方案前面的文章介绍了地物查询服务接口,路径规划服务接口也采用webapi方式发布,发布方式不再此详细介绍。

最短路径规划前端展示:

在地图上点击起点和终点,点击路径规划按钮获取最短路径信息并在地图上展示:

前端展示代码:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <meta name="viewport" content="initial-scale=1.0, user-scalable=no" />
    <title>最短路径规划demo</title>
    <link rel="stylesheet" href="plugin/ol3/css/ol.css" type="text/css" />
    <style>
                html, body, #div_gis {
                    width: 100%;
                    height: 100%;
                    overflow: hidden;
                    margin: 0;
                    font-family: "微软雅黑";
                }
    </style>
    <script src="js/jquery-1.11.2.min.js" type="text/javascript"></script>
    <script type="text/javascript" src="plugin/ol3/build/ol-debug.js"></script>
    <script type="text/javascript" src="js/Config.js"></script>
    <script type="text/javascript" src="js/PrivateFunction.js"></script>
</head>
 
<body>
    <label>起点经度:</label>
    <input type="text" id="txtBeginX" />
    <label>起点纬度:</label>
    <input type="text" id="txtBeginY" />
    <button id="getpoint1" onclick="clinkState = 1;" style="width:100px">拾取</button>
    <label>终点经度:</label>
    <input type="text" id="txtEndX" />
    <label>终点纬度:</label>
    <input type="text" id="txtEndY" />
    <button id="getpoint2" onclick="clinkState = 2;" style="width:100px">拾取</button>
    <button id="btndrawRect" onclick="getShortPath();" style="width:100px">路径规划</button>
    <div id="div_gis">
    </div>
</body>
 
</html>
<script type="text/javascript">
    loadTiandituOnline(‘div_gis‘, 1, 18, 8, 103.964571, 30.245677);
    CreateVectorLayer();
    var clinkState = 0;
 
    var vectorLayer = new ol.layer.Vector({
        source: new ol.source.Vector({
            features: []
        }),
        style: new ol.style.Style({
            fill: new ol.style.Fill({
                color: ‘rgba(255, 0, 0, 0.2)‘
            }),
            stroke: new ol.style.Stroke({
                color: ‘#ff0000‘,
                width: 5
            }),
            image: new ol.style.Circle({
                radius: 7,
                fill: new ol.style.Fill({
                    color: ‘#ffcc33‘
                })
            })
        })
    });
    OpenMap.addLayer(vectorLayer);
    
    OpenMap.on(‘click‘, function (evt) {
        var coordinate = evt.coordinate;
        var tempPoint = ol.proj.transform(coordinate, epsg, "EPSG:4326");
        if (clinkState == 1)
        {
            txtBeginX.value = tempPoint[0];
            txtBeginY.value = tempPoint[1];
            clinkState = 0;
            addBeginPoint();
        }
        if (clinkState == 2) {
            txtEndX.value = tempPoint[0];
            txtEndY.value = tempPoint[1];
            clinkState = 0;
            addEndPoint();
        }
 
    });
 
    function addBeginPoint()
    {
        var pointStyle = CreateImageStyle(‘images/start.png‘, ‘‘, ‘center‘, ‘middle‘, ‘Arial‘, ‘14‘, ‘normal‘, ‘blue‘, ‘#ffffff‘, ‘2‘, ‘0‘, ‘0‘, ‘0‘);
        AddImagePointToLayer(tempDrawSoure, ‘1‘, parseFloat(txtBeginX.value), parseFloat(txtBeginY.value), pointStyle);
    }
    function addEndPoint()
    {
        var pointStyle1 = CreateImageStyle(‘images/dest.png‘, ‘‘, ‘center‘, ‘middle‘, ‘Arial‘, ‘14‘, ‘normal‘, ‘blue‘, ‘#ffffff‘, ‘2‘, ‘0‘, ‘0‘, ‘0‘);
        AddImagePointToLayer(tempDrawSoure, ‘2‘, parseFloat(txtEndX.value), parseFloat(txtEndY.value), pointStyle1);
    }
 
    function getShortPath() {
        $.ajax({
            url: ‘http://localhost:8899/api/ReverseGEOApi/GetShortPath‘, //请求地址
            type: ‘Get‘,  //请求方式为post
            data: { ‘x1‘: txtBeginX.value, ‘y1‘: txtBeginY.value, ‘x2‘: txtEndX.value, ‘y2‘: txtEndY.value }, //传入参数
            dataType: ‘json‘, //返回数据格式
            //请求成功完成后要执行的方法
            success: showRegCallBack,
            error: function (err) {
                console.log(err);
                alert("执行失败");
            }
        });
    }
    function showRegCallBack(data) {
        //console.log(data.data);
        var features = new Array();
        var wktformat = new ol.format.WKT();
        var feature = wktformat.readFeature(data.data.Position);
        feature.getGeometry().transform(‘EPSG:4326‘, ‘EPSG:3857‘);
        tempDrawSoure.addFeature(feature);
    }
</script>

此文主要简略介绍了最短路径规划的方法、步骤,因为篇幅有限无法详细介绍整个实现过程,如果有兴趣的朋友可以通过qq联系8313632

时间: 2024-08-02 15:10:19

离线地图解决方案(十):最短路径规划的相关文章

百度谷歌离线地图解决方案(离线地图下载)

离线地图解决方案,除了买地图数据,使用专业的ArcGIS来做外,也可以使用GMap.Net来做. 关于GMap的开发教程,可以看我以前的文章:基于GMap.Net的地图解决方案 使用了GMap一年了,也有了一些积累,开发了一个可以下载百度.谷歌.高德.腾讯SOSO的地图下载器,各个地图加载显示如下: 百度普通地图: 百度混合地图: 谷歌普通地图: 谷歌混合地图: 从目前的情况来看,百度的普通的地图数据是更新最快的,但是有些小地方没有卫星地图,而谷歌几乎所有的地方都有卫星地图,但是谷歌中国的地图更

离线地图解决方案

目前GIS系统的开发,大多采用Arcgis,superMap等专业的gis开发平台.部分项目采用当前主流的在线地图提供的api进行开发.Arcgis.supermap等专业厂商提供的开发平台,开发周期长,并且购买这些开发平台,成本相对很高.采用在线地图api进行项目开发,在部分不能上外网的单位项目没办法进行部署和使用.并且采用在线地图api进行开发,需要申请地图调用的所谓key.部分接口和api每天有调用次数限制. 大部分的GIS项目,其实只需要比较简单的GIS功能,如地图基本显示,在显示的地图

离线地图解决方案(六):地图坐标“纠偏”

国内主流的在线地图服务和接口,应国家相关部门的要求,在发布地图是都进行了坐标偏移.现在web在线地图主要的坐标系有WGS84.GCJ-02.BD-09三种,WGS84原始坐标,未经过偏移,大部分GPS设备和矢量数据都采用这种坐标系.在线地图中google地图(国外)和天地图在线地图未经过偏移.GCJ-02坐标:高德.腾讯以及google国内在线地图采用这种坐标,BD-09是百度地图独有的坐标系,在GCJ-02基础上做了二次偏移. 在离线地图做加载瓦片数据后,如果要在这些"底图"上用坐标

离线地图解决方案(七):地图地物搜索

离线地图发布的"底图"都是各大地图厂商的"瓦片"或者利用geoserver生成的瓦片数据,这些瓦片数据都是一些jpg或者png格式的图片,很多GIS应用中,用户除地图显示,地图添加地物外,也需要用关键字搜索地物. 普遍的做法是,部署geoserver发布矢量数据,采用wfs服务查询到数据,并且在前端展示.或者调用在线地图的搜索接口返回数据在前端显示.这两种方式,就跟原本的离线地图和轻量级GIS应用背道而驰. 可以采取一种简便的做法,将地图矢量数据存入轻量级数据库Sq

离线地图解决方案(一):加载瓦片地图

当前主流的在线地图有百度.高德.天地图.腾讯地图.google地图等.针对局域网内网内脱离要脱离互联网访问的应用,需要下载这些主流厂商的瓦片数据.网上有很多地图下载器软件可以下载地图瓦片,可以通过各种方式获取到这些地图厂商的瓦片数据. 加载高德离线瓦片数据: 加载高德街道瓦片: 地图加载代码: <!DOCTYPE HTML PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtm

离线地图解决方案(八):地图地物查询

续上一篇,用户除有地物搜索(任意输入关键字,查询包含该关键字的地物)外,也有精确查询的需求,如查询指定经纬度周边一定范围内的地物,通过地图上框选矩形或者多边形,查询矩形或者多边形内的地物等. 范围查询:查询指定经纬度周边一定距离内的地物,效果如下图所示: 矩形框选查询:查询包含在指定矩形内的地物 多边形框选查询:在地图上绘制多边形,并查询包含在多边形内的地物 代码: <!DOCTYPE html> <html> <head>     <meta charset=&

离线地图解决方案(二):地图基本控制

地图鹰眼,比例尺,地图缩放控件应用,地图放大.缩小.设置中心点,设置瓦片显示层级等.功能没什么好说的,直接上图: 代码: <!DOCTYPE HTML PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xh

离线地图解决方案(三):地图点、线、面绘制

使用鼠标,在地图上添加点.线.面,并获取所添加地物的坐标信息. 效果如下: 地图绘制后获取坐标: 代码: <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/> <title>

离线地图解决方案(四):地图图元编辑

使用鼠标对地图上已经有的图元,进行修改,点图元可以进行移动,线.面图元可以拖动原有坐标节点,增加新的节点,并对节点进行拖动 效果如下: 代码: <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"