java 判断经纬度_Java中根据经纬度来判断距离
时间: 2023-08-04 22:02:40 浏览: 152
在Java中,可以使用以下公式来计算两个经纬度坐标之间的距离:
```
double radLat1 = Math.toRadians(lat1);
double radLat2 = Math.toRadians(lat2);
double a = radLat1 - radLat2;
double b = Math.toRadians(lng1) - Math.toRadians(lng2);
double s = 2 * Math.asin(Math.sqrt(Math.pow(Math.sin(a/2),2) +
Math.cos(radLat1)*Math.cos(radLat2)*Math.pow(Math.sin(b/2),2)));
s = s * 6371;// 地球半径,单位公里
s = Math.round(s * 10000d) / 10000d;// 保留小数点后四位
```
其中,`lat1`、`lng1`、`lat2`、`lng2`分别表示两个经纬度坐标的纬度和经度。
这个公式的原理是通过计算两点之间的弧长来求得两点之间的距离,其中使用了地球半径作为常量。需要注意的是,这个公式计算出来的距离是直线距离,不考虑地球表面的曲率,因此在实际应用中可能会有一定的误差。
相关问题
java 判断经纬度_java实现判断一个经纬度坐标是否在一个多边形内(经自己亲测)...
要判断一个经纬度坐标是否在一个多边形内,可以使用Java的GIS相关的库,如GeoTools等。下面是一个基于GeoTools的实现示例:
```java
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import org.geotools.geometry.jts.JTSFactoryFinder;
import org.geotools.referencing.CRS;
import org.locationtech.jts.geom.Coordinate;
import org.locationtech.jts.geom.Geometry;
import org.locationtech.jts.geom.GeometryFactory;
import org.locationtech.jts.geom.Point;
import org.locationtech.jts.geom.Polygon;
import org.opengis.referencing.FactoryException;
import org.opengis.referencing.crs.CoordinateReferenceSystem;
import org.opengis.referencing.operation.MathTransform;
import org.opengis.referencing.operation.TransformException;
public class PolygonUtil {
/**
* 判断点是否在多边形内
*
* @param lon 经度
* @param lat 纬度
* @param polygonCoords 多边形顶点坐标列表,顺序为顺时针或逆时针
* @param polygonSRID 多边形坐标系的SRID
* @return true表示点在多边形内,false表示不在
*/
public static boolean isPointInPolygon(double lon, double lat, List<double[]> polygonCoords, int polygonSRID) {
try {
// 创建多边形的JTS几何对象
GeometryFactory geometryFactory = JTSFactoryFinder.getGeometryFactory(null);
Coordinate[] coords = new Coordinate[polygonCoords.size()];
for (int i = 0; i < polygonCoords.size(); i++) {
double[] coord = polygonCoords.get(i);
coords[i] = new Coordinate(coord[0], coord[1]);
}
Polygon polygon = geometryFactory.createPolygon(coords);
// 创建点的JTS几何对象
Point point = geometryFactory.createPoint(new Coordinate(lon, lat));
// 获取多边形和点的坐标系
CoordinateReferenceSystem polygonCRS = CRS.decode("EPSG:" + polygonSRID);
CoordinateReferenceSystem pointCRS = CRS.decode("EPSG:4326"); // WGS84经纬度坐标系
MathTransform transform = CRS.findMathTransform(pointCRS, polygonCRS);
// 将点的坐标系转换为多边形的坐标系
Point transformedPoint = (Point) org.geotools.geometry.jts.JTS.transform(point, transform);
// 判断点是否在多边形内
return transformedPoint.within(polygon);
} catch (FactoryException | TransformException e) {
e.printStackTrace();
return false;
}
}
public static void main(String[] args) throws IOException {
List<double[]> polygonCoords = new ArrayList<>();
polygonCoords.add(new double[] { 116.35886, 39.89931 });
polygonCoords.add(new double[] { 116.36315, 39.89354 });
polygonCoords.add(new double[] { 116.37324, 39.89805 });
polygonCoords.add(new double[] { 116.36795, 39.90383 });
polygonCoords.add(new double[] { 116.35886, 39.89931 });
boolean inPolygon = PolygonUtil.isPointInPolygon(116.364, 39.896, polygonCoords, 4326);
System.out.println(inPolygon); // true
inPolygon = PolygonUtil.isPointInPolygon(116.373, 39.896, polygonCoords, 4326);
System.out.println(inPolygon); // false
}
}
```
注意事项:
- 多边形顶点坐标列表的顺序要按照顺时针或逆时针方向排列,否则会得到错误的结果。
- 多边形坐标系的SRID要与经纬度坐标系的SRID不同,否则可能会得到错误的结果。
- 由于GeoTools的性能较低,处理大量数据时可能会较慢。如果需要高性能的GIS库,可以考虑使用JTS或Spatial4j等。
java根据距离算经纬度_java 根据两点经纬度来算距离
Java中可以使用Haversine公式来计算两点之间的距离,公式如下:
```
public static final double R = 6371; // 地球半径,单位为km
public static double distance(double lat1, double lng1, double lat2, double lng2) {
double dLat = Math.toRadians(lat2 - lat1);
double dLng = Math.toRadians(lng2 - lng1);
double a = Math.sin(dLat / 2) * Math.sin(dLat / 2) + Math.cos(Math.toRadians(lat1))
* Math.cos(Math.toRadians(lat2)) * Math.sin(dLng / 2) * Math.sin(dLng / 2);
double c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a));
double distance = R * c;
return distance;
}
```
其中,lat1和lng1为第一个点的纬度和经度,lat2和lng2为第二个点的纬度和经度,distance为两点之间的距离。
需要注意的是,这里使用的是球面距离,也就是在地球上沿着曲面的距离,所以计算出来的距离只是一个近似值,不是精确值。如果需要更精确的距离,可以使用Vincenty公式或其他更复杂的算法。
阅读全文