GIS面积计算问题

本文介绍了在GIS项目中计算火星坐标系下面积的方法,涉及ArcGIS的DLL使用,以及解决点过多导致计算失败的问题。文章提出了通过取商和余数的方式优化点的数量,使其接近180,同时强调了点的排序重要性,确保计算的准确性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

好长时间不更新了,今天说点干货,项目用到的。

1、项目中要用到计算面积的,根据火星坐标;

2、百度找了各种面积计算,google了半天,也没发现那个比较准确;

直接说干货吧。咱也高大上一会,用 ArcGIS

需要的dll有 ESRI.ArcGIS.Client.Toolkit.dll 和 ESRI.ArcGIS.Client.dll 这两个dll即可,不需要那么多的dll,可到官网下载,也可以到dll之家下载(http://www.dllzj.com/ESRI.ArcGIS.Client.dll/

计算面积的代码,这个代码比较简单

 GeometryService geometryService = new GeometryService("http://tasks.arcgisonline.com/ArcGIS/rest/services/Geometry/GeometryServer");
 Polygon polygon = new Polygon();
 polygon.SpatialReference = new SpatialReference(4326);//球面坐标
 PointCollection GPSpoints = new PointCollection();//保存84坐标的集合
 for (int i = 0; i < arraytemp.Count; i++)
 {
   JArray arraystr = (JArray)JsonConvert.DeserializeObject(arraytemp[i].ToString());
   GPSpoints.Add(new MapPoint(Convert.ToDouble(arraystr[0].ToString()), Convert.ToDouble(arraystr[1].ToString())));
 }
  polygon.Rings.Add(GPSpoints);

 Graphic graphic = new Graphic();
 graphic.Geometry = polygon;
 IList<Graphic> graphicList = new List<Graphic>(); //构建参数
 graphicList.Add(graphic);
 graphicList = geometryService.Project(graphicList, new SpatialReference(102100));//执行转换
 var args = geometryService.AreasAndLengths(graphicList, LinearUnit.Meter, LinearUnit.Meter, CalculationType.Geodesic);//Geodesic 采用球面面积计算方式 102113
 area = args.Areas[0];

 说下其中的注意点,其中4326指的84坐标,但是国内的地图一般都是火星坐标(腾讯和高德,百度更闹心,直接是自己的坐标),就是加了偏移量的,具体的84坐标和火星坐标的转化,这个可能比较常见,代码如下

        public static string BAIDU_LBS_TYPE = "bd09ll";

        public static double pi = 3.1415926535897932384626;
        public static double a = 6378245.0;
        public static double ee = 0.00669342162296594323;

        /**
         * 84 to 火星坐标系 (GCJ-02) World Geodetic System ==> Mars Geodetic System
         * 
         * @param lat
         * @param lon
         * @return
         */
        public static Gps gps84_To_Gcj02(double lat, double lon)
        {
            if (outOfChina(lat, lon))
            {
                return null;
            }
            double dLat = transformLat(lon - 105.0, lat - 35.0);
            double dLon = transformLon(lon - 105.0, lat - 35.0);
            double radLat = lat / 180.0 * pi;
            double magic = Math.Sin(radLat);
            magic = 1 - ee * magic * magic;
            double sqrtMagic = Math.Sqrt(magic);
            dLat = (dLat * 180.0) / ((a * (1 - ee)) / (magic * sqrtMagic) * pi);
            dLon = (dLon * 180.0) / (a / sqrtMagic * Math.Cos(radLat) * pi);
            double mgLat = lat + dLat;
            double mgLon = lon + dLon;
            return new Gps(mgLat, mgLon);
        }

        /**
         * * 火星坐标系 (GCJ-02) to 84 * * @param lon * @param lat * @return
         * */
        public static Gps gcj_To_Gps84(double lat, double lon)
        {
            Gps gps = transform(lat, lon);
            double lontitude = lon * 2 - gps.getWgLon();
            double latitude = lat * 2 - gps.getWgLat();
            return n
### 如何在 GIS计算栅格面积 #### 方法概述 在地理信息系统 (GIS) 中,计算栅格面积是一个常见需求。由于栅格数据是由像素组成的二维网格结构,因此可以通过多种方法实现面积的统计和计算。以下是几种常用的技术及其对应的工具。 --- #### 利用 ArcGIS 统计面要素内的栅格面积 ArcGIS 提供了一种高效的方式对面要素范围内的栅格数据进行面积统计。具体来说,可以先使用 **Extract by Mask** 或者 **Clip** 工具将感兴趣区域提取出来,然后再基于该区域内每个唯一值(类别)的像素数量乘以其分辨率平方得到总面积[^2]。 对于多类别的栅格数据而言,还可以进一步借助 Python 脚本或者字段计算器完成自动化流程: ```python import arcpy # 定义输入参数 in_raster = "path_to_your_raster" mask_feature = "path_to_mask_polygon" # 使用 Extract by Mask 工具裁剪栅格 arcpy.sa.ExtractByMask(in_raster, mask_feature).save("clipped_raster") # 获取像元大小并计算每种类别覆盖的总像素数 cell_size = float(arcpy.GetRasterProperties_management(in_raster, "CELLSIZEX").getOutput(0)) unique_values = set([row[0] for row in arcpy.da.SearchCursor("clipped_raster", ["Value"])]) area_dict = {} for value in unique_values: query = f'"Value" = {value}' count = int(arcpy.GetCount_management( arcpy.SelectLayerByAttribute_management("clipped_raster", "NEW_SELECTION", query)).getOutput(0)) area_dict[value] = count * cell_size**2 print(area_dict) ``` 上述脚本实现了按类别分类汇总各部分所占实际地面面积的功能。 --- #### 借助 R 语言读取与处理栅格数据 除了商业软件外,也可以采用免费开源的语言——R 来执行类似的运算任务。`raster` 包作为专门针对空间数据分析设计的一个扩展模块,在这方面表现尤为突出[^3]。 下面展示一段简单的示范程序说明如何加载指定路径下的 TIFF 文件,并求解其中某一层次下所有有效数值占据的空间比例关系: ```R library(raster) # 加载目标影像至内存环境之中 img <- raster("example.tif") # 查看基本信息确认行列尺寸以及坐标系定义情况 summary(img) # 如果存在掩膜边界条件,则需先行应用 crop/cutout 函数限定作用域后再继续后续步骤 masked_img <- mask(img, extent(c(xmin=..., xmax=..., ymin=..., ymax=...))) # 计算单个像元代表的真实世界单位长度距离 res_x <- res(masked_img)[1]; res_y <- abs(res(masked_img)[2]) # 对整幅画面按照不同等级分组累加各自贡献份额 zones <- zonal(values(masked_img), zones=values(masked_img), fun="sum") areas <- as.data.frame(zones$extract * (res_x*res_y)) colnames(areas) <- c('Class', 'Area') head(areas) ``` 此段代码片段展示了从导入原始资料到最终输出各类别占地面积表格的整体逻辑链条。 --- #### 数据来源的影响因素考虑 值得注意的是,不同的栅格数据生成途径可能会影响最后得出的结果精度。例如来源于遥感卫星拍摄的照片往往具有较高的分辨率;而经由纸质地图数字化后的产物则相对粗糙一些。此外还有诸如投影变换过程中可能出现的比例失真等问题都需要提前加以注意以便采取适当措施校正偏差[^4]。 --- ### 结论 综上所述,无论是通过专业的桌面应用程序还是编程接口都可以方便快捷地达成对给定范围内栅格单元总计覆盖面积的有效评估目的。选择合适自己的方案取决于项目规模、预算限制和个人偏好等因素综合考量之后再做决定即可。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值