点 EPSG 4326 (WSG 84) 到 (EPSG 28992) 的 PROJ pyproj 转换
PROJ pyproj conversion of point EPSG 4326 (WSG 84) to (EPSG 28992)
给定一个 (lon, lat) 点 (5.068913, 52.067567) 我想使用 pyproj
.
从 EPSG 4326 转换为 EPSG 28992
Proj
和 pyproj
中的 transform
函数似乎都适合这样的任务:
- https://pyproj4.github.io/pyproj/dev/api/proj.html?highlight=proj#pyproj-proj
- https://pyproj4.github.io/pyproj/dev/api/transformer.html?highlight=transform#pyproj-transform
当我使用 Proj
函数时,我得到的结果与使用 transform
的结果不同,为什么?
例如
from shapely.geometry import Point
from pyproj import Proj, transform
from matplotlib import pyplot as plt
x1, y1 = 5.068913, 52.067567
in_proj = Proj(init='epsg:4326')
out_proj = Proj(init='epsg:28992')
point1 = Point(out_proj(x1, y1))
point2 = Point(transform(in_proj, out_proj, x1 ,y1))
print(point1 == point2)
fig, ax = plt.subplots()
x, y = point1.xy
ax.plot(x, y, 'ro')
x, y = point2.xy
ax.plot(x, y, 'ro')
之间的转换
EPSG:4326
和
EPSG:28992
不仅需要投影输入坐标,在本例中使用 Oblique_Stereographic 投影。这可以通过 Proj
函数来完成...
...但也执行基准转换,WGS84 到 Amersfoort 基准。这只能通过 transform
函数来完成。请注意,transform
完成了 Proj
所做的所有事情以及数据转换。不需要 two-step 转换。
说明已经说过的话,我们有 EPSG:28992
以下 WKT,
PROJCS["Amersfoort / RD New",
GEOGCS["Amersfoort",
DATUM["Amersfoort",
SPHEROID["Bessel 1841",6377397.155,299.1528128,
AUTHORITY["EPSG","7004"]],
TOWGS84[565.417,50.3319,465.552,-0.398957,0.343988,-1.8774,4.0725],
AUTHORITY["EPSG","6289"]],
PRIMEM["Greenwich",0,
AUTHORITY["EPSG","8901"]],
UNIT["degree",0.0174532925199433,
AUTHORITY["EPSG","9122"]],
AUTHORITY["EPSG","4289"]],
PROJECTION["Oblique_Stereographic"],
PARAMETER["latitude_of_origin",52.15616055555555],
PARAMETER["central_meridian",5.38763888888889],
PARAMETER["scale_factor",0.9999079],
PARAMETER["false_easting",155000],
PARAMETER["false_northing",463000],
UNIT["metre",1,
AUTHORITY["EPSG","9001"]],
AXIS["X",EAST],
AXIS["Y",NORTH],
AUTHORITY["EPSG","28992"]]
字符串
TOWGS84[565.417,50.3319,465.552,-0.398957,0.343988,-1.8774,4.0725]
...意味着需要执行数据转换...无法使用 Proj
函数完成,但只能使用 transform
.
结论:
假设您使用的 pyproj
安装配置了正确的 TOWGS84
字符串(并非总是如此),那么 transform
结果应该是正确的被认为是正确的。
给定一个 (lon, lat) 点 (5.068913, 52.067567) 我想使用 pyproj
.
Proj
和 pyproj
中的 transform
函数似乎都适合这样的任务:
- https://pyproj4.github.io/pyproj/dev/api/proj.html?highlight=proj#pyproj-proj
- https://pyproj4.github.io/pyproj/dev/api/transformer.html?highlight=transform#pyproj-transform
当我使用 Proj
函数时,我得到的结果与使用 transform
的结果不同,为什么?
例如
from shapely.geometry import Point
from pyproj import Proj, transform
from matplotlib import pyplot as plt
x1, y1 = 5.068913, 52.067567
in_proj = Proj(init='epsg:4326')
out_proj = Proj(init='epsg:28992')
point1 = Point(out_proj(x1, y1))
point2 = Point(transform(in_proj, out_proj, x1 ,y1))
print(point1 == point2)
fig, ax = plt.subplots()
x, y = point1.xy
ax.plot(x, y, 'ro')
x, y = point2.xy
ax.plot(x, y, 'ro')
EPSG:4326
和
EPSG:28992
不仅需要投影输入坐标,在本例中使用 Oblique_Stereographic 投影。这可以通过 Proj
函数来完成...
...但也执行基准转换,WGS84 到 Amersfoort 基准。这只能通过 transform
函数来完成。请注意,transform
完成了 Proj
所做的所有事情以及数据转换。不需要 two-step 转换。
说明已经说过的话,我们有 EPSG:28992
以下 WKT,
PROJCS["Amersfoort / RD New",
GEOGCS["Amersfoort",
DATUM["Amersfoort",
SPHEROID["Bessel 1841",6377397.155,299.1528128,
AUTHORITY["EPSG","7004"]],
TOWGS84[565.417,50.3319,465.552,-0.398957,0.343988,-1.8774,4.0725],
AUTHORITY["EPSG","6289"]],
PRIMEM["Greenwich",0,
AUTHORITY["EPSG","8901"]],
UNIT["degree",0.0174532925199433,
AUTHORITY["EPSG","9122"]],
AUTHORITY["EPSG","4289"]],
PROJECTION["Oblique_Stereographic"],
PARAMETER["latitude_of_origin",52.15616055555555],
PARAMETER["central_meridian",5.38763888888889],
PARAMETER["scale_factor",0.9999079],
PARAMETER["false_easting",155000],
PARAMETER["false_northing",463000],
UNIT["metre",1,
AUTHORITY["EPSG","9001"]],
AXIS["X",EAST],
AXIS["Y",NORTH],
AUTHORITY["EPSG","28992"]]
字符串
TOWGS84[565.417,50.3319,465.552,-0.398957,0.343988,-1.8774,4.0725]
...意味着需要执行数据转换...无法使用 Proj
函数完成,但只能使用 transform
.
结论:
假设您使用的 pyproj
安装配置了正确的 TOWGS84
字符串(并非总是如此),那么 transform
结果应该是正确的被认为是正确的。