(转)Arcgis for Js之GeometryService实现测量距离和面积

http://blog.csdn.net/gisshixisheng/article/details/40540601

距离和面积的测量时GIS常见的功能,在本节,讲述的是通过GeometryService实现测量面积和距离。先看看实现后的效果:

                                

距离                                                                                         面积

首先,进行配置:

[javascript] view plain copy

print?

  1. //identify proxy page to use if the toJson payload to the geometry service is greater than 2000 characters.
  2. //If this null or not available the project and lengths operation will not work.  Otherwise it will do a http post to the proxy.
  3. esriConfig.defaults.io.proxyUrl = "/proxy";
  4. esriConfig.defaults.io.alwaysUseProxy = false;

接着,定义GeometryService和绘图工具:

[javascript] view plain copy

print?

  1. var gsvc = new GeometryService("http://localhost:6080/arcgis/rest/services/Utilities/Geometry/GeometryServer");

[javascript] view plain copy

print?

  1. var measureToolbar = new esri.toolbars.Draw(map);

接下来,绘图结束后将所绘制图形添加到地图上面,并返回测量结果,那么增加measureToolbar的draw-end事件:

[javascript] view plain copy

print?

  1. measureToolbar.on("draw-end",showMeasureResults);
  2. /**
  3. * 显示测量结果
  4. * @param evt
  5. */
  6. var showPt=null;
  7. function showMeasureResults(evt){
  8. measureToolbar.deactivate();
  9. map.setMapCursor("default");
  10. var geometry = evt.geometry;
  11. switch (geometry.type) {
  12. case "polyline":{
  13. var length = geometry.paths[0].length;
  14. showPt = new Point(geometry.paths[0][length-1],map.spatialReference);
  15. var lengthParams = new LengthsParameters();
  16. lengthParams.lengthUnit = esri.tasks.GeometryService.UNIT_KILOMETER;
  17. lengthParams.polylines = [geometry];
  18. gsvc.lengths(lengthParams);
  19. break;
  20. }
  21. case "polygon":{
  22. showPt = new Point(geometry.rings[0][0],map.spatialReference);
  23. var areasAndLengthParams = new AreasAndLengthsParameters();
  24. areasAndLengthParams.lengthUnit = esri.tasks.GeometryService.UNIT_KILOMETER;
  25. areasAndLengthParams.areaUnit = esri.tasks.GeometryService.UNIT_SQUARE_KILOMETERS;
  26. gsvc.simplify([geometry], function(simplifiedGeometries) {
  27. areasAndLengthParams.polygons = simplifiedGeometries;
  28. gsvc.areasAndLengths(areasAndLengthParams);
  29. });
  30. break;
  31. }
  32. }
  33. var graphic = new Graphic(geometry, getGeometrySymbol(geometry.type));
  34. map.graphics.add(graphic);
  35. }

根据geometry的类型,增加GeometryService的lengths-complete或者areas-and-lengths-complete事件:

[javascript] view plain copy

print?

  1. gsvc.on("lengths-complete",outputLength);
  2. function outputLength(evtObj){
  3. var result = evtObj.result;
  4. showmeasureInfo(showPt, result.lengths[0].toFixed(3), "千米");
  5. };
  6. gsvc.on("areas-and-lengths-complete",outputAreaAndLength);
  7. function outputAreaAndLength(evtObj){
  8. var result = evtObj.result;
  9. showmeasureInfo(showPt, result.areas[0].toFixed(3), "平方千米");
  10. };

最后,将返回的结果显示在地图上:

[javascript] view plain copy

print?

  1. /**
  2. * 显示测量结果
  3. * @param showPnt
  4. * @param data
  5. * @param unit
  6. */
  7. function measureInfo(showPnt,data,unit){
  8. var measureDiv=$("#measure");
  9. var isShow = false;
  10. var screenPnt=map.toScreen(showPnt);
  11. measureDiv.css("left",screenPnt.x+"px");
  12. measureDiv.css("top",screenPnt.y+"px");
  13. measureDiv.css("position","absolute");
  14. measureDiv.css("height","20px");
  15. measureDiv.css("display","block");
  16. isShow = true;
  17. measureDiv.css("z-index","999");
  18. if(unit==="千米"){
  19. measureDiv.css("width","90px");
  20. }
  21. else{
  22. measureDiv.css("width","130px");
  23. }
  24. $("#result").html(data+unit);
  25. $("#infoclose").click(function(){
  26. map.graphics.clear();
  27. measureDiv.css("display","none");
  28. isShow = false;
  29. });
  30. map.on("pan-start", function(){
  31. measureDiv.css("display","none");
  32. });
  33. map.on("pan-end", function(panend){
  34. if(isShow == true){
  35. screenPnt=map.toScreen(showPnt);
  36. measureDiv.css("left",screenPnt.x+"px");
  37. measureDiv.css("top",screenPnt.y+"px");
  38. measureDiv.css("position","absolute");
  39. measureDiv.css("height","20px");
  40. measureDiv.css("display","block");
  41. }
  42. });
  43. map.on("zoom-start", function(){
  44. measureDiv.css("display","none");
  45. });
  46. map.on("zoom-end", function(){
  47. if(isShow == true){
  48. screenPnt=map.toScreen(showPnt);
  49. measureDiv.css("left",screenPnt.x+"px");
  50. measureDiv.css("top",screenPnt.y+"px");
  51. measureDiv.css("position","absolute");
  52. measureDiv.css("height","20px");
  53. measureDiv.css("display","block");
  54. }
  55. });
  56. };

结果的显示我是通过一个div来显示的,并且做了缩放和地图移动的处理。

时间: 2025-01-07 13:47:49

(转)Arcgis for Js之GeometryService实现测量距离和面积的相关文章

Arcgis for Js之GeometryService实现测量距离和面积

距离和面积的测量时GIS常见的功能,在本节,讲述的是通过GeometryService实现测量面积和距离.先看看实现后的效果:                                  距离                                                                                         面积 首先,进行配置: //identify proxy page to use if the toJson payload

OpenLayers测量距离和面积

<!DOCTYPE html> <html> <head> <title>测量距离和面积</title> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <meta name="viewport" content="width=device-width, initial-s

如何快速测量CAD图纸中的距离、面积

在繁忙的CAD绘图工作中,我们常常需要测量各种不同CAD图纸中的距离.面积.我们是否有更加方便的方法,一键操作快速测量CAD图纸中的距离.面积呢?当然有.如此方便的快速测量方法,大大提高我们绘图工作效率的同时,也减轻了我们的工作负担.今天小编就在此给大家具体演示一下.演示操作如下:打开测量距离.面积的CAD图纸1.先运行迅捷CAD编辑器建筑版,打开我们需要测量距离.面积的CAD图纸. 2.然后点击软件右侧工具选项板里的查询选项,调用出查询选项面板.测量距离1.我们点击查询--距离图标,调用查询距

Arcgis for Js实现graphiclayer的空间查询

本节讲的是Arcgis for Js的针对graphiclayer的空间查询,内容非常easy.代码例如以下: <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <meta name="viewport" content="initial-

arcgis for js开发之路径分析

arcgis for js开发之路径分析 //方法封装 function routeplan(x1, x2, y1, y2, barrierPathArray, isDraw, callback) { require([ "esri/symbol/SimpleLineSymbol", "esri/Color", "esri/tasks/RouteTask", "esri/tasks/FreatureSet", "es

Arcgis for Js之featurelayer实现空间查询和属性查询

空间查询和属性查询是常用的两种对数据的检索与查询方式,在本节,将讲述Arcgis for Js下如何实现featurelayer的这两种查询方式,先贴图给大家看看: 实现界面 属性查询 空间查询 看完了效果,下面说说我的实现思路. 首先,实现查询的关键是Query,属性查询时query.where来实现,空间查询时query.geometry来实现,具体代码如下: 1.属性查询 on(dom.byId("query"), "click", function(even

Arcgis for js之GP实现缓冲区计算

概述: GP服务的存在使得在Web端使用ArcGIS 提供的空间分析,而这些分析的能力是和桌面中的一样的.因此,是Arcgis for js的一个重点,也是一个难点.因此,在本文讲述如何发布并在代码中调用GP服务,实现缓冲区的分析计算. 简介: 框架介绍参考文章:http://www.cnblogs.com/HPhone/archive/2012/11/05/2755833.html 服务发布参考文章:http://www.cnblogs.com/HPhone/archive/2012/11/1

基于Arcgis for Js的web GIS数据在线采集简介

在前一篇博文"Arcgis for js之WKT和geometry转换"中实现了wkt和geometry之间的相互转化,博文原文地址为:http://blog.csdn.net/gisshixisheng/article/details/44057453.在本节,接上文,简单讲述基于Arcgis for Js的web GIS数据在线采集. 实现数据的在线采集,最主要的是数据的存储,即将采集到的数据的geometry对象保存下来,并后续可以转换为shp数据.在本文,我的处理方式为将前段绘

Arcgis for js,Openlayers中加载GeoJSON

概述: 在前文中,讲述了在JAVA环境下如何将shp转换为GeoJSON,在本文,分别讲述在Arcgis for js,Openlayers2和Openlayers3中加载展示GeoJSON. 实现: 1.Openlayers2中加载GeoJSON 在OL2中,可以直接调用OL2的借口实现GeoJSON的加载,代码示例: <!DOCTYPE html> <html> <head lang="en"> <meta charset="UT