Python 为什么pyproj.Proj正向投影似乎不能解释纬度原点?
我对使用pyproj.Proj的投影是如何相对于切点/坐标原点定义的感到困惑 考虑以下代码:Python 为什么pyproj.Proj正向投影似乎不能解释纬度原点?,python,map-projections,proj,pyproj,Python,Map Projections,Proj,Pyproj,我对使用pyproj.Proj的投影是如何相对于切点/坐标原点定义的感到困惑 考虑以下代码: 导入pyproj p=pyproj.Proj(“+Proj=tmerc+lat_0=55+lon_0=-1+a=6378137+b=6356752.3+units=m+no_defs”) x、 y=p(55,-1) 现在假设我指定了纬度和经度的原点,我希望在指定这些坐标时,我能够断言x==0和y==0,但实际上我得到(7571700.820174289,-6296411.725576388) 有人能解
导入pyproj
p=pyproj.Proj(“+Proj=tmerc+lat_0=55+lon_0=-1+a=6378137+b=6356752.3+units=m+no_defs”)
x、 y=p(55,-1)
现在假设我指定了纬度和经度的原点,我希望在指定这些坐标时,我能够断言x==0和y==0
,但实际上我得到(7571700.820174289,-6296411.725576388)
有人能解释为什么会这样吗?我对投影/坐标系的知识有限,但我尽了最大努力去理解和理解
非常感谢所有能够帮助我改正错误,让我走上正确方向的人:-)
编辑:更新1
感谢@lusitanica和他们的帮助性回答,我现在尝试将比例因子设置为1并重新运行:
x,y=pyproj.Proj('+Proj=tmerc+lat_0=55+lon_0=-1+k_0=1+a=6378137+b=6356752.3+units=m+no_defs',preserve_units=True)(55,-1)
不幸的是,这与以前一样给出了
(7571700.820174289,-6296411.725576388)
,因此问题是投影字符串还需要哪些其他信息?我可以独立确认结果应该是(0,0)
结果:
55.0-1.0
x=0.000
y=0.000
在我的代码中,我考虑的是自然原点的比例因子1
在你的项目字符串中,我看不到任何。尝试将比例因子设置为+k_0=1
如果这没有帮助,那么PROJ字符串中还缺少其他内容,因为结果是realy(0,0)
除非PyProj中有一个bug,我对此表示怀疑。结果证明我很傻<代码>pyproj.Proj要求输入lon,lat顺序不是lat,lon:-( 因此,以下工作:
导入pyproj
lat0,lon0=55,-1
p=pyproj.Proj(f'+Proj=tmerc+lat_0={lat0}+lon_0={lon0}+a=6378137+b=6356752.3+units=m+no_defs')
x、 y=p(lon0,lat0)
打印(x,y)#0.0,0.0
感谢@lusitanica的解释和详细的替代方法!遗憾的是,比例因子似乎没有任何作用,因此我认为投影字符串需要一些缺失的信息。我也怀疑PyProj本身是否存在缺陷(我使用的是2.2.0版),但是,我不排除这一点(可能基础项目4库为cs2cs
大约是2016年的年份,因此可能需要更新)。尝试隔离问题。例如,设置+ellps=GRS80
,而不是a
和b
。还可以尝试使用空字符串'
,查看是否正在使用参数。在
from math import *
# GRS-80
a = 6378137.
equad =0.00669437999
# Natural Origin
lat0=55.
lon0=-1.
############################################################################
# Meridian Arc
############################################################################
def arcmer(a,equad,lat1,lat2):
b=a*sqrt(1-equad)
n=(a-b)/(a+b)
a0=1.+((n**2)/4.)+((n**4)/64.)
a2=(3./2.)*(n-((n**3)/8.))
a4=(15./16.)*((n**2)-((n**4)/4.))
a6=(35./48.)*(n**3)
s1=a/(1+n)*(a0*lat1-a2*sin(2.*lat1)+a4*sin(4.*lat1)-a6*sin(6.*lat1))
s2=a/(1+n)*(a0*lat2-a2*sin(2.*lat2)+a4*sin(4.*lat2)-a6*sin(6.*lat2))
return s2-s1
#############################################################################
# Direct projection Gauss-Kruger
#############################################################################
def geogauss(lat,lon,a,equad,lat0,lon0):
lat0=radians(lat0)
lon0=radians(lon0)
lat=radians(lat)
lon=radians(lon)
lon=lon-lon0
N=a/sqrt(1-equad*(sin(lat))**2)
RO=a*(1-equad)/((1-equad*(sin(lat)**2))**(3./2.))
k1=(N/RO)+(4.*(N**2)/(RO**2))-((tan(lat))**2)
k2=(N/RO)-((tan(lat))**2)
k3=N/RO*(14.-58.*((tan(lat)))**2)+40.*((tan(lat))**2)+((tan(lat))**4)-9.
x=lon*N*cos(lat)+(lon**3)/6.*N*((cos(lat))**3)*k2+(lon**5)/120.*N*((cos(lat))**5)*k3
y=arcmer(a,equad,lat0,lat)+(lon**2)/2.*N*sin(lat)*cos(lat)+((lon**4)/24.)*N*sin(lat)*((cos(lat))**3)*k1
return x,y
lat=55.
lon=-1.
coordinates = geogauss(lat,lon,a,equad,lat0,lon0)
print lat,lon
print "x= %.3f" %coordinates[0]
print "y= %.3f" %coordinates[1]