使用geographiclib实现GIS的长度和面积计算

一、添加依赖的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米

  

 

转载于:https://www.cnblogs.com/stevensz7/p/7354926.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值