turf

更新时间:2023-01-03 09:53:23 阅读: 评论:0


2023年1月3日发(作者:等比数列的通项公式)

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小时内删除。

上一篇:baton
下一篇:refit
标签:turf
相关文章
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图