如何在Java中将纬度和经度转换为东北坐标?
我假设你是指英国 OSGB 东方坐标和北方坐标。这个问题背后的三角函数很有趣,但是你可以使用JCoord库来完成,它会让它变得容易(虽然需要相当多的CPU)。
关于@DD下面的评论,需要注意JCoord的一点是,在从Easting / Northing转换为Lat / Long(经度/纬度)以及反向转换时,必须确保使用正确的基准面(datum)。
采用@DD的代码:
LatLng latLng = new OSRef(394251,806376).toLatLng();
这将返回使用OSGB36基准的经纬度,即英国地图上使用的“平面地球”近似值。这与大多数应用程序(包括Streetmap)使用的WSG84基准显著不同,WSG84模拟了世界的球形(或多或少)。
要转换为WGS84经纬度,您需要明确指定:
LatLng latLng = new OSRef(394251,806376).toLatLng();
latLng.toWGS84();
这将把纬度和经度调整到正确的基准面。
请注意,OsRef.toLatLng()
的javadoc非常清楚:
使用OSGB36基准面将此OSGB网格参考转换为纬度/经度对。请注意,根据应用程序需要,可能需要将LatLng对象转换为WGS84基准面。
坐标基准面之间的转换并不简单。如果看起来很简单,那么你可能做错了。
尝试使用GeoTools:
CRSAuthorityFactory crsFac = ReferencingFactoryFinder
.getCRSAuthorityFactory("EPSG", null);
CoordinateReferenceSystem wgs84crs = crsFac
.createCoordinateReferenceSystem("4326");
CoordinateReferenceSystem osgbCrs = crsFac
.createCoordinateReferenceSystem("27700");
CoordinateOperation op = new DefaultCoordinateOperationFactory()
.createOperation(osgbCrs, wgs84crs);
DirectPosition eastNorth = new GeneralDirectPosition(easting, northing);
DirectPosition latLng = op.getMathTransform().transform(eastNorth,
eastNorth);
double latitude=latLng.getOrdinate(0);
double longitude=latLng.getOrdinate(1);
<dependency>
<groupId>org.geotools</groupId>
<artifactId>gt-main</artifactId>
<version>${geotools.version}</version>
</dependency>
<dependency>
<groupId>org.geotools</groupId>
<artifactId>gt-epsg-hsql</artifactId>
<version>${geotools.version}</version>
</dependency>
<dependency>
<groupId>org.geotools</groupId>
<artifactId>gt-xml</artifactId>
<version>${geotools.version}</version>
</dependency>
import uk.gov.dstl.geo.osgb.Constants;
import uk.gov.dstl.geo.osgb.EastingNorthingConversion;
import uk.gov.dstl.geo.osgb.OSGB36;
// ...
//Convert from Easting and Northing into Cartesian Coordinates (LatLon)
double[] latlonOSGB38 = EastingNorthingConversion.toLatLon(
new double[]{ easting, northing },
Constants.ELLIPSOID_AIRY1830_MAJORAXIS,
Constants.ELLIPSOID_AIRY1830_MINORAXIS,
Constants.NATIONALGRID_N0,
Constants.NATIONALGRID_E0,
Constants.NATIONALGRID_F0,
Constants.NATIONALGRID_LAT0,
Constants.NATIONALGRID_LON0);
//Convert from LatLon (OSGB) to WGS84
double[] latlonWGS84 = OSGB36.toWGS84(latlonOSGB38[0], latlonOSGB38[1]);