免费视频|新人指南|投诉删帖|广告合作|地信网APP下载

查看: 3591|回复: 5
收起左侧

[二次开发] arcgis api for js共享干货系列之一自写算法实现地图量算工具

[复制链接]

45

主题

8272

铜板

17

好友

高级工程师

Rank: 9Rank: 9Rank: 9

积分
1122
QQ
发表于 2016-6-23 11:16 | 显示全部楼层 |阅读模式
本帖最后由 sinna 于 2016-6-23 11:20 编辑

众所周知,使用arcgis api for js实现地图的量算工具功能,无非是调用arcgisserver的Geometry服务(http://localhost:6080/arcgis/rest/services/Utilities/Geometry/GeometryServer)提供的Areas and Lengths以及Lengths,如图:
1.png

但是我这里提供另一种实现的思路,就是自己写算法来实现距离以及面积的量算,这样的好处是不依赖arcgisserver几何服务,有些项目不排除有些奇特的客户不用Geometry服务的,最终的实现效果图如下:
2.jpg

具体实现思路:创建一个独立的js文件,里面有量算工具类DCIMeature,DCIMeature类构造函数传入地图对象map
construct: function (map) {      this._dciMap = map;  
    this._onClickHandler = dojo.hitch(this, this._onClickHandler);
    this._onMouseMoveHandler = dojo.hitch(this, this._onMouseMoveHandler);  
    this._onDrawEndHandler = dojo.hitch(this, this._onDrawEndHandler);   
    this._onExtentChangeHandler = dojo.hitch(this, this._onExtentChangeHandler);
    this._onGraphicClearHandler = dojo.hitch(this, this._onGraphicClearHandler);
     this._graphicsLayer = new esri.layers.GraphicsLayer({ id: "DciMeatureGLyr" });  
}  

核心算法测距:
DUtil.getDistanceInEarth = function (point1, point2) {  var d = new Number(0);

//1度等于0.0174532925199432957692222222222弧度  
//var radPerDegree=0.0174532925199432957692222222222;
var radPerDegree = Math.PI / 180.0;
if (DCI.Measure.map.spatialReference.wkid == "4326") {
var latLength1 = Math.abs(this.translateLonLatToDistance({ x: point1.x, y: point2.y }).x - this.translateLonLatToDistance({ x: point2.x, y: point2.y }).x);
var latLength2 = Math.abs(this.translateLonLatToDistance({ x: point1.x, y: point1.y }).x - this.translateLonLatToDistance({ x: point2.x, y: point1.y }).x);
  var lonLength = Math.abs(this.translateLonLatToDistance({ x: point1.x, y: point2.y }).y - this.translateLonLatToDistance({ x: point1.x, y: point1.y }).y);   d = Math.sqrt(Math.pow(lonLength, 2) - Math.pow(Math.abs(latLength1 - latLength2) / 2, 2) + Math.pow(Math.abs(latLength1 - latLength2) / 2 + Math.min(latLength1, latLength2), 2));
     }
else {
var len_prj = Math.pow((point2.x - point1.x), 2) + Math.pow((point2.y - point1.y), 2);
  d = Math.sqrt(len_prj);  
    }  
    d = Math.ceil(d);  return d;  
};  
DUtil.translateLonLatToDistance = function (point) {
  var d = new Number(0);
//1度等于0.0174532925199432957692222222222弧度
//var radPerDegree=0.0174532925199432957692222222222;
var radPerDegree = Math.PI / 180.0;
var equatorialCircumference = Math.PI * 2 * 6378137;
return {
          x: Math.cos(point.y * radPerDegree) * equatorialCircumference * Math.abs(point.x / 360),
         y: equatorialCircumference * Math.abs(point.y / 360)      };
};
  
这里测距的算法有基于地理坐标系以及投影坐标系不同,有不同的计算公式来计算的;
测面的核心算法:
//******求三角形面积****  

DUtil.getTriangleArea = function (point1, point2, point3) {
     var area = 0;   
   if (!point1 || !point2 || !point3) {
         return 0;
     }  
    if (DCI.Measure.map.spatialReference.wkid == "4326") {  
          point1 = this.translateLonLatToDistance(point1);  
        point2 = this.translateLonLatToDistance(point2);
        point3 = this.translateLonLatToDistance(point3);  
    }  
    area = ((point1.x * point2.y - point2.x * point1.y) + (point2.x * point3.y - point3.x * point2.y) + (point3.x * point1.y - point1.x * point3.y)) / 2;      return area;
  };  

测面算法也是类似,基于地理坐标系以及投影坐标系不同,有不同的计算公式来计算的;
完整的量算工具js文件下载点击打开链接

GIS作品展示地址:百度搜索:GIS之家


0

主题

1万

铜板

0

好友

高级工程师

Rank: 9Rank: 9Rank: 9

积分
732
发表于 2016-6-24 10:18 | 显示全部楼层
从api3.13版时就增加了esri/geometry/geometryEngine
Geometry服务能做到的事
geometryEngine几乎都可以做到
回复 支持 反对

使用道具 举报

6

主题

4172

铜板

2

好友

至尊VIP

Rank: 24Rank: 24Rank: 24Rank: 24Rank: 24Rank: 24

积分
325
发表于 2018-12-30 09:22 | 显示全部楼层
啊哦,你来晚了,分享的文件已经被取消了,下次要早点哟
回复 支持 反对

使用道具 举报

0

主题

1684

铜板

1

好友

高级工程师

Rank: 9Rank: 9Rank: 9

积分
643
发表于 2022-2-16 11:02 | 显示全部楼层
感谢分享
回复

使用道具 举报

37

主题

2万

铜板

111

好友

钻石会员

Rank: 26Rank: 26Rank: 26Rank: 26Rank: 26Rank: 26Rank: 26

积分
5763
发表于 2022-2-22 16:24 | 显示全部楼层
谢谢分享,看看
回复 支持 反对

使用道具 举报

1

主题

1万

铜板

2

好友

黄金会员

Rank: 23Rank: 23Rank: 23Rank: 23Rank: 23Rank: 23Rank: 23

积分
5265
发表于 2022-12-8 15:34 | 显示全部楼层
谢谢楼主分享
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

在线客服
快速回复 返回顶部 返回列表