文档章节

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

gis之家
 gis之家
发布于 2016/06/23 11:41
字数 721
阅读 46
收藏 0

众所周知,使用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)

};

};

1

这里测距的算法有基于地理坐标系以及投影坐标系不同,有不同的计算公式来计算的;

测面的核心算法:

//******求三角形面积****

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之家(https://shop116521643.taobao.com/shop/view_shop.htm);

gis百度贴吧:gis开发联盟;

GIS毕业设计&项目承接群:238339408

© 著作权归作者所有

共有 人打赏支持
gis之家
粉丝 8
博文 48
码字总数 47386
作品 0
广州
前端工程师
私信 提问
用Tomcat8.5做Arcgis API for javascript的本地部署

step1:1从arcgis官网上下载Arcgis api for JavaScript 4.3 https://developers.arcgis.com/javascript/latest/guide/release-notes/ ps:前提是你需要有一个esri开发者账户否则不能下载。 st......

duxiuxiu
2017/05/18
0
0
Esri美国用户大会Q&A 之 ArcGIS Server未来发展

2012年Esri全球用户大会正在举行,登录其官方网站我们可以找到对于今年用户大会的问答(Q&A),其中包括了云、三维、ArcGIS Server、ArcGIS Desktop等众多内容。原文地址:http://events.esr...

长平狐
2012/11/28
370
0
vue地图可视化 ArcGIS篇(3)

ArcGIS for javascript开发心得 本次实例中采用ArcGIS for javascript3.24版本,由于版本3与4在API等存在较大区别,就不一一列举,详细区别看[官方解释] arcgis for js4.7版本能够自动创建l...

YJ在掘金
11/06
0
0
ArcGIS API for Javascript 2.X 离线部署(以2.6为例)

先在官网上ArcGIS API for JavaScript download page(需要有账户)下载最新的API:arcgisjsv26_api.zip( 点击直接下载)和 SDK: arcgisjsv26_sdk.zip(直接下载); 2. 将下载下来的 arcg...

回忆在昨天
2012/10/24
0
0
2017第十五届esri用户大会观感(二)——大会整体

上文初步介绍了大会的盛况以及笔者负责的Web App Builder for ArcGIS,本篇来讲讲大会整体观感。总体来说,我觉得本次大会的两大亮点可能不在产品技术本身。而是此次宣布的两大关于产品销售的...

胖胖雕
2017/10/31
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Ubuntu16.04下安装docker

[TOC] 本文开发环境为Ubuntu 16.04 LTS 64位系统,通过apt的docker官方源安装最新的Docker CE(Community Edition),即Docker社区版,是开发人员和小型团队的理想选择。 1. 开始安装 1.1 由于...

豫华商
今天
10
0
使用XShell工具密钥认证登录Linux系统

如果你是一名Linux运维,那么Linux服务器的系统安全问题,可能是你要考虑的,而系统登录方式有两种,密码和密钥。哪一种更加安全呢? 无疑是后者! 这里我为大家分享用Xshell利器使用密钥的方...

dragon_tech
今天
7
0
day178-2018-12-15-英语流利阅读-待学习

“真蛛奶茶”了解一下?蜘蛛也会产奶了 Lala 2018-12-15 1.今日导读 “蛋白质含量是牛奶的 4 倍,并有着更低的脂肪和含糖量”,听起来诱人又美味的并不是羊奶或豆奶,而是你可能打死都想不到...

飞鱼说编程
今天
12
0
npm WARN optional SKIPPING OPTIONAL DEPENDENCY: fsevents

场景重现 npm install --verbose 安装依赖的时,出现如下警告 强迫症患者表示不能接受 npm WARN optional SKIPPING OPTIONAL DEPENDENCY: fsevents@1.2.4 (node_modules\fsevents):npm WARN......

taadis
今天
2
0
OSChina 周六乱弹 —— 你一口我一口多咬一口是小狗

Osc乱弹歌单(2018)请戳(这里) 【今日歌曲】 @达尔文 :分享Roy Orbison的单曲《She's a Mystery to Me》 《She's a Mystery to Me》- Roy Orbison 手机党少年们想听歌,请使劲儿戳(这里...

小小编辑
今天
464
6

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部