如何根据以经纬度为界的形状确定面积?
How to determine area based on shape bounded by latitude and longitude?
给定近似 "rectangle" 以度数表示的某些纬度和经度值,使用通用 Java Geometry/Topology 库(例如 JTS(https://github.com/locationtech/jts), 求 近似 的矩形面积 meters/feet 平方?
假设:
- 矩形的面积上限为 ~300-500 公里^2
- 假设误差容差为 ~ +/- 500-1500 米^2
- 必须使用 Java (目前在 Java11)
- 任何常见的 Java Geo/GIS/Topology 库都是可以接受的
- 假设坐标将被限制在美国大陆内的区域
例子
下面是一个示例形状,它是一个覆盖公园所占区域的近似矩形:
您需要使用一个库来处理从球面角度到局部平面参考系统的重投影,以便您可以使用 JTS 进行计算。
这个 question on gis.stackexchange.com gives a longer general example of how to do this using the 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));
给定近似 "rectangle" 以度数表示的某些纬度和经度值,使用通用 Java Geometry/Topology 库(例如 JTS(https://github.com/locationtech/jts), 求 近似 的矩形面积 meters/feet 平方?
假设:
- 矩形的面积上限为 ~300-500 公里^2
- 假设误差容差为 ~ +/- 500-1500 米^2
- 必须使用 Java (目前在 Java11)
- 任何常见的 Java Geo/GIS/Topology 库都是可以接受的
- 假设坐标将被限制在美国大陆内的区域
例子
下面是一个示例形状,它是一个覆盖公园所占区域的近似矩形:
您需要使用一个库来处理从球面角度到局部平面参考系统的重投影,以便您可以使用 JTS 进行计算。
这个 question on gis.stackexchange.com gives a longer general example of how to do this using the 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));