如何根据以经纬度为界的形状确定面积?

Posted

技术标签:

【中文标题】如何根据以经纬度为界的形状确定面积?【英文标题】:How to determine area based on shape bounded by latitude and longitude? 【发布时间】:2020-01-30 22:30:26 【问题描述】:

给定一个由某些以度数表示的纬度和经度值界定的近似“矩形”,使用 JTS(https://github.com/locationtech/jts) 等通用 Java 几何/拓扑库来查找 的最佳方法是什么?以米/英尺平方表示的矩形的近似面积?

假设:

矩形区域的上限约为 300-500 公里^2 假设误差容限为 ~ +/- 500-1500 米^2 必须使用 Java (目前在 Java11 上) 任何常见的 Java Geo/GIS/Topology 库都可以接受 假设坐标将被限制在美国大陆内的区域

示例

下面是一个示例形状,它是一个近似矩形,覆盖了公园所占据的区域:

【问题讨论】:

可以使用带有形状插件的开放 gis 吗?您需要从度到米/英尺的转换吗?因为仅仅找到坐标单位的区域是相当简单的,对吧? are = 长坐标差 * 宽坐标差? 有多种并发症。例如,对于一个球体,每度的米数在不同的纬度上会发生变化。正如您所指出的,在平面上查找矩形的面积是微不足道的。 【参考方案1】:

您需要使用可以处理从球面度重投影到局部平面参考系统的库,以便您可以使用 JTS 进行计算。

gis.stackexchange.com 上的 question 给出了一个更长的通用示例,说明如何使用 GeoTools 库来执行此操作。

由于您将问题限制在美国大陆,因此您遇到了一个更简单的问题,可以使用固定投影,例如美国国家地图集等面积 (EPSG:2163),这样的方法如下:

  private Measure<Double, Area> calcArea(Polygon p) 
    try 
      String code = "EPSG:2163";
      CoordinateReferenceSystem auto = CRS.decode(code);

      MathTransform transform = CRS.findMathTransform(DefaultGeographicCRS.WGS84, auto);

      Polygon projed = (Polygon) JTS.transform(p, transform);
      return Measure.valueOf(projed.getArea(), SI.SQUARE_METRE);
     catch (MismatchedDimensionException | TransformException | FactoryException e) 
      // TODO Auto-generated catch block
      e.printStackTrace();
    
    return Measure.valueOf(0.0, SI.SQUARE_METRE);
  

然后您可以使用类似 where polygon is a JTS Polygon in lat/lon 来调用它:

Unit<Area> sq_mile = USCustomary.MILE.multiply(USCustomary.MILE).asType(Area.class);
Unit<Area> sq_km = MetricPrefix.KILO(SI.METRE).multiply(MetricPrefix.KILO(SI.METRE)).asType(Area.class);

javax.measure.Quantity<Area> a = me.calcArea(polygon);
System.out.println(a);
System.out.println(a.to(sq_km));
System.out.println(a.to(sq_mile));

【讨论】:

以上是关于如何根据以经纬度为界的形状确定面积?的主要内容,如果未能解决你的问题,请参考以下文章

如何将括号发送到以括号为界的管道中?

Redis——GeoHash查找附近的人

10.Redis系列Redis的高级应用-GeoHash

如何通过经纬度确定位置 知道经纬度怎么查询实际地点?

arcmap应用经纬网后怎么将经纬度的标注文字旋转角度

ARCGIS 点要素经纬度