python - 为什么 pyproj.Proj 前向投影似乎没有考虑经纬度原点?

标签 python map-projections proj pyproj

我对如何使用 pyproj.Proj 相对于切点/经纬度原点定义投影感到困惑。

考虑以下代码:

import 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)

现在鉴于我指定了纬度和经度的原点,我希望在指定这些坐标时我能够 assert x == 0 and y == 0 ,但是我实际上得到 (7571700.820174289, -6296411.725576388) .

谁能解释一下为什么会这样?我对投影/坐标系的了解有限,但我尽力理解PROJ Cartographic helpa related wikibook page .

提前非常感谢任何可以帮助我纠正并引导我走向正确方向的人:-)

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

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]

结果:

55.0 -1.0

x= 0.000

y= 0.000

在我的代码中,我正在考虑自然原点的比例因子 1

在你的 PROJ 字符串中我看不到任何内容。尝试将比例因子设置为+k_0=1

如果这没有帮助,那么您的 PROJ 字符串中还缺少其他内容,因为结果实际上是 (0,0)

除非 PyProj 有错误,我对此表示怀疑。

关于python - 为什么 pyproj.Proj 前向投影似乎没有考虑经纬度原点?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56581650/

相关文章:

python - Pandas GroupBy 查询

python - 这个 ZPT 模板有什么问题?

canvas - 在基于 Canvas 的 D3 地球仪上显示投影转换的文本

r - 方位角等距投影异常

r - R中光栅和多边形的坐标引用系

python - 使用 Wand + ImageMagick 调整 GIF 大小

Python 3 Beautiful Soup 用冒号查找标签

map - d3.js 墨卡托投影到纽约 map

python - cartopy 北极立体等高线图即使使用循环点也无法正确绘制

python - PyProj : Mapping latitude/longitude onto rectangle using x, y 坐标