最短路径实现

主要工具

  1. QGIS建立拓扑关系
  2. Postgres存储数据表
  3. Geoserver发布相关服务

QGIS建立拓扑关系

使用v.clean运行,并用DBManager即可以建立拓扑关系并导入数据库。

注意
QGIS2.16有数据溢出问题,使用QGIS2.14可以解决这个问题

Postgres存储数据表

导入wuhan_road_topo后可以进行相应处理

drop table if exists tmp_pts_topo;
create table tmp_pts_topo
as
select 
osm_id
,(st_dump(geom)).geom as geom
,st_startpoint((st_dump(geom)).geom)
,st_endpoint((st_dump(geom)).geom)
,st_length((st_dump(geom)).geom)*110 as dis
from wuhan_road_topo;alter table tmp_pts_topo add column id serial;
select * from tmp_pts_topo limit 10;drop table if exists tmp_pts;
create table tmp_pts(geom geometry);insert into tmp_pts
select geom from
(
select st_startpoint as geom from tmp_pts_topo 
union all 
select st_endpoint  as geom from tmp_pts_topo
)x
group by geom;alter table tmp_pts add column id serial; select * from tmp_pts limit 10;
select * from tmp_pts_topo limit 10;
alter table tmp_pts_topo add column start_point int;
alter table tmp_pts_topo add column end_point int;create index indx_geom_tmp_pts on tmp_pts 
using gist(geom);create index indx_geom_tmp_pts_1 on tmp_pts_topo 
using gist(st_startpoint);create index indx_geom_tmp_pts_2 on tmp_pts_topo 
using gist(st_endpoint);select * from tmp_pts limit 10;
select * from tmp_pts_topo limit 10;update tmp_pts_topo t1 set start_point=t2.id
from tmp_pts t2
where st_dwithin(t1.st_startpoint,t2.geom,0);update tmp_pts_topo t1 set end_point=t2.id
from tmp_pts t2
where st_dwithin(t1.st_endpoint,t2.geom,0);insert into tmp_pts(geom)
select st_startpoint 
from tmp_pts_topo 
where start_point is null
union
select st_endpoint 
from tmp_pts_topo 
where end_point is null;update tmp_pts_topo t1 set start_point=t2.id
from tmp_pts t2
where st_dwithin(t1.st_startpoint,t2.geom,0)
and start_point is null;update tmp_pts_topo t1 set end_point=t2.id
from tmp_pts t2
where st_dwithin(t1.st_endpoint,t2.geom,0)
and end_point is null;delete from tmp_pts_topo where id in
(
select id from(
select id,row_number() 
over(partition by start_point,end_point order by dis) 
from tmp_pts_topo
where (start_point,end_point) in
(
select start_point,end_point
from tmp_pts_topo 
group by start_point,end_point
having count(*)>1
)
)x
where row_number>1
);select *
from tmp_pts_topo 
where start_point=1138 and end_point=1143;select count(*) from tmp_pts_topo;select * from tmp_pts_topo limit 1;select * from tmp_pts_topo where start_point=10997;delete from tmp_pts_topo where start_point is null or end_point is null;

注意
要删除空白点,不然无法正常运行

测试查询
选定一个起点与终点,测试有没有结果

with start_point as
(
select st_setsrid(
st_makepoint(114.25,30.57)
,4326) as p
)
,end_point as
(
select st_setsrid(st_makepoint(114.23,30.56),4326) as p
)
select t2.seq,st_asgeojson(t1.geom) from 
(
SELECT seq, 
id1 AS node, 
id2 AS edge, 
cost FROM pgr_dijkstra('
SELECT id,                        
start_point as source,                        
end_point as target,                        
dis AS cost                       
FROM tmp_pts_topo',                
(
select id from tmp_pts
where st_dwithin(
(select p from start_point)
,geom,0.05)
order by st_distance(
(select p from start_point)
,geom)
limit 1
)
, 
(
select id from tmp_pts
where st_dwithin(
(select p from end_point)
,geom,0.05)
order by st_distance(
(select p from end_point)
,geom)
limit 1
), false, false)
)t2 left join tmp_pts_topo t1
on t1.id=t2.edge
where t2.edge>0
order by t2.seq;

Geoserver发布相关服务

使用Geoserver连接postgres并发布wuhan_road_topo,并配置新的SQL视图,SQL视图可以接收参数返回相应的视图

可参见:GeoServer的SQL Views详解

将SQL语句修改为

with start_point as
(
select st_setsrid(
st_makepoint(%startLon%,%startLat%)
,4326) as p
)
,end_point as
(
select st_setsrid(st_makepoint(%endLon%,%endLat%),4326) as p
)
select t2.seq,(t1.geom) from 
(
SELECT seq, 
id1 AS node, 
id2 AS edge, 
cost FROM pgr_dijkstra('
SELECT id,                        
start_point as source,                        
end_point as target,                        
dis AS cost                       
FROM tmp_pts_topo',                
(
select id from tmp_pts
where st_dwithin(
(select p from start_point)
,geom,0.05)
order by st_distance(
(select p from start_point)
,geom)
limit 1
)
, 
(
select id from tmp_pts
where st_dwithin(
(select p from end_point)
,geom,0.05)
order by st_distance(
(select p from end_point)
,geom)
limit 1
), false, false)
)t2 left join tmp_pts_topo t1
on t1.id=t2.edge
where t2.edge>0
order by t2.seq

发布成功后可以通过修改参数,如http://localhost:8080/geoserver/wuhanwork/wms?service=WMS&version=1.1.0&request=GetMap&view&layers=wuhan:tt&styles=&bbox=114.22769686949,30.559729927104,114.246243846172,30.5719569775606&width=512&height=337&srs=EPSG:4326&format=application/openlayers&viewparams=startLon:114.25;startLat:30.57;endLon:114.39;endLat:30.70 来访问
即可通过输入起点与终点,返回最短路径

客户端实现

<!DOCTYPE html>
<html lang="zh-cmn-Hans"><head><meta charset="UTF-8"><meta http-equiv="X-UA-Compatible" content="IE=Edge"><meta name="viewport" content="initial-scale=1.0, user-scalable=no, width=device-width"><!-- 新 Bootstrap 核心 CSS 文件 --><link rel="stylesheet" href="http://cdn.bootcss.com/bootstrap/3.3.0/css/bootstrap.min.css"><!-- 可选的Bootstrap主题文件(一般不用引入) --><link rel="stylesheet" href="http://cdn.bootcss.com/bootstrap/3.3.0/css/bootstrap-theme.min.css"><link rel="stylesheet" href="./css/prism.css" type="text/css"><link rel="stylesheet" href="./css/ol.css" type="text/css"><link rel="stylesheet" href="./css/layout.css" type="text/css"><link rel="stylesheet" href="./css/popup.css"><link rel="stylesheet" type="text/css" href="./css/main.css"><script src="js/ol-debug.js"></script><script src="js/ol-deps.js"></script><script src="js/ol.js"></script><title>HomeWork</title>
</head><body><div class="mycontainer"><div class="row" id="header"><h1>Digital engineering practice</h1></div></div><div class="container-fluid"><div class="row-fluid"><div class="span12"><div id="map" class="map"></div><div id="popup" class="ol-popup"><a href="#" id="popup-closer" class="ol-popup-closer"></a><div id="popup-content"></div></div><!--鼠标点击--><div class="buttonlay"><button type="button" id="btStart" onclick="btStart_click()" data-original-title="Click" class="btn btn-lg btn-default btn-check mybutton"><span>Click to input start point</span></button><button type="button" id="btEnd" onclick="btEnd_click()" data-original-title="Click" class="btn btn-lg btn-default btn-check mybutton"><span>Click to input end point</span> </button><button type="button" id="selectShort" onclick="select_click()" data-original-title="Click" class="btn btn-lg btn-default btn-check mybutton"> <span>Click to slect shortest way</span></button></div></div></div></div>
</body>
<script type="text/javascript">
/*** Elements that make up the popup.*/
var container = document.getElementById('popup');
var content = document.getElementById('popup-content');
var closer = document.getElementById('popup-closer');//记录按钮动作
var ableSt = false;
var ableEd = false;//起点经度,起点维度,终点经度,终点纬度
var st_lon, st_lat, ed_lon, ed_lat;/*** Create an overlay to anchor the popup to the map.*/
var overlay = new ol.Overlay( /** @type {olx.OverlayOptions} */ ({element: container,autoPan: true,autoPanAnimation: {duration: 250}
}));/*** 加载瓦片图层**/
var source = new ol.source.XYZ({url: 'http://localhost:8080/tilemill/{z}/{x}/{y}.png'
});var center = ol.proj.transform([114.2207, 30.5960], 'EPSG:4326', 'EPSG:3857');
var map = new ol.Map({logo: false,layers: [new ol.layer.Tile({source: source})],overlays: [overlay],target: 'map',view: new ol.View({maxZoom: 18,center: center,zoom: 10})
});/*** Add a click handler to hide the popup.* @return {boolean} Don't follow the href.*/
closer.onclick = function() {overlay.setPosition(undefined);closer.blur();return false;
};/*** Add a click handler to the map to render the popup.*/
map.on('singleclick', function(evt) {var coordinate = evt.coordinate;var hdms = ol.coordinate.toStringHDMS(ol.proj.transform(coordinate, 'EPSG:3857', 'EPSG:4326'));var xy = ol.proj.transform(coordinate, 'EPSG:3857', 'EPSG:4326').toString();var lon_string = xy.split(",")[0];var lat_string = xy.split(",")[1];var lon_number = new Number(lon_string);var lat_number = new Number(lat_string);if (ableSt) {st_lon = lon_number.toFixed(4);st_lat = lat_number.toFixed(4);content.innerHTML = '<p>You put start point here:</p><code>' + hdms + '</code>';ableSt = false;} else {if (ableEd) {ed_lon = lon_number.toFixed(4);ed_lat = lat_number.toFixed(4);content.innerHTML = '<p>You put end point here:</p><code>' + hdms + '</code>';ableEd = false;} else {content.innerHTML = '<p>You clicked here:</p><code>' + hdms + '</code>';}}overlay.setPosition(coordinate);
});/***按钮相应事件**/
function btStart_click() {ableSt = true;
}function btEnd_click() {ableEd = true;
}//最短路径按钮
function select_click() {overlay.setPosition(undefined);closer.blur();var getwayurl = 'http://localhost:8080/geoserver/wuhan/ows?service=WFS&version=1.0.0&request=GetFeature&typeName=wuhan:wuhan&maxFeatures=50&outputFormat=application/json&viewparams=' + 'st_lon:' + st_lon + ';st_lat:' + st_lat + ';ed_lon:' + ed_lon + ';ed_lat:' + ed_lat;var getMywayurl = 'http://localhost:8080/geoserver/wuhanwork/ows?service=WFS&version=1.0.0&request=GetFeature&typeName=wuhanwork:tt&maxFeatures=50&outputFormat=application/json&viewparams=' + 'startLon:' + st_lon + ';startLat:' + st_lat + ';endLon:' + ed_lon + ';endLat:' + ed_lat;var roadsource = new ol.layer.Vector({source: new ol.source.Vector({       url: getMywayurl,format: new ol.format.GeoJSON({extractStyles: true}),style: new ol.style.Style({stroke: new ol.style.Stroke({color: [255, 255, 255, 1],width: 30})})})});map.addLayer(roadsource);
}
</script></html>

源代码:SourceCode

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/493880.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2019将成机器学习关键年:中美AI或有一战

作者 | Hussain Fakhruddin译者 | 大小非编辑 | Vincent 来源 | AI前线(ID&#xff1a;ai-front)导读&#xff1a;2019 年将是机器学习关键的一年。ML 已经成为全球数字转型的关键要素之一——到 2021 年底&#xff0c;累计投资预计将达到 580 亿美元。在企业应用领域&#xff…

深度 | IBM长文解读人工智能、机器学习和认知计算

来源&#xff1a;人工智能产业链联盟人工智能的发展曾经经历过几次起起伏伏&#xff0c;近来在深度学习技术的推动下又迎来了一波新的前所未有的高潮。近日&#xff0c;IBM 官网发表了一篇概述文章&#xff0c;对人工智能技术的发展过程进行了简单梳理&#xff0c;同时还图文并…

多变量线性回归

目前为止,我们探讨了单变量/特征的回归模型,现在我们对房价模型增加更多的特征, 例如房间数楼层等,构成一个含有多个变量的模型,模型中的特征为(x1,x2,…,xn) 增添更多特征后,我们引入一系列新的注释: n 代表特征的数量 x(i)代表第 i 个训练实例,是特征矩阵中的第 i 行,是一…

人工智能乌托邦 迪拜认为2071年人类应该这样生活!

来源&#xff1a;网易智能不同于硅谷老牌的科技力量&#xff0c;迪拜一直是独特的存在。他们日益崛起的科技实力正在被验证&#xff0c;无论是全面AI化的基础建设和城市治安力量&#xff0c;还是频频登上全球科技头条的机器人警察和空中出租车&#xff0c;迪拜试图摆脱很多人眼…

逻辑回归与正则化

在分类问题中,你要预测的变量 y 是离散的值,我们将学习一种叫做逻辑回归 (Logistic Regression) 的算法,这是目前最流行使用最广泛的一种学习算法。 在分类问题中,我们尝试预测的是结果是否属于某一个类(例如正确或错误)。分类问 题的例子有:判断一封电子邮件是否是垃圾邮件;判…

万字报告!一文看懂全球车厂的技术家底模块化平台

来源&#xff1a;智东西摘要&#xff1a;介绍模块化平台以及该平台对车企的重要意义&#xff0c;详解车企模块化平台布局。汽车的研发制造方式经历了手工作坊式到标准化流水线再到平台化&#xff0c;目前主流车企纷纷采取模块化平台方式。汽车模块化平台研发制造是指车企基于通…

西湖大学全披露:68位顶级科学家加盟,已获捐资35亿,最小捐赠者12岁

来源&#xff1a;量子位最终&#xff0c;2018年10月20日&#xff0c;成为了西湖大学的成立日。在刚结束的成立大会上&#xff0c;5名诺贝尔奖得主、70余位国内外校长及代表、近百位捐赠人齐聚。可谓少长咸集&#xff0c;高朋满座&#xff0c;生而备受期待。而且就在创立大会上&…

字体大宝库:设计师必备的专业免费英文字体

字体绝对是每一个设计非常重要的部分&#xff0c;设计者总是希望有最好的免费字体&#xff0c;以保持他们字体库的更新。所以今天我要向设计师们分享一个专业的免费英文字体集合。这些免费的字体是适用于任何类型的图形设计&#xff1a;Web&#xff0c;打印&#xff0c;动态图形…

神经网络学习

代价函数 首先引入一些便于稍后讨论的新标记方法: 假设神经网络的训练样本有 m 个,每个包含一组输入 x 和一组输出信号 y,L 表示神经 网络层数,Sl表示每层的 neuron 个数(SL表示输出层神经元个数),SL代表最后一层中处理 单元的个数。 将神经网络的分类定义为两种情况:二类分…

干货|深度!“人工智能+制造”产业发展研究报告

来源&#xff1a;&#xff1a;腾讯研究院工业革命以后的“自动化”概念追求的是机器自动生产&#xff0c;本质是“机器替人”&#xff0c;强调在完全不需要人的情况下进行不间断的大规模机器生产&#xff1b;而“智能化”追求的是机器的柔性生产&#xff0c;本质是“人机协同”…

机器学习系统设计与建议

当我们在运用训练好了的模型来预测未知数据的时候发现有较大的误差,我们下一步可以 做什么? 1. 获得更多的训练实例——通常是有效的,但代价较大,下面的方法也可能有效,可 考虑先采用下面的几种方法。 2. 尝试减少特征的数量 3. 尝试获得更多的特征 4. 尝试增加多项式特征…

李飞飞重返斯坦福后的大动作:开启「以人为中心的AI计划」

来源&#xff1a;网络大数据刚刚&#xff0c;李飞飞宣布斯坦福开启「以人为中心的 AI 计划」(Human-Centered AI Initiative&#xff0c;HAI)&#xff0c;该项目由李飞飞和斯坦福大学前教务长 John Etchemendy 共同主导&#xff0c;Chris Manning 也参与其中。李飞飞在 twitter…

支持向量机学习

与逻辑回归和神经网络相比,支持向量机,或者简称 SVM,在学习复杂的非线性 方程时 供了一种更为清晰,更加强大的方式 如果我们用一个新的代价函数来代替,即这条从 0 点开始的水平直线,然后是一条斜 线,像上图。那么,现在让我给这两个方程命名,左边的函数,我称之为cost1(z),同时,…

中国安防行业十年报告:产值增涨四倍!双巨头全球称雄

来源&#xff1a;智东西近年来&#xff0c;安防是一个快速增长的行业&#xff0c; 过去十年&#xff0c; 复合 17%的行业增长率证明了行业的持续性&#xff0c;龙头份额提升持续获得超越平均的增速。 根据历史数据&#xff0c; 2008 年至 2017 年&#xff0c; 十年内中国安防行…

聚类算法学习

聚类是一种非监督学习方法 在一个典型的监督学习中,我们有一个有标签的训练集,我们的目标是找到能够区分正 样本和负样本的决策边界,在这里的监督学习中,我们有一系列标签,我们需要据此拟合一 个假设函数。与此不同的是,在非监督学习中,我们的数据没有附带任何标签,我们拿到…

斯坦福大学:极限工况下的无人驾驶路径跟踪|厚势汽车

来源&#xff1a; 同济智能汽车研究所责任编辑&#xff1a;啜小雪文章译自 2017 年美国控制年会的会议论文原标题&#xff1a;Path-Tracking for Autonomous Vehicles at the Limit of Friction原作者&#xff1a;Vincent A. Laurense, Jonathan Y. Gohand J. Christian Gerdes…

SQLite DBHelp

c#连接SQLite SQLite这个精巧的小数据库&#xff0c;无需安装软件&#xff0c;只需要一个System.Data.SQLite.DLL文件即可操作SQLite数据库。SQLite是一个开源数据库&#xff0c;现在已变得越来越流行&#xff0c;它的体积很小&#xff0c;被广泛应用于各种不同类型的应用中。S…

手写数字识别实现

本文主要实现手写数字识别&#xff0c;利用多类逻辑回归与神经网络两种方法实现 Multi-class Classification 数据源 There are 5000 training examples in ex3data1.mat, where each training example is a 20 pixel by 20 pixel grayscale image of the digit. Each pixe…

Science:若DTC基因检测达2%成年人群,几乎所有人的身份或将无所遁形

来源&#xff1a;测序中国摘要&#xff1a;直接面向消费者&#xff08;DTC&#xff09;的基因检测不仅仅是有趣那么简单&#xff0c;它的有用性随着样本数据库的积累&#xff0c;会逐渐显露出来。消费级基因检测&#xff0c;即直接面向消费者&#xff08;DTC&#xff09;的基因…

降维算法学习

降维的动机 首先,让我们谈论降维是什么。作为一种生动的例子,我们收集的数据集,有许多, 许多特征,我绘制两个在这里。 假设我们未知两个的特征 x1:长度:用厘米表示;X2,是用英寸表示同一物体的长度。 所以,这给了我们高度冗余表示,也许不是两个分开的特征 x1 和 X2,这两个…