将坐标从 EPSG 3857 转换为 4326
Converting coordinates from EPSG 3857 to 4326
我的数据库中有一个 EPSG 3857 格式的坐标列表。
我需要将它们转换为 EPSG 4326
我正在尝试使用 DotSpatial,但我的代码总是重新调整无限大的双数组。
public double[] ConvertCoodinates()
{
double[] xy = new double[2];
xy[0] = 5085240.8300000000;
xy[1] = 1530088.9600000000;
//An array for the z coordinate
double[] z = new double[1];
z[0] = 0;
ProjectionInfo pStart = KnownCoordinateSystems.Geographic.World.WGS1984;
pStart.AuthorityCode = 3857;
ProjectionInfo pEnd = KnownCoordinateSystems.Geographic.World.WGS1984;
pEnd.AuthorityCode = 4326;
Reproject.ReprojectPoints(xy, z, pStart, pEnd, 0, 1);
return xy;
}
xy数组总是包含无穷大;
有人可以帮助我吗?
最后我找到了一个数学公式来转换坐标。
我在一个存储过程中实现它,因为我有一个点列表,这个存储过程计算距离。
DECLARE @e FLOAT=2.7182818284
DECLARE @X DECIMAL(18,2) =20037508.34
SET @StartLat3857 =(SELECT TOP 1 Latitude FROM Coordinates WHERE IdCoord=@IdCoord ORDER By IdTDFPath ASC)
SET @StartLng3857=(SELECT TOP 1 Longitude FROM Coordinates WHERE IdCoord=@IdCoord ORDER By IdTDFPath ASC)
--converting the logitute from epsg 3857 to 4326
SET @StartLng=(@StartLng3857*180)/@X
--converting the latitude from epsg 3857 to 4326
SET @StartLat = @StartLat3857/(@X/180)
SET @StartLat = ((ATAN(POWER(@e,((PI()/180)*@StartLat))))/(PI()/360))-90
最后只是一个可以在所有语言中使用的数学公式。例如是 Javascript 它将是
const e = 2.7182818284
const X = 20037508.34
const lat3857 = 1743704.947843
const long3857 = 16978473.105100
//converting the logitute from epsg 3857 to 4326
const long4326 = (lat3857*180)/X
//converting the latitude from epsg 3857 to 4326 split in multiple lines for readability
let lat4326 = lat3857/(X / 180)
const exponent = (Math.PI / 180) * lat4326
lat4326 = Math.atan(e ** exponent)
lat4326 = lat4326 / (Math.PI / 360)
lat4326 = lat4326 - 90
将EPSG 3857
坐标投影到EPSG 4326
坐标系有点棘手。 Microsoft 建议使用 ProjNet4GeoAPI
,所以我决定使用它。
https://docs.microsoft.com/en-us/ef/core/modeling/spatial#srid-ignored-during-client-operations
我已经验证它在这里有效:
http://epsg.io/transform#s_srs=3857&t_srs=4326&x=1530088.9600000&y=5085240.8300000
转换示例:
var x = 1530088.96d;
var y = 5085240.83d;
var epsg3857ProjectedCoordinateSystem = ProjNet.CoordinateSystems.ProjectedCoordinateSystem.WebMercator;
var epsg4326GeographicCoordinateSystem = ProjNet.CoordinateSystems.GeographicCoordinateSystem.WGS84;
var coordinateTransformationFactory = new ProjNet.CoordinateSystems.Transformations.CoordinateTransformationFactory();
var coordinateTransformation = coordinateTransformationFactory.CreateFromCoordinateSystems(epsg3857ProjectedCoordinateSystem, epsg4326GeographicCoordinateSystem);
var epsg3857Coordinate = new GeoAPI.Geometries.Coordinate(x, y);
var epsg4326Coordinate = coordinateTransformation.MathTransform.Transform(epsg3857Coordinate);
所选答案的Javascript版本似乎有误...
它总是给我比实际答案大 2 倍的答案,所以我最终跳水 360 而不是 180(但我承认这里的数学超出了我的专业领域)。
这是工作代码:
coord3857To4326(coord) {
const e_value = 2.7182818284;
const X = 20037508.34;
const lat3857 = coord.lat
const long3857 = coord.lng;
//converting the longitute from epsg 3857 to 4326
const long4326 = (long3857*180)/X;
//converting the latitude from epsg 3857 to 4326 split in multiple lines for readability
let lat4326 = lat3857/(X / 180);
const exponent = (Math.PI / 180) * lat4326;
lat4326 = Math.atan(Math.pow(e_value, exponent));
lat4326 = lat4326 / (Math.PI / 360); // Here is the fixed line
lat4326 = lat4326 - 90;
return {lat:lat4326, lng:long4326};
}
我也成功反推了:
coord4326To3857(coord) {
const X = 20037508.34;
let long3857 = (coord.lng * X) / 180;
let lat3857 = parseFloat(coord.lat) + 90;
lat3857 = lat3857 * (Math.PI/360);
lat3857 = Math.tan(lat3857);
lat3857 = Math.log(lat3857);
lat3857 = lat3857 / (Math.PI / 180);
lat3857 = (lat3857 * X) / 180;
return {lat:lat3857, lng:long3857};
}
希望这对其他人有帮助!
我的数据库中有一个 EPSG 3857 格式的坐标列表。 我需要将它们转换为 EPSG 4326 我正在尝试使用 DotSpatial,但我的代码总是重新调整无限大的双数组。
public double[] ConvertCoodinates()
{
double[] xy = new double[2];
xy[0] = 5085240.8300000000;
xy[1] = 1530088.9600000000;
//An array for the z coordinate
double[] z = new double[1];
z[0] = 0;
ProjectionInfo pStart = KnownCoordinateSystems.Geographic.World.WGS1984;
pStart.AuthorityCode = 3857;
ProjectionInfo pEnd = KnownCoordinateSystems.Geographic.World.WGS1984;
pEnd.AuthorityCode = 4326;
Reproject.ReprojectPoints(xy, z, pStart, pEnd, 0, 1);
return xy;
}
xy数组总是包含无穷大; 有人可以帮助我吗?
最后我找到了一个数学公式来转换坐标。
我在一个存储过程中实现它,因为我有一个点列表,这个存储过程计算距离。
DECLARE @e FLOAT=2.7182818284
DECLARE @X DECIMAL(18,2) =20037508.34
SET @StartLat3857 =(SELECT TOP 1 Latitude FROM Coordinates WHERE IdCoord=@IdCoord ORDER By IdTDFPath ASC)
SET @StartLng3857=(SELECT TOP 1 Longitude FROM Coordinates WHERE IdCoord=@IdCoord ORDER By IdTDFPath ASC)
--converting the logitute from epsg 3857 to 4326
SET @StartLng=(@StartLng3857*180)/@X
--converting the latitude from epsg 3857 to 4326
SET @StartLat = @StartLat3857/(@X/180)
SET @StartLat = ((ATAN(POWER(@e,((PI()/180)*@StartLat))))/(PI()/360))-90
最后只是一个可以在所有语言中使用的数学公式。例如是 Javascript 它将是
const e = 2.7182818284
const X = 20037508.34
const lat3857 = 1743704.947843
const long3857 = 16978473.105100
//converting the logitute from epsg 3857 to 4326
const long4326 = (lat3857*180)/X
//converting the latitude from epsg 3857 to 4326 split in multiple lines for readability
let lat4326 = lat3857/(X / 180)
const exponent = (Math.PI / 180) * lat4326
lat4326 = Math.atan(e ** exponent)
lat4326 = lat4326 / (Math.PI / 360)
lat4326 = lat4326 - 90
将EPSG 3857
坐标投影到EPSG 4326
坐标系有点棘手。 Microsoft 建议使用 ProjNet4GeoAPI
,所以我决定使用它。
https://docs.microsoft.com/en-us/ef/core/modeling/spatial#srid-ignored-during-client-operations
我已经验证它在这里有效:
http://epsg.io/transform#s_srs=3857&t_srs=4326&x=1530088.9600000&y=5085240.8300000
转换示例:
var x = 1530088.96d;
var y = 5085240.83d;
var epsg3857ProjectedCoordinateSystem = ProjNet.CoordinateSystems.ProjectedCoordinateSystem.WebMercator;
var epsg4326GeographicCoordinateSystem = ProjNet.CoordinateSystems.GeographicCoordinateSystem.WGS84;
var coordinateTransformationFactory = new ProjNet.CoordinateSystems.Transformations.CoordinateTransformationFactory();
var coordinateTransformation = coordinateTransformationFactory.CreateFromCoordinateSystems(epsg3857ProjectedCoordinateSystem, epsg4326GeographicCoordinateSystem);
var epsg3857Coordinate = new GeoAPI.Geometries.Coordinate(x, y);
var epsg4326Coordinate = coordinateTransformation.MathTransform.Transform(epsg3857Coordinate);
所选答案的Javascript版本似乎有误... 它总是给我比实际答案大 2 倍的答案,所以我最终跳水 360 而不是 180(但我承认这里的数学超出了我的专业领域)。
这是工作代码:
coord3857To4326(coord) {
const e_value = 2.7182818284;
const X = 20037508.34;
const lat3857 = coord.lat
const long3857 = coord.lng;
//converting the longitute from epsg 3857 to 4326
const long4326 = (long3857*180)/X;
//converting the latitude from epsg 3857 to 4326 split in multiple lines for readability
let lat4326 = lat3857/(X / 180);
const exponent = (Math.PI / 180) * lat4326;
lat4326 = Math.atan(Math.pow(e_value, exponent));
lat4326 = lat4326 / (Math.PI / 360); // Here is the fixed line
lat4326 = lat4326 - 90;
return {lat:lat4326, lng:long4326};
}
我也成功反推了:
coord4326To3857(coord) {
const X = 20037508.34;
let long3857 = (coord.lng * X) / 180;
let lat3857 = parseFloat(coord.lat) + 90;
lat3857 = lat3857 * (Math.PI/360);
lat3857 = Math.tan(lat3857);
lat3857 = Math.log(lat3857);
lat3857 = lat3857 / (Math.PI / 180);
lat3857 = (lat3857 * X) / 180;
return {lat:lat3857, lng:long3857};
}
希望这对其他人有帮助!