目录
目录
1.7.在要素数据集上右键>选择导入,把打断后的shp数据导入过来即可
4.11.为anet4表添加reverse_cost字段并用length的值赋值
1.ArcGis打断线路
参考视频:
ArcGis打断
1.1.菜单栏>自定义>工具条>编辑器
1.2.编辑器>更多编辑工具>高级编辑
1.3.点击图层右键>选择>全选,讲所有线都选中
1.4.选择>打断相交线
1.5.在右侧目录下右键创建一个 个人地理数据库
1.6.在个人地理数据库下右键创建一个 要素数据集
1.7.在要素数据集上右键>选择导入,把打断后的shp数据导入过来即可
1.8.新建网络数据集
1.9.打开路径列表
2.空间扩展语句
创建完用户和数据库后执行空间扩展语句
使用超级管理员用户执行,登录超级管理用户,选择需要扩展语句的数据库,执行
-- 提供如下空间信息服务功能:空间对象、空间索引、空间操作函数和空间操作符
CREATE EXTENSION postgis;
-- 用于网络分析的扩展模块
CREATE EXTENSION pgrouting;
-- gis 拓扑
CREATE EXTENSION postgis_topology;
-- 提供了几个函数来确定字符串之间的相似性和距离
CREATE EXTENSION fuzzystrmatch;
CREATE EXTENSION postgis_tiger_geocoder;
CREATE EXTENSION address_standardizer;
3.导入数据
(1)使用PostGIS shapfile and DBF Loader工具将shp数据导入到数据库中
(2)连接数据库
(3)点击Add File按钮添加,选择要导入的shapfile文件(注意:这里存放shapfile文件的路径必须为纯英文,路径中不能含有汉字,SRD必须设置,这里我设置为4326)
(4)在Options点选下面对号
注意最后一个复选框必须打勾,以此来生成LineString类型,否则无法进行路径规划。
(5)点击 Import 导入数据
(6)查看导入数据
4.字段处理
如果是第一次创建需要处理字段,执行如下语句
4.1.创建新的空间字段geom
select AddGeometryColumn ('anet4','geom',4326,'LINESTRING',2);
4.2.创建索引
create index gidx_anet4_geom on anet4 using gist(geom);
select gid from anet3 where ST_IsValid(geometry) IS FALSE;
update anet4 set geom=ST_LineMerge(geometry);
4.3.删除原有的空间字段
ALTER TABLE anet4 DROP COLUMN geometry;
4.4.创建拓扑结构
ALTER TABLE anet4
ADD COLUMN source integer, /*当前线段起点连接至上一线段的id*/
ADD COLUMN target integer, /*当前线段终点连接至下一线段的id*/
ADD COLUMN cost double precision, /*正向成本*/
ADD COLUMN cost_time double precision, /*正向成本所需的时间*/
ADD COLUMN rcost double precision, /*反向成本*/
ADD COLUMN rcost_time double precision, /*反向成本所需的时间*/
ADD COLUMN x1 double precision, /*当前线段起点坐标(x)*/
ADD COLUMN y1 double precision, /*当前线段起点坐标(Y)*/
ADD COLUMN x2 double precision, /*当前线段终点坐标(x)*/
ADD COLUMN y2 double precision, /*当前线段终点坐标(y)*/
ADD COLUMN to_cost double precision,
ADD COLUMN rule text,
ADD COLUMN isolated integer;
4.5.更新属性字段
注释:
cost_len==rcost表示双向通行,如果要单行,只要在其中的一个字段上设置为-1即可。
cost_len和rcost长度单位为米并且只精确到米。
为加快pgr_createTopology的速度,VACUUM一下表
sql:
with base as(
select 'SPHEROID["WGS84",6378137,298.25728]'::spheroid as sph
) update anet4 set x1 = st_x(st_startpoint(geom)),
y1 = st_y(st_startpoint(geom)),
x2 = st_x(st_endpoint(geom)),
y2 = st_y(st_endpoint(geom)),
cost = ST_LengthSpheroid(geom, f.sph)::integer,
rcost = ST_LengthSpheroid(geom, f.sph)::integer
from base as f;
VACUUM FULL ANALYZE VERBOSE anet4;
4.6.路网创建拓扑
注释:
0.000001在上一章Arcmap中做拓朴检查时输入的值,单位为 0.000001度【在低纬地区(中国)大约是米级精度了】。
创建拓朴成功后,同时会生成一个表,命名格式为“表名_vertices_pgr(sroads_vertices_pgr)”,主要存储线段交汇点数据(几何类型为POINT)。
sql:
select pgr_createTopology('anet4', 0.000001, the_geom:='geom', id:='gid', source:='source', target:='target');
4.7.VACUUM表
注释:
由于前面我们做了大量的更新和删除操作,为提高性能对表进行VACUUM 操作,提高路网分析效率。
sql:
VACUUM FULL ANALYZE VERBOSE anet4;
VACUUM FULL ANALYZE VERBOSE anet4_vertices_pgr;
4.8.添加道路权重值
ALTER TABLE anet4 ADD COLUMN length double precision;
4.9.为source和target字段创建索引
CREATE INDEX source_idx ON anet4("source");
CREATE INDEX target_idx ON anet4("target");
4.10.给长度赋值
为length赋值
update anet4 set length =st_length(geom);
4.11.为anet4表添加reverse_cost字段并用length的值赋值
ALTER TABLE anet4 ADD COLUMN reverse_cost double precision;
UPDATE anet4 SET reverse_cost =length;
4.12. 计算任意两点间最短路径
思路:
首先计算距离起点A和终点B最新的路网线段l1和l2,再使用pgr_dijkstra函数计算l1和l2的两线段端点之间的最短路径,也就是l1的起点和终点至l2的起点和终点四种情况的最短路径,求得这四种情况中线段长度最小的情况,然后再在l1求得离起点A最近的点C,以及在l2上离终点B最近的点D,并根据点C、D截取l1和l2,最后将起点A、点C、最短路径、点D、终点B进行拼接,就是起点A到终点B的最短路径。
输入以下代码创建pgr_fromAtoB函数:
CREATE OR REPLACE FUNCTION "public"."pgr_fromatob"("tbl" varchar, "startx" float8, "starty" float8, "endx" float8, "endy" float8)
RETURNS "public"."geometry" AS $BODY$
declare
v_startLine geometry;--离起点最近的线
v_endLine geometry;--离终点最近的线
v_startTarget integer;--距离起点最近线的终点
v_startSource integer;
v_endSource integer;--距离终点最近线的起点
v_endTarget integer;
v_statpoint geometry;--在v_startLine上距离起点最近的点
v_endpoint geometry;--在v_endLine上距离终点最近的点
v_res geometry;--最短路径分析结果
v_res_a geometry;
v_res_b geometry;
v_res_c geometry;
v_res_d geometry;
v_perStart float;--v_statpoint在v_res上的百分比
v_perEnd float;--v_endpoint在v_res上的百分比
v_shPath_se geometry;--开始到结束
v_shPath_es geometry;--结束到开始
v_shPath geometry;--最终结果
tempnode float;
begin
--查询离起点最近的线
execute 'select geom, source, target from ' ||tbl||
' where ST_DWithin(geom,ST_Geometryfromtext(''point('|| startx ||' ' || starty||')'',4326),150)
order by ST_Distance(geom,ST_GeometryFromText(''point('|| startx ||' '|| starty ||')'',4326)) limit 1'
into v_startLine, v_startSource ,v_startTarget;
--查询离终点最近的线
execute 'select geom, source, target from ' ||tbl||
' where ST_DWithin(geom,ST_Geometryfromtext(''point('|| endx || ' ' || endy ||')'',4326),150)
order by ST_Distance(geom,ST_GeometryFromText(''point('|| endx ||' ' || endy ||')'',4326)) limit 1'
into v_endLine, v_endSource,v_endTarget;
--如果没找到最近的线,就返回null
if (v_startLine is null) or (v_endLine is null) then
return null;
end if ;
-- ST_Distance
--从开始的起点到结束的起点最短路径
execute 'SELECT st_linemerge(st_union(b.geom)) ' ||
'FROM pgr_dijkstra(
''SELECT gid as id, source, target, cost FROM ' || tbl ||''','
||v_startSource || ', ' ||v_endSource||' ,false
) a, '
|| tbl || ' b
WHERE a.edge=b.gid ' into v_res ;
--从开始的终点到结束的起点最短路径
execute 'SELECT st_linemerge(st_union(b.geom)) ' ||
'FROM pgr_dijkstra(
''SELECT gid as id, source, target, cost FROM ' || tbl ||''','
||v_startTarget || ', ' ||v_endSource||' ,false
) a, '
|| tbl || ' b
WHERE a.edge=b.gid ' into v_res_b ;
--从开始的起点到结束的终点最短路径
execute 'SELECT st_linemerge(st_union(b.geom)) ' ||
'FROM pgr_dijkstra(
''SELECT gid as id, source, target, cost FROM ' || tbl ||''','
||v_startSource || ', ' ||v_endTarget||' ,false
) a, '
|| tbl || ' b
WHERE a.edge=b.gid ' into v_res_c ;
--从开始的终点到结束的终点最短路径
execute 'SELECT st_linemerge(st_union(b.geom)) ' ||
'FROM pgr_dijkstra(
''SELECT gid as id, source, target, cost FROM ' || tbl ||''','
||v_startTarget || ', ' ||v_endTarget||' ,false
) a, '
|| tbl || ' b
WHERE a.edge=b.gid ' into v_res_d ;
if(ST_Length(v_res) > ST_Length(v_res_b)) then
v_res = v_res_b;
end if;
if(ST_Length(v_res) > ST_Length(v_res_c)) then
v_res = v_res_c;
end if;
if(ST_Length(v_res) > ST_Length(v_res_d)) then
v_res = v_res_d;
end if;
--如果找不到最短路径,就返回null
--if(v_res is null) then
-- return null;
--end if;
--将v_res,v_startLine,v_endLine进行拼接
select st_linemerge(ST_Union(array[v_res,v_startLine,v_endLine])) into v_res;
select ST_LineLocatePoint(v_res, ST_Geometryfromtext('point('|| startx ||' ' || starty ||')',4326)) into v_perStart;
select ST_LineLocatePoint(v_res, ST_GeometryFromText('point('|| endx ||' ' || endy ||')',4326)) into v_perEnd;
if(v_perStart > v_perEnd) then
tempnode = v_perStart;
v_perStart = v_perEnd;
v_perEnd = tempnode;
end if;
--截取v_res
SELECT ST_LineSubstring(v_res,v_perStart, v_perEnd) into v_shPath;
return v_shPath;
end;
$BODY$
LANGUAGE plpgsql VOLATILE STRICT
COST 100
5.完整可直接执行sql
-- shp数据导入数据库后执行
-- 1.创建索引
create index gidx_anet4_geom on anet4 using gist(geom);
-- 2.创建拓扑结构
ALTER TABLE anet4
ADD COLUMN source integer, /*当前线段起点连接至上一线段的id*/
ADD COLUMN target integer, /*当前线段终点连接至下一线段的id*/
ADD COLUMN cost double precision, /*正向成本*/
ADD COLUMN cost_time double precision, /*正向成本所需的时间*/
ADD COLUMN rcost double precision, /*反向成本*/
ADD COLUMN rcost_time double precision, /*反向成本所需的时间*/
ADD COLUMN x1 double precision, /*当前线段起点坐标(x)*/
ADD COLUMN y1 double precision, /*当前线段起点坐标(Y)*/
ADD COLUMN x2 double precision, /*当前线段终点坐标(x)*/
ADD COLUMN y2 double precision, /*当前线段终点坐标(y)*/
ADD COLUMN to_cost double precision,
ADD COLUMN rule text,
ADD COLUMN isolated integer;
-- 更新属性字段
with base as(
select 'SPHEROID["WGS84",6378137,298.25728]'::spheroid as sph
) update anet4 set x1 = st_x(st_startpoint(geom)),
y1 = st_y(st_startpoint(geom)),
x2 = st_x(st_endpoint(geom)),
y2 = st_y(st_endpoint(geom)),
cost = ST_LengthSpheroid(geom, f.sph)::integer,
rcost = ST_LengthSpheroid(geom, f.sph)::integer
from base as f;
VACUUM FULL ANALYZE VERBOSE anet4;
-- 路网创建拓扑
select pgr_createTopology('anet4', 0.000001, the_geom:='geom', id:='gid', source:='source', target:='target');
-- VACUUM表
VACUUM FULL ANALYZE VERBOSE anet4;
VACUUM FULL ANALYZE VERBOSE anet4_vertices_pgr;
-- 添加道路权重值
ALTER TABLE anet4 ADD COLUMN length double precision;
-- 3.创建索引
-- 为source和target字段创建索引
CREATE INDEX source_idx ON anet4("source");
CREATE INDEX target_idx ON anet4("target");
-- 4.给长度赋值
-- 为length赋值
update anet4 set length =st_length(geom);
-- 为anet4表添加reverse_cost字段并用length的值赋值
ALTER TABLE anet4 ADD COLUMN reverse_cost double precision;
UPDATE anet4 SET reverse_cost =length;
CREATE OR REPLACE FUNCTION "public"."pgr_fromatob"("tbl" varchar, "startx" float8, "starty" float8, "endx" float8, "endy" float8)
RETURNS "public"."geometry" AS $BODY$
declare
v_startLine geometry;--离起点最近的线
v_endLine geometry;--离终点最近的线
v_startTarget integer;--距离起点最近线的终点
v_startSource integer;
v_endSource integer;--距离终点最近线的起点
v_endTarget integer;
v_statpoint geometry;--在v_startLine上距离起点最近的点
v_endpoint geometry;--在v_endLine上距离终点最近的点
v_res geometry;--最短路径分析结果
v_res_a geometry;
v_res_b geometry;
v_res_c geometry;
v_res_d geometry;
v_perStart float;--v_statpoint在v_res上的百分比
v_perEnd float;--v_endpoint在v_res上的百分比
v_shPath_se geometry;--开始到结束
v_shPath_es geometry;--结束到开始
v_shPath geometry;--最终结果
tempnode float;
begin
--查询离起点最近的线
execute 'select geom, source, target from ' ||tbl||
' where ST_DWithin(geom,ST_Geometryfromtext(''point('|| startx ||' ' || starty||')'',4326),150)
order by ST_Distance(geom,ST_GeometryFromText(''point('|| startx ||' '|| starty ||')'',4326)) limit 1'
into v_startLine, v_startSource ,v_startTarget;
--查询离终点最近的线
execute 'select geom, source, target from ' ||tbl||
' where ST_DWithin(geom,ST_Geometryfromtext(''point('|| endx || ' ' || endy ||')'',4326),150)
order by ST_Distance(geom,ST_GeometryFromText(''point('|| endx ||' ' || endy ||')'',4326)) limit 1'
into v_endLine, v_endSource,v_endTarget;
--如果没找到最近的线,就返回null
if (v_startLine is null) or (v_endLine is null) then
return null;
end if ;
-- ST_Distance
--从开始的起点到结束的起点最短路径
execute 'SELECT st_linemerge(st_union(b.geom)) ' ||
'FROM pgr_dijkstra(
''SELECT gid as id, source, target, cost FROM ' || tbl ||''','
||v_startSource || ', ' ||v_endSource||' ,false
) a, '
|| tbl || ' b
WHERE a.edge=b.gid ' into v_res ;
--从开始的终点到结束的起点最短路径
execute 'SELECT st_linemerge(st_union(b.geom)) ' ||
'FROM pgr_dijkstra(
''SELECT gid as id, source, target, cost FROM ' || tbl ||''','
||v_startTarget || ', ' ||v_endSource||' ,false
) a, '
|| tbl || ' b
WHERE a.edge=b.gid ' into v_res_b ;
--从开始的起点到结束的终点最短路径
execute 'SELECT st_linemerge(st_union(b.geom)) ' ||
'FROM pgr_dijkstra(
''SELECT gid as id, source, target, cost FROM ' || tbl ||''','
||v_startSource || ', ' ||v_endTarget||' ,false
) a, '
|| tbl || ' b
WHERE a.edge=b.gid ' into v_res_c ;
--从开始的终点到结束的终点最短路径
execute 'SELECT st_linemerge(st_union(b.geom)) ' ||
'FROM pgr_dijkstra(
''SELECT gid as id, source, target, cost FROM ' || tbl ||''','
||v_startTarget || ', ' ||v_endTarget||' ,false
) a, '
|| tbl || ' b
WHERE a.edge=b.gid ' into v_res_d ;
if(ST_Length(v_res) > ST_Length(v_res_b)) then
v_res = v_res_b;
end if;
if(ST_Length(v_res) > ST_Length(v_res_c)) then
v_res = v_res_c;
end if;
if(ST_Length(v_res) > ST_Length(v_res_d)) then
v_res = v_res_d;
end if;
--如果找不到最短路径,就返回null
--if(v_res is null) then
-- return null;
--end if;
--将v_res,v_startLine,v_endLine进行拼接
select st_linemerge(ST_Union(array[v_res,v_startLine,v_endLine])) into v_res;
select ST_LineLocatePoint(v_res, ST_Geometryfromtext('point('|| startx ||' ' || starty ||')',4326)) into v_perStart;
select ST_LineLocatePoint(v_res, ST_GeometryFromText('point('|| endx ||' ' || endy ||')',4326)) into v_perEnd;
if(v_perStart > v_perEnd) then
tempnode = v_perStart;
v_perStart = v_perEnd;
v_perEnd = tempnode;
end if;
--截取v_res
SELECT ST_LineSubstring(v_res,v_perStart, v_perEnd) into v_shPath;
return v_shPath;
end;
$BODY$
LANGUAGE plpgsql VOLATILE STRICT
COST 100
6.操作Geoserver
(1)添加新的数据存储,类型为postgis数据库
(2)选择工作空间,填写数据源名称、输入数据库连接ip、数据库、用户、密码
(3)保存后,选择“配置新的SQL视图”
(4)输入试图名称
输入sql:
SELECT * FROM pgr_fromatob('huaxi_road', %x1%, %y1%, %x2%, %y2%)
(5)然后点击下方的“从SQL猜想的参数”,输入默认值为0,验证的正则表达式为*^-?[\d.]+$*
(6) 点击下方的“刷新”按钮,在新弹出的栏目中,选择类型为“LineString”,SRI为“4326”:
(7)然后计算数据的边框:
创建sql试图过程中用到的完整配置如下:
sql:
SELECT * FROM pgr_fromatob('huaxi_road', %x1%, %y1%, %x2%, %y2%)
验证的正则表达式:^-?[\d.]+$
类型:LingString
SRID:4326
7.前端调用
html按钮,点击调用起点、终点、路径分析方法
起点方法:
终点方法:
路径分析方法:
完整js代码:
/**
* @class 网络分析>> 路径规划
*/
var ak_network_rotate={
/**
* @desc 起点 {cartesian}
* @typed {cartesian}
*/
startP: {},
/**
* @desc 终点 {cartesian}
* @typed {cartesian}
*/
endP: {},
/**
* @desc 起点数组
* @typed {cartesian}
*/
startArr:[],
/**
* @desc 终点数组
* @typed {cartesian}
*/
endArr:[],
/**
* @desc 路线数组
*/
lineArr:[],
carArr:[],
lineColor:[],
/**
获取起点坐标
@throws
异常:
其他未结束事件可能造成的影响
*/
startCartesian:null,
// 起点工具方法
setStartPoint:function(){
var $this = this;
// this.clearStart(); // 不能 清楚开始
$this.StartP=new Object();
var obj=new Object();
obj.image="css/images/marker/start4.png";
obj.width=35;
obj.height=35;
var markerInit=new geo_draw_marker(obj);
markerInit.init(function(postion){
$this.startCartesian=postion;
var xy=_cUtil.cartesianToLatlng(postion);// 世界坐标
console.log(xy);
$this.startP.cartographic =xy;
});
this.startArr.push(markerInit);
},
/**
获取终点坐标
@throws
异常:
其他未结束事件可能造成的影响
*/
// 终点工具栏方法
setEndPoint:function(){
var $this = this;
this.clearEnd();
$this.endP=new Object();
var obj=new Object();
obj.width=35;
obj.height=35;
obj.image="css/images/marker/end4.png";
var markerInit=new geo_draw_marker(obj);
markerInit.init(function(postion){
var xy=_cUtil.cartesianToLatlng(postion);// 世界坐标
$this.endP.cartographic =xy;// 转换到经纬度
});
this.endArr.push(markerInit);
},
getRoateYj:function(x,y){
if(x){
var geonetwork=new geo_network();
geonetwork.setAnalylis(x,y,ak_network_rotate.roateCallback);
}
},
/**
获取路线
@throws
异常:
其他未结束事件可能造成的影响
*/
getRoate:function(){
if(this.startP){
var geonetwork=new geo_network();
geonetwork.setAnalylis(this.startP,this.endP,ak_network_rotate.roateCallback);
}
},
roateCallback:function(data){
if(data && data.status==1) {
var ps = data.route.paths;
/*var pagination1 = new paginationNetwork(ps);//paginationNetwork.js
pagination1.updateQResultTableData(1);*/
var ht=document.body.clientHeight-185;
/**/var rotateLine="<div style='overflow-y:auto;overflow-x:hidden;height:"+ht+"px;padding:20px'>";
this.lineColor=[];
var co1=new Cesium.Color(255,0,255, 1);
var co2=new Cesium.Color(255,20,147, 1);
var co3=new Cesium.Color(128,0,128, 1);
var co4=new Cesium.Color(124,252,0, 1);
var co5=new Cesium.Color(139,69,19, 1);
this.lineColor.push(Cesium.Color.RED);
this.lineColor.push(Cesium.Color.BLUE);
this.lineColor.push(Cesium.Color.YELLOW);
this.lineColor.push(Cesium.Color.DARKSLATEGRAY);
this.lineColor.push(co1);
this.lineColor.push(co2);
this.lineColor.push(co3);
this.lineColor.push(co4);
this.lineColor.push(co5);
var colorline ;
for(var i=0;i<ps.length;i++){
var line=ps[i];
if(i<7){
colorline= this.lineColor[i];
}
line.color=colorline;
rotateLine+=ak_network_rotate.rotateBuildTable(line)+"<br/><br/>";
ak_network_rotate.addRouteLine(line,2);
}
rotateLine+="</div>"
var dom =_result;
$(dom).html("");
$(dom).append(rotateLine);
_slipWin.upws(300);
_slipWin.show();
}
},
/*
拼接Table
@example
示例:
var obj=new ak_network_rotate();
obj.rotateBuildTable(object);
@throws
异常:
其他未结束事件可能造成的影响
@param {obj} obj 方案对象
*/
rotateBuildTable:function(obj) {
var table = [];
var self=this;
var jsonstr = JSON.stringify(obj); //将json对象转换为json字符串
var strategy=obj.strategy;
var distance=obj.distance;
var duration=obj.duration;
var step=obj.steps;//instruction
var s1="";
table.push("<table width='100%' height:90% ><tbody>" );
table.push("<tr ><td colspan=2><input type='button' class='panel_weight_button1' style='height:27px;margin-left: 10px;' value='显示路线' onclick='ak_network_rotate.addRouteLine("+jsonstr+","+1+")' />");//
table.push(" <input type='button' class='panel_weight_button1' style='height:27px;margin-left: 10px;' value='开始导航' onclick='ak_network_rotate.addRouteLine("+jsonstr+","+2+")' /></td></tr>");
table.push("<tr ><td>策略</td><td>" + strategy + "</td></tr>");
table.push("<tr ><td>距离</td><td>" + distance + "</td></tr>");
table.push("<tr ><td>时间</td><td>" + duration + "</td></tr>");
for(var i=0;i<step.length;i++){
var steps=step[i];
s1+=steps.instruction+",";//steps.action+","+
//conten+=s1+"</br>";
}
table.push("<tr><td colspan=2>" +s1+ "</td></tr>");
table.push("</tbody></table>");
return table.join("");
},
/*
生成路线
@example
示例:
var obj=new ak_network_rotate();
obj.addRouteLine(res,1);
@throws
异常:
其他未结束事件可能造成的影响
@param {res} res 方案对象
@param {type} type 1-展示路线,2-开始导航
*/
addRouteLine:function(res,type) {
var arr = [];
var steps = res.steps;
for (var i = 0; i < steps.length; i++) {
var item = steps[i];
var positionStr = item.polyline;
var strArr = positionStr.split(";");
for (var z = 0; z < strArr.length; z++) {
var item2 = strArr[z];
var strArr2 = item2.split(",");
var p = gcj2wgs(strArr2);
arr.push(p);
}
}
if(arr.length>1){
ak_network_rotate.FXPositionsYj=new Object();
ak_network_rotate.FXPositionsYj.line=arr;
}
var cartesians = this.lnglatArrToCartesianArr(arr);
var color= new Cesium.PolylineGlowMaterialProperty({
glowPower: 0.1, //一个数字属性,指定发光强度,占总线宽的百分比。
color: res.color
});
var polyline="";
var id=Number((new Date()).getTime() + "" + Number(Math.random() * 1000).toFixed(0));
var line = viewer.entities.add({
id:id,
polyline: {
positions: cartesians,
clampToGround: true,
material: color,//Cesium.Color.RED.withAlpha(1),
width: 10
}
});
this.lineArr.push(line);
if(type==2){
this.moveOnRoute(line);
}
},
/**
汽车移动
@param {lineEntity} lineEntity 路线
*/
qicheModel:null,
carArr:[],
moveOnRoute:function(lineEntity,url,size,height) {
var mrsize=40;
var mrurl="scripts/business/datasource/car.glb";
if (!lineEntity) return;
var positions = lineEntity.polyline.positions.getValue();
if(height){
positions = cCesium.updateCartesianArrHeight(positions,{ z:height});
}
if (!positions) return;
var allDis = 0;
for (var index = 0; index < positions.length - 1; index++) {
var dis = Cesium.Cartesian3.distance(positions[index], positions[index + 1]);
allDis += dis;
}
var playTime = 10;
var v = allDis / playTime;
var startTime = viewer.clock.currentTime;
var endTime = Cesium.JulianDate.addSeconds(startTime, playTime, new Cesium.JulianDate());
var property = new Cesium.SampledPositionProperty();
var t = 0;
for (var i = 1; i < positions.length; i++) {
if (i == 1) {
property.addSample(startTime, positions[0]);
}
var dis = Cesium.Cartesian3.distance(positions[i], positions[i - 1]);
var time = dis / v + t;
var julianDate = Cesium.JulianDate.addSeconds(startTime, time, new Cesium.JulianDate());
property.addSample(julianDate, positions[i]);
t += dis / v;
}
if(height){
qicheModel = viewer.entities.add({
position: property,
orientation: new Cesium.VelocityOrientationProperty(property),
// model: {
// uri: url || mrurl,
// minimumPixelSize:size || mrsize
// },
// billboard: {
// image: 'css/images/marker/man.png',//mark4.png
// width: 30,
// height: 30,
// verticalOrigin: Cesium.VerticalOrigin.BOTTOM,
// // heightReference: Cesium.HeightReference.CLAMP_TO_GROUND,
// disableDepthTestDistance:Number.POSITVE_INFINITY
// },
point: {
color: new Cesium.Color.fromCssColorString("#FFFF00").withAlpha(0.9),
pixelSize :20
},
});
}else{
qicheModel = viewer.entities.add({
position: property,
orientation: new Cesium.VelocityOrientationProperty(property),
model: {
uri: url || mrurl,
// scale: 10,
minimumPixelSize:size || mrsize,
heightReference: Cesium.HeightReference.CLAMP_TO_GROUND
}
});
}
this.carArr.push(qicheModel);
viewer.clock.currentTime = startTime;
viewer.clock.multiplier = 2;
viewer.clock.shouldAnimate = true;
viewer.clock.stopTime = endTime;
},
/**
清除路径分析
*/
clearAll:function(){
this.clearStart();
this.clearEnd();
this.clearCar();
ak_network_rotate.StartP={};
ak_network_rotate.startArr=[];
ak_network_rotate.endP={};
ak_network_rotate.endArr=[];
ak_network_rotate.roamFly=[];
// 清理 导航的路径
// if(ak_network_rotate.polylinesProim){
// viewer.scene.primitives.remove(ak_network_rotate.polylinesProim);
// }
this.clearLineObj();
},
clearLineObj:function(){
this.clearLinesPrimite();
this.clearLine();
},
clearLinesPrimite:function(){
for (var i = 0; i < ak_network_rotate.polylineArrs.length; i++) {
var line = ak_network_rotate.polylineArrs[i];
viewer.scene.primitives.remove(line);
}
for (var i = 0; i < this.lineInitS.length; i++) {
var start = this.lineInitS[i];
start.clear();//
}
this.lineInitS = [];
},
clearStart: function () {
for (var i = 0; i < this.startArr.length; i++) {
var start = this.startArr[i];
start.clear();//
start.disable();
}
this.startArr = [];
},
clearEnd: function () {
for (var j = 0; j < this.endArr.length; j++) {
var end = this.endArr[j];
end.clear();//
end.disable();
}
this.endArr = [];
},
clearLine:function(){
for (var k = 0; k < this.lineArr.length; k++) {
var line = this.lineArr[k];
viewer.entities.remove(line);
}
this.lineArr = [];
},
clearCar:function(){
for (var m = 0; m < this.carArr.length; m++) {
var car = this.carArr[m];
viewer.entities.remove(car);
}
this.carArr = [];
},
/**
经纬度转世界坐标 [101,40]
*/
lnglatToCartesian:function (lnglat) {
if (!lnglat) return null;
return Cesium.Cartesian3.fromDegrees(lnglat[0], lnglat[1], lnglat[2] || 0);
},
lnglatArrToCartesianArr:function(lnglatArr) {
if (!lnglatArr) return [];
var arr = [];
for (var i = 0; i < lnglatArr.length; i++) {
arr.push(this.lnglatToCartesian(lnglatArr[i]));
}
return arr;
},
removeGeoServer_xz:function(){
if(ak_houses.xzproviderPoint){
viewer.imageryLayers.remove(ak_houses.xzproviderPointHand);
ak_houses.xzproviderPointHand=null;
ak_houses.xzproviderPoint=null;
}
},
//乡镇
xzproviderPoint:null,
xzproviderPointHand:null,
apath:1,//透明度 全局
addGeoservr:function(){
if(ak_network_rotate.xzproviderPoint){
ak_network_rotate.removeGeoServer_xz();
return ;
}
//ak_network_rotate.changeRangeApath();
// ak_houses.initfly();
ak_network_rotate.xzproviderPoint = new Cesium.WebMapServiceImageryProvider({
url: config.geoserverurl+'geoserver/cite/wms',
layers: 'cite:anet4 ',//huaxi_road anet
//LOUDONGDIAN XIAOQUDIAN xiaoqumian kunming_houses jiayouzhan84
parameters: {
service: 'WMS',
format: 'image/png',
transparent: true,
}
});
//ImageryLayer
ak_network_rotate.xzproviderPointHand=viewer.imageryLayers.addImageryProvider(ak_network_rotate.xzproviderPoint);
ak_network_rotate.xzproviderPointHand.alpha=ak_network_rotate.apath;
},
roamFly:null,
polylinesProim: null,
polylineArrs:[],
lineInitS:[],
slGeoserver:function(type){
// 如果没有选择起点或终点, 则提示弹框.
if(!ak_network_rotate.polylinesProim){
ak_network_rotate.polylinesProim=scene.primitives.add(new Cesium.PolylineCollection());
}
// console.log($("#qdhzd"));
if(!this.startP.cartographic || !this.endP.cartographic){
ak_network_rotate.Alert('请选择选择起点或终点.');
return ;
}
// this.startP,this.endP
// ak_network_rotate.Alert('是否开启导航.');
var x1 = this.startP.cartographic[0];//
var y1 = this.startP.cartographic[1];//
var x2 = this.endP.cartographic[0];//
var y2 = this.endP.cartographic[1];//
//存储名称
var store = 'tzbdc_ljfx';
//图层标题
// var layer = 'jiangan_route';
var layer = 'geo_anet4';//anet1 huaxi_road4
//图层名称
var typename = store + ':' + layer;
var url =config.geoserverurl + 'geoserver/' + store + '/ows?service=WFS&version=1.0.0&request=GetFeature&typeName=' + typename + '&maxFeatures=50&outputFormat=application/json';
var params = [];
//查询参数
// url +='&viewparams=x1:\''+x1+'\';y1:\''+y1+'\';x2:\''+x2+'\';y2:\''+y2+'\'';
url += '&viewparams=x1:' + x1 + ';y1:' + y1 + ';x2:' + x2 + ';y2:' + y2;
console.log(url);
var pos = new Array();
$.ajax({
type: 'get',
url: url,
async: false,
// type: "get",
// url: url,
// dataType: "jsonp", //指定服务器返回的数据类型
success: function (data) {
// ak_network_rotate.startCartesian
ak_network_rotate.clearLineObj();
console.log(data);
if (data.features ) {
console.log(data.features[0].geometry.coordinates);
var lines = data.features[0].geometry.coordinates;
if(lines.length<2){
alert('没有查询到分析结果');
return ;
}
for (var i = 0; i < lines.length; i++) {
// console.log(lines[i][0]+" "+lines[i][1]);
pos.push(lines[i][0], lines[i][1]);
}
var crr=Cesium.Cartesian3.fromDegreesArray(pos);
var c1pt=crr[0];
var cendpt=crr[crr.length-1];
var d1 = _cUtil.spacePointDistance(ak_network_rotate.startCartesian,c1pt);
var d2 = _cUtil.spacePointDistance(ak_network_rotate.startCartesian,cendpt);
if(d1>d2){
lines=lines.reverse();// 反转
pos=[];
pos.length=0;
for (var i = 0; i < lines.length; i++) {
// console.log(lines[i][0]+" "+lines[i][1]);
pos.push(lines[i][0], lines[i][1]);
}
crr=Cesium.Cartesian3.fromDegreesArray(pos);
}
var newP = cCesium.updateCartesianArrHeight(crr,{
z:4
});
// console.log(JSON.stringify(crr));
var newP2 = cCesium.updateCartesianArrHeight(crr,{
z:5
});
if(newP.length>10 && isapp==1){
type=1;
}
// 如果是1 就是 视野导航
if(type==1){
var width=50;
if(isapp==1){
width=22;
}
ak_nav.hideRote();
var obj=new Object();
obj.width=width;
obj.material= ak_marker.getNearMaterial();//new Cesium.PolylineArrowMaterialProperty(Cesium.Color.YELLOW);
var lineInit=new geo_draw_line(obj);
lineInit.createLine(newP2);
var positions=lineInit.getPositions();
roamFly = new RoamFly(viewer, {
modelUrl: "",//zhanji car weixin/datasource/Cesium_Man.glb
distance:0.025,
pitch:0,
modelSize:20
});
window.setTimeout(function() {
roamFly.crateByPositions(newP,5,9.2,2.5,true,false,ak_network_rotate.callBackTag);//Onground
roamFly.lockView(true);
roamFly.viewToEntity();
},2500);
ak_initFly.isRuning=true;
ak_initFly.changeRun();
}
// 如果是2 就是 线路导航 加 可视域
else if(type==2){
var entity = viewer.entities.add({
name: '寻路',
polyline: {
positions:newP,
width: 3,
material: Cesium.Color.RED,
clampToGround: true,
followSurface: false
}
});
var positions = entity.polyline.positions.getValue();
var runline1 = ak_marker.showRunLineFly(positions,0.1,0,0.00007,90,1,2);
}
// 采用 拓展材质方式 进行展现
else if(type==3){
// var newP = cCesium.updateCartesianArrHeight(crr,{
// z:7
// });
// var material = ak_marker.getNearMaterial();
// var entity = viewer.entities.add({
// name: '寻路',
// polyline: {
// show:true,
// positions:newP,
// width: 15,
// material: material,
// clampToGround: false,
// followSurface: false
// }
// });
var width=50;
if(isapp==1){
width=22;
}
var obj=new Object();
obj.width=width;
obj.material= ak_marker.getNearMaterial();//new Cesium.PolylineArrowMaterialProperty(Cesium.Color.YELLOW);
var lineInit=new geo_draw_line(obj);
lineInit.createLine(newP2);
ak_network_rotate.lineInitS.push(lineInit);
// var line=new geo_draw_line();
// var runlineEntity=line.createLine(newP);
var modelUrl= "weixin/datasource/Cesium_Man.glb";
// ak_network_rotate.moveOnRoute(entity,modelUrl,90,0.1);
// var material = Cesium.Material.fromType("BlueWaterMaterialPropertyLgCz");
// material.uniforms.color = Cesium.Color.YELLOW; // SKYBLUE
// material.uniforms.speed =10;
// material.uniforms.repeat = 25;
// material.uniforms.image = 'weixin/images/animateWall/lineAarrow.png';//lineAarrow arrow_1 colors1 lineAarrow.png
// var material = Cesium.Material.fromType("BlueWaterMaterialPropertyLgCz");
// material.uniforms.color = Cesium.Color.RED; // SKYBLUE
// material.uniforms.speed = 7;
// material.uniforms.repeat = 10;
// material.uniforms.image = 'weixin/images/animateWall/wh1.png';//lineAarrow arrow_1 colors1 lineAarrow.png wh1
// var obj=new Object();
// var id=Number((new Date()).getTime() + "" + Number(Math.random() * 1000).toFixed(0));
// obj.name="ss"
// obj.address="";
// obj.addtypemarker=config.addtypemarker.common;
// obj.cartions=newP;
// obj.material=material;
// obj.width=5;
// var line1=ak_pm_tool.addLine(obj);
// ak_network_rotate.polylineArrs.push(line1);
// ak_pm_tool.addLineReGeom(ak_network_rotate.polylinesProim,obj);
// ak_network_rotate.polylinesProim.add(ak_network_rotate.line1);
}
}
}
});
},
// 在飞行中
// 导航线完成的回调函数.
callBackTag:function(d){
window.setTimeout(function() {
ysdrObj.initFlyExtent();
},1000);
// 飞行过程中 禁用
ak_initFly.isRuning=false;
ak_initFly.changeRun();
ak_initFly.getGaoliang();
$('#bottom_dhx').css('opacity', '1'); // 导航线按钮
ak_nav.showRote(); // 显示窗口号
},
// 固定导航的做法
slGeoserver2:function(){
// 判断, 如果在飞行中, 则该按钮不能被点击.
if (ak_initFly.isRuning) {
return;
}
ak_nav.hideRote(); // 隐藏窗口号
ak_network_rotate.clearLineObj();
// ak_nav.clearAll();
if(roamFly){
roamFly.destroy();
}
ak_initFly.isRuning=true;
ak_initFly.changeRun();
// ak_initFly.showCk();// 显示所有窗口标注
var crr=[{"x":-2197578.80171521,"y":4378632.110861951,"z":4070283.185871305},{"x":-2197577.871779181,"y":4378634.070451927,"z":4070281.590660371},{"x":-2197577.4250770938,"y":4378635.010392767,"z":4070280.8258447256},{"x":-2197577.3287496036,"y":4378635.214959166,"z":4070280.6589139025},{"x":-2197576.7212435873,"y":4378636.463559882,"z":4070279.650515366},{"x":-2197575.097241392,"y":4378639.800473502,"z":4070276.9557738365},{"x":-2197573.9405605663,"y":4378642.177532095,"z":4070275.036067837},{"x":-2197570.5547723807,"y":4378649.137290042,"z":4070269.4149197955},{"x":-2197569.1029706816,"y":4378652.121553422,"z":4070267.0046380106},{"x":-2197565.7817203705,"y":4378658.946877134,"z":4070261.492498726},{"x":-2197564.557473791,"y":4378661.463836942,"z":4070259.4595128056},{"x":-2197561.3375610504,"y":4378668.081264001,"z":4070254.1151497453},{"x":-2197560.181301412,"y":4378670.457292053,"z":4070252.1962880115},{"x":-2197559.9440765497,"y":4378670.94537839,"z":4070251.801954609},{"x":-2197556.6853151666,"y":4378677.643653793,"z":4070246.3920042706},{"x":-2197555.5212934213,"y":4378680.03472848,"z":4070244.461216323},{"x":-2197553.4144621263,"y":4378684.365517691,"z":4070240.9633117164},{"x":-2197551.445714318,"y":4378688.411004161,"z":4070237.696214136}];
var newP = cCesium.updateCartesianArrHeight(crr,{
z:7
});
var newP2 = cCesium.updateCartesianArrHeight(crr,{
z:2
});
var obj=new Object();
obj.width=20;
obj.material= ak_marker.getNearMaterial();//new Cesium.PolylineArrowMaterialProperty(Cesium.Color.YELLOW);
var lineInit=new geo_draw_line(obj);
lineInit.createLine(newP2);
var positions=lineInit.getPositions();
roamFly = new RoamFly(viewer, {
modelUrl: "",//weixin/datasource/Cesium_Man.glb
distance:0.055,
pitch:0,
modelSize:30
});
roamFly.crateByPositions(newP,5,9.2,2.5,true,false,ak_network_rotate.callBackTag);//Onground
roamFly.lockView(true);
// roamFly.viewToEntity();
},
//是否第一视角
onIsShowingChange:function(e){
if (ak_network_rotate.roamFly) {
ak_network_rotate.roamFly.lockView(e);
ak_network_rotate.roamFly.viewToEntity();
}
},
/**
* 获取范围
*/
getCameraView:function() {
var camera = viewer.camera;
var position = camera.position;
var heading = camera.heading;
var pitch = camera.pitch;
var roll = camera.roll;
var lnglat = Cesium.Cartographic.fromCartesian(position);
var x = Cesium.Math.toDegrees(lnglat.longitude);
var y = Cesium.Math.toDegrees(lnglat.latitude);
var z = lnglat.height;
var heading = heading;
var pitch = pitch;
var rool = roll;
var content = "x:"+x+",y:"+y+",z:"+z+",heading:"+heading+",pitch:"+pitch+",rool:"+rool;
console.log("当前范围:"+content);
// alert(content);
var objx={
x: Cesium.Math.toDegrees(lnglat.longitude),
y: Cesium.Math.toDegrees(lnglat.latitude),
z: lnglat.height,
heading: heading,
pitch: pitch,
rool:roll
};
console.log(objx);
return objx;
},
/**
* 设置范围
* @param {Object} obj
*/
setCameraView:function(obj) {
if (!obj) return;
var position = Cesium.Cartesian3.fromDegrees(obj.x, obj.y, obj.z);
viewer.camera.flyTo({
destination: position,
duration: obj.duration || 0,
complete: obj.complete,
orientation: {
heading:obj.heading,
pitch:obj.pitch,
roll:obj.roll
},
});
},
// 消息提示框
Alert:function(str) {
var msgw,msgh,bordercolor;
msgw=400;//提示窗口的宽度
msgh=80;//提示窗口的高度
titleheight=25 //提示窗口标题高度
bordercolor="#336699";//提示窗口的边框颜色
titlecolor="#99CCFF";//提示窗口的标题颜色
var sWidth,sHeight;
//获取当前窗口尺寸
sWidth = document.body.offsetWidth;
sHeight = document.body.offsetHeight;
// //背景div
var bgObj=document.createElement("div");
bgObj.setAttribute('id','alertbgDiv');
bgObj.style.position="absolute";
bgObj.style.top="0";
bgObj.style.background="#E8E8E8";
bgObj.style.filter="progid:DXImageTransform.Microsoft.Alpha(style=3,opacity=25,finishOpacity=75";
bgObj.style.opacity="0.6";
bgObj.style.left="0";
bgObj.style.width = sWidth + "px";
bgObj.style.height = sHeight + "px";
bgObj.style.zIndex = "10000";
document.body.appendChild(bgObj);
//创建提示窗口的div
var msgObj = document.createElement("div")
msgObj.setAttribute("id","alertmsgDiv");
msgObj.setAttribute("align","center");
msgObj.style.background="white";
msgObj.style.border="1px solid " + bordercolor;
msgObj.style.position = "absolute";
msgObj.style.left = "50%";
msgObj.style.font="12px/1.6em Verdana, Geneva, Arial, Helvetica, sans-serif";
msgObj.style.borderRadius="8px";
msgObj.style.overflow="hidden";
//窗口距离左侧和顶端的距离
msgObj.style.marginLeft = "-225px";
//窗口被卷去的高+(屏幕可用工作区高/2)-150
msgObj.style.top = document.body.scrollTop+(window.screen.availHeight/2)-150 +"px";
msgObj.style.width = msgw + "px";
msgObj.style.height = msgh + "px";
msgObj.style.textAlign = "center";
msgObj.style.lineHeight ="25px";
msgObj.style.zIndex = "10001";
document.body.appendChild(msgObj);
//提示信息标题
var title=document.createElement("h4");
title.setAttribute("id","alertmsgTitle");
title.setAttribute("align","left");
title.style.margin="0";
title.style.padding="3px";
title.style.background = bordercolor;
title.style.filter="progid:DXImageTransform.Microsoft.Alpha(startX=20, startY=20, finishX=100, finishY=100,style=1,opacity=75,finishOpacity=100);";
title.style.opacity="0.75";
title.style.border="1px solid " + bordercolor;
title.style.height="18px";
title.style.font="12px Verdana, Geneva, Arial, Helvetica, sans-serif";
title.style.color="white";
title.innerHTML="提示信息";
document.getElementById("alertmsgDiv").appendChild(title);
//提示信息
var txt = document.createElement("p");
txt.setAttribute("id","msgTxt");
txt.style.margin="16px 0";
txt.innerHTML = str;
document.getElementById("alertmsgDiv").appendChild(txt);
//设置关闭时间
window.setTimeout("ak_network_rotate.closewin()",2000);
},
closewin:function() {
document.body.removeChild(document.getElementById("alertbgDiv"));
document.getElementById("alertmsgDiv").removeChild(document.getElementById("alertmsgTitle"));
document.body.removeChild(document.getElementById("alertmsgDiv"));
}
}