Как определить площадь на основе формы, ограниченной широтой и долготой? - PullRequest
0 голосов
/ 31 января 2020

Учитывая приблизительный «прямоугольник», ограниченный определенными значениями широт и долгот, выраженными в градусах, что было бы наилучшим способом, используя обычную Java библиотеку геометрии / топологии, такую ​​как JTS (https://github.com/locationtech/jts ), чтобы найти приблизительную площадь прямоугольника, выраженную в метрах / футах в квадрате?

Допущения:

  • Площадь прямоугольника будет иметь верхнюю границу ~ 300-500 километров ^ 2
  • При допуске на ошибку ~ +/- 500-1500 метров ^ 2
  • Необходимо использовать Java (в настоящее время на Java11)
  • Любая распространенная Java Библиотека Geo / GIS / Topology допустимо
  • Предположим, что координаты будут ограничены областями в пределах континентальной части США.

Пример

Ниже приведен пример формы, которая приблизительный прямоугольник, покрывающий площадь, занимаемую парком: Example Shape

1 Ответ

1 голос
/ 01 февраля 2020

Вам необходимо использовать библиотеку, которая может обрабатывать перепроецирование от сферических степеней в локально плоскую систему отсчета, чтобы вы могли использовать JTS для выполнения расчетов.

Этот вопрос на gis.stackexchange.com дает более общий общий пример того, как это сделать с помощью библиотеки 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);
  }

Затем вы можете назвать это как-то так, где polygon - это JTS Polygon в широте / долготе:

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));
...