Python 为什么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.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)

有人能解释为什么会这样吗?我对投影/坐标系的知识有限,但我尽了最大努力去理解和理解

非常感谢所有能够帮助我改正错误,让我走上正确方向的人:-)

编辑:更新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]