cesium绘制多边形重叠不规则问题,并返回矩形经纬度及⾯积
cesium+turf解决绘制多边形不规则问题
思路:绘制多边形时,使⽤移动点与已确定点的开始点及结束点组成两条线,使⽤turf的lineInterct判断这两天线与已确定线是否有
交点,由于开始点与结束点时共同点,所以判断交点是否⼤于1,有交点则多边形不规则,不允许绘制。
turf有booleanCross可以判断是否有焦点,但是我在使⽤的时候发现有交点的两条线也返回fal,所以使⽤了lineInterct
代码如下:
//绘制多边形
functiondrawPolygon(whetherStart){
if(viewer){
if(whetherStart){
letwhetherPoint=true
//清除以前
removeEntityByName('drawPolygon')
removeEntityByName('drawPolygonPoint')
varactiveShapePoints=[];//点
varactiveShape;//动态图形
varfloatingPoint;
utAction(function(movement){
constearthPosition=lipsoid(on,oid);//当前世界坐标笛卡尔积
if(d(earthPosition)){
if(whetherPoint){//是否可以点点
if(===0){//没有点/开始绘制
floatingPoint=createPoint(earthPosition);//绘制点
(earthPosition);//添加点
vardynamicPositions=ckProperty(function(){//使⽤callback,activeShapePoints变化会重新⽣成新的多边形并绘制
nHierarchy(activeShapePoints);
},fal);
activeShape=drawShape(dynamicPositions);//绘制多边形
}
(earthPosition);
createPoint(earthPosition);
}el{
('请绘制规则多边形!')
}
}
},_CLICK);
utAction(function(movement){
if(d(floatingPoint)){
//varnewPosition=sition(ition);
constnewPosition=lipsoid(ition,oid);//当前世界坐标笛卡尔积
if(d(newPosition)){
ue(newPosition);//更新点坐标
();//取出最后⼀个动态点
(newPosition);//添加新的动态点
if(>2){
//判断多边形是否合法
//取出最后两个点是结束线
constendLine=[shijieToLon(activeShapePoints[-1]),shijieToLon(activeShapePoints[-2]
//最后⼀个点和第⼀个点是开始线
conststartLine=[shijieToLon(activeShapePoints[-1]),shijieToLon(activeShapePoints['0'])]
//去掉最后⼀个点是已完成的线
constallLine=[]
h(item=>{
(shijieToLon(item))
(shijieToLon(item))
})
()//去掉最后⼀个点
varline1=ring(allLine);
varline2=ring(startLine);
varline3=ring(endLine);
varstartIntercts=terct(line1,line2);
varendIntercts=terct(line1,line3);
('交点:',es)
('交点:',es)
if(>1||>1){
whetherPoint=fal
}el{
whetherPoint=true
}
}
}
}
},_MOVE);
//重新绘制形状,使其不是动态的,然后删除动态形状。
functionterminateShape(){
();//去处最后⼀个
drawShape(activeShapePoints);
(floatingPoint);//动态点
(activeShape);//动态图层
floatingPoint=undefined;
activeShape=undefined;
activeShapePoints=[];
}
returnnewPromi((resolve,reject)=>{
utAction(function(event){
InputAction(_MOVE);//停⽌监听移动事件
InputAction(_CLICK);//停⽌监听移动事件
//resolve(activeShapePoints)
constdata=[]//经纬度数组
h(item=>{
(shijieToLon(item))
})
()//去掉最后⼀个重复点
constareaData=[...data,data['0']]//⾯积数组
varpolygon=n([areaData]);
//⾯积(m²)
vararea=(polygon);
constresolveData={
coordinates:data,
area:area,
}
resolve(resolveData)
terminateShape();
},_CLICK);
})
}el{
removeEntityByName('drawPolygon')
removeEntityByName('drawPolygonPoint')
InputAction(_MOVE);//停⽌监听移动事件
InputAction(_CLICK);//停⽌监听移动事件
}
}
}
//绘制点
functioncreatePoint(worldPosition){
varpoint=({
name:'drawPolygonPoint',
position:worldPosition,
position:worldPosition,
point:{
color:,
pixelSize:5,
heightReference:_TO_GROUND,
},
});
returnpoint;
}
//世界坐标转经纬度
functionshijieToLon(newPosition){
constcarto_position=rtesian(newPosition);
constlongitude=ees(carto_ude);//四舍五⼊保留三位⼩数
constlatitude=ees(carto_de);
return[longitude,latitude]
}
//绘制多边形
functiondrawShape(positionData){
({
name:'drawPolygon',
polygon:{
hierarchy:positionData,
material:aterialProperty(
pha(0.7)
),
},
});
}
//根据name删除实体
functionremoveEntityByName(value){
//清除之前的实体
constentitys=es._entities._array;
letlength=
//倒叙遍历防⽌实体减少之后entitys[f]不存在
for(letf=length-1;f>=0;f--){
if(entitys[f]._name&&entitys[f]._name===value){
(entitys[f]);
}
}
}
本文发布于:2023-01-03 09:53:23,感谢您对本站的认可!
本文链接:http://www.wtabcd.cn/fanwen/fan/90/83677.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |