一、添加依赖的Maven库:
<dependency> <groupId>net.sf.geographiclib</groupId> <artifactId>GeographicLib-Java</artifactId> <version>1.48</version> </dependency>
二、工具类实现:
package com.steven.gis.util; import net.sf.geographiclib.Geodesic; import net.sf.geographiclib.GeodesicData; import net.sf.geographiclib.PolygonArea; import net.sf.geographiclib.PolygonResult; /** * 使用GeographicLib来封装通用的GIS能力 * * @author liuzhuanghong * */ public class GeographicLibUtil { /** * 计算两个坐标点之间的距离,单位为米 * * @param srcLat * 起始点的纬度 * @param srcLon * 起始点的经度 * @param descLat * 目标点的纬度 * @param descLon * 目标点的经度 * @return 两个坐标点之间的距离,单位为米 */ public static double computeLengthWithGeographicLib(double srcLat, double srcLon, double descLat, double descLon) { double result = 0.0f; try { GeodesicData g = Geodesic.WGS84.Inverse(srcLat, srcLon, descLat, descLon); result = g.s12; } catch (Exception e) { e.printStackTrace(); } return result; } /** * @param coords * [纬度,经度]格式的数组 * @return 平方米 */ public static double computeAreaWithGeographicLib(double[][] coords) { double result = 0.0f; try { PolygonArea p = new PolygonArea(Geodesic.WGS84, false); int size = coords.length; for (int i = 0; i < size; i++) { p.AddPoint(coords[i][0], coords[i][1]); } PolygonResult r = p.Compute(); result = r.area; } catch (Exception e) { e.printStackTrace(); } return result; } }
三、测试代码:
package com.steven.gis.util; import org.junit.Test; import com.steven.gis.util.GeographicLibUtil; import net.sf.geographiclib.Geodesic; import net.sf.geographiclib.GeodesicData; import net.sf.geographiclib.PolygonArea; import net.sf.geographiclib.PolygonResult; /** * 测试使用封装了GeographicLib库的工具类 * * @author liuzhuanghong * */ public class TestGeographiclibArea { /** * 测试的数据 */ private static double[][] coords = { { 22.656304210485004, 114.06466523520893 }, { 22.651868529042016, 114.06466523520893 }, { 22.651868529042016, 114.06605998390202 }, { 22.656304210485004, 114.06605998390202 } }; /** * 没有使用封装的工具类实现 */ @Test public void computeWithGeographicLib() { System.out.println("=========================="); System.out.println("[没有使用封装的工具类实现]"); GeodesicData g = null; double distance = 0.0f; for (int i = 0; i < coords.length - 1; i++) { // System.out.println(coords[i][0] + "," + coords[i][1]); g = Geodesic.WGS84.Inverse(coords[i][0], coords[i][1], coords[i + 1][0], coords[i + 1][1]); distance = g.s12; System.out.println("第" + (i + 1) + "和第" + (i + 2) + "个点的距离是:" + distance + "米"); } g = Geodesic.WGS84.Inverse(coords[0][0], coords[0][1], coords[3][0], coords[3][1]); distance = g.s12; PolygonArea p = new PolygonArea(Geodesic.WGS84, false); for (int i = 0; i < coords.length; i++) { p.AddPoint(coords[i][0], coords[i][1]); } PolygonResult result = p.Compute(); System.out.println("节点数:" + result.num + ",总长度:" + result.perimeter + "米,面积:" + result.area + "平方米"); } /** * 使用封装的工具类计算面积 */ @Test public void testGeographicLibUtilArea() { System.out.println("=========================="); System.out.println("[使用封装的工具类计算面积]"); double areaResult = GeographicLibUtil.computeAreaWithGeographicLib(coords); System.out.println("使用工具类计算的面积是:" + areaResult + "平方米"); } /** * 使用封装的工具类计算两个点之间的距离 */ @Test public void testGeographicLibUtilLength() { System.out.println("=========================="); System.out.println("[使用封装的工具类计算长度]"); double distance = 0.0f; for (int i = 0; i < coords.length - 1; i++) { // System.out.println(coords[i][0] + "," + coords[i][1]); distance = GeographicLibUtil.computeLengthWithGeographicLib(coords[i][0], coords[i][1], coords[i + 1][0], coords[i + 1][1]); System.out.println("第" + (i + 1) + "和第" + (i + 2) + "个点的距离是:" + distance + "米"); } } }
测试代码运行效果如下:
========================== [没有使用封装的工具类实现] 第1和第2个点的距离是:491.2038282207398米 第2和第3个点的距离是:143.35724147447107米 第3和第4个点的距离是:491.2038282207398米 节点数:4,总长度:1269.1175338166026米,面积:70416.49471479654平方米 ========================== [使用封装的工具类计算面积] 使用工具类计算的面积是:70416.49471479654平方米 ========================== [使用封装的工具类计算长度] 第1和第2个点的距离是:491.2038282207398米 第2和第3个点的距离是:143.35724147447107米 第3和第4个点的距离是:491.2038282207398米