开发者社区> 杰克.陈> 正文
阿里云
为了无法计算的价值
打开APP
阿里云APP内打开

arcgis api for js共享干货系列之一自写算法实现地图量算工具

简介: 原文:arcgis api for js共享干货系列之一自写算法实现地图量算工具 众所周知,使用arcgis api for js实现地图的量算工具功能,无非是调用arcgisserver的Geometry服务(http://localhost:6080/arcgis/rest/services/U...
+关注继续查看
原文:arcgis api for js共享干货系列之一自写算法实现地图量算工具

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

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

具体实现思路:创建一个独立的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文件下载点击打开链接

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
ArcGIS将Python代码脚本创建为工具箱、自定义工具
本文介绍在ArcMap软件中,通过已有的Python脚本程序,建立新的工具箱并在其中设置自定义工具的方法~
0 0
ArcGIS配置OSM数据工具ArcGIS Editor for OSM的方法
本文介绍ArcGIS Editor for OpenStreetMap这一工具集插件的下载与安装方法~
0 0
【数据工具】ArcGIS批量出图工具箱
【数据工具】ArcGIS批量出图工具箱
0 0
ArcGIS工具之ET GeoWizards、GeoTools、GeoTools
简介 ET GeoWizards是ET SpatialTechniques一套基于ArcGIS的工具集,从2002年开始,其设计的初衷: (1)让ArcView用户拥有ArcEditor甚至ArcInfo许可的功能,降低成本; (2)简化ArcGIS数据操作和空间分析流程,让非专业人员高效完成相关操作。
1016 0
ArcGIS制图之Subset工具点抽稀
制图工作中,大量密集点显示是最常遇到的问题。其特点是分布可能不均匀、数据点比较密集,容易造成空间上的重叠,影响制图美观。那么,如果美观而详细的显示制图呢? Subset Features(子集要素)工具是 ArcGIS 地统计分析模块的一个工具,该工具可将数据按照百分比进行抽稀,生成两个结果数据集,一个是抽稀后保留的数据,另一个是互补的那一部分数据。
919 0
ArcGIS API For JavaScript官方文档(六)之设置范围
ArcGIS API For JavaScript官方文档(六)之设置范围
0 0
+关注
杰克.陈
一个安静的程序猿~
文章
问答
文章排行榜
最热
最新
相关电子书
更多
编程语言如何演化—— 以 JS 的 private 为例
立即下载
编程语言如何演化-以JS的private为例
立即下载
JS 语言在引擎级别的执行过程
立即下载