Python 将平面x/y转换为横向/纵向

Python 将平面x/y转换为横向/纵向,python,coordinates,gis,geocoding,latitude-longitude,Python,Coordinates,Gis,Geocoding,Latitude Longitude,我想写一个程序,把纽约市的x/y坐标转换成lat/lng小数点。我不熟悉平面/全局贴图。我把纽约市在他们的网站上提供的常数包括在内。另外,如果有一篇关于如何做到这一点的好文章,我很想学习!下面是我编写的程序以及底部的注释输出,以及理想值应该是什么。我在这件事上有点不知所措 #!/usr/bin/python from math import * """ Supplied by NYC Lambert Conformal Conic: Standard Parallel: 40.666

我想写一个程序,把纽约市的x/y坐标转换成lat/lng小数点。我不熟悉平面/全局贴图。我把纽约市在他们的网站上提供的常数包括在内。另外,如果有一篇关于如何做到这一点的好文章,我很想学习!下面是我编写的程序以及底部的注释输出,以及理想值应该是什么。我在这件事上有点不知所措

#!/usr/bin/python
from math import *

"""
Supplied by NYC
Lambert Conformal Conic:

    Standard Parallel: 40.666667
    Standard Parallel: 41.033333
    Longitude of Central Meridian: -74.000000
    Latitude of Projection Origin: 40.166667
    False Easting: 984250.000000
    False Northing: 0.000000

"""

x = 981106                      #nyc x coord
y = 195544                      #nyc y coord
a = 6378137                     #' major radius of ellipsoid, map units (NAD 83)
e = 0.08181922146               #' eccentricity of ellipsoid (NAD 83)
angRad = pi/180                 #' number of radians in a degree
pi4 = pi/4                      #' Pi / 4

p0 = 40.166667 * angRad        #' latitude of origin
p1 = 40.666667 * angRad        #' latitude of first standard parallel
p2 = 41.033333 * angRad        #' latitude of second standard parallel
m0 = -74.000000 * angRad       #' central meridian
x0 = 984250.000000             #' False easting of central meridian, map units

m1 = cos(p1) / sqrt(1 - ((e ** 2) * sin(p1) ** 2))
m2 = cos(p2) / sqrt(1 - ((e ** 2) * sin(p2) ** 2))
t0 = tan(pi4 - (p0 / 2))
t1 = tan(pi4 - (p1 / 2))
t2 = tan(pi4 - (p2 / 2))
t0 = t0 / (((1 - (e * (sin(p0)))) / (1 + (e * (sin(p0)))))**(e / 2))
t1 = t1 / (((1 - (e * (sin(p1)))) / (1 + (e * (sin(p1)))))**(e / 2))
t2 = t2 / (((1 - (e * (sin(p2)))) / (1 + (e * (sin(p2)))))**(e / 2))
n = log(m1 / m2) / log(t1 / t2)
f = m1 / (n * (t1 ** n))
rho0 = a * f * (t0 ** n)

x = x - x0
pi2 = pi4 * 2
rho = sqrt((x ** 2) + ((rho0 - y) ** 2))
theta = atan(x / (rho0 - y))
t = (rho / (a * f)) ** (1 / n)
lon = (theta / n) + m0
x = x + x0

lat0 = pi2 - (2 * atan(t))

part1 = (1 - (e * sin(lat0))) / (1 + (e * sin(lat0)))
lat1 = pi2 - (2 * atan(t * (part1 ** (e / 2))))
while abs(lat1 - lat0) < 0.000000002:
    lat0 = lat1
    part1 = (1 - (e * sin(lat0))) / (1 + (e * sin(lat0)))
    lat1 = pi2 - (2 * atan(t * (part1 ^ (e / 2))))

lat = lat1 / angRad
lon = lon / angRad

print lat,lon
#output : 41.9266666432 -74.0378981653
#should be 40.703778, -74.011829
#/usr/bin/python
从数学导入*
"""
由纽约市提供
朗伯共形二次曲线:
标准平行线:40.666667
标准平行线:41.033333
中央子午线经度:-74.000000
投影原点纬度:40.166667
假东距:984250.000000
假北距:0.000000
"""
x=981106#纽约x坐标
y=195544#纽约y坐标
a=6378137#'椭球体大半径,地图单位(NAD 83)
e=0.08181922146#'椭球体偏心率(NAD 83)
angRad=π/180#度的弧度数
pi4=pi/4#“pi/4
p0=40.166667*angRad#原点纬度
p1=40.666667*angRad#第一标准平行线纬度
p2=41.033333*angRad#第二标准平行线纬度
m0=-74.000000*angRad#中央子午线
x0=984250.000000#'中央子午线假东距,地图单位
m1=cos(p1)/sqrt(1-((e**2)*sin(p1)**2))
m2=cos(p2)/sqrt(1-((e**2)*sin(p2)**2))
t0=tan(pi4-(p0/2))
t1=tan(pi4-(p1/2))
t2=tan(pi4-(p2/2))
t0=t0/((1-(e*(sin(p0)))/(1+(e*(sin(p0щщ))**(e/2))
t1=t1/((1-(e*(sin(p1)))/(1+(e*(sin(p1щщ)))**(e/2))
t2=t2/((1-(e*(sin(p2)))/(1+(e*(sin(p2щщ))**(e/2))
n=对数(m1/m2)/对数(t1/t2)
f=m1/(n*(t1**n))
rho0=a*f*(t0**n)
x=x-x0
pi2=pi4*2
rho=sqrt((x**2)+(rho0-y)**2))
θ=atan(x/(rho0-y))
t=(rho/(a*f))**(1/n)
lon=(θ/n)+m0
x=x+x0
lat0=pi2-(2*atan(t))
第1部分=(1-(e*sin(lat0))/(1+(e*sin(lat0)))
lat1=pi2-(2*atan(t*(第1部分**(e/2)))
当abs(lat1-lat0)<0.000000002时:
lat0=lat1
第1部分=(1-(e*sin(lat0))/(1+(e*sin(lat0)))
lat1=pi2-(2*atan(t*(第1部分(e/2)))
lat=lat1/angRad
lon=lon/angRad
列印经纬仪
#输出:41.9266666432-74.0378981653
#应为40.703778,-74.011829
我被卡住了,我有很多需要地理编码的
谢谢你的帮助

owww。你最好用图书馆来做这个。稍微搜索一下就可以知道这应该是正确的

使用gdal,但不是通过pythonapi(他们只是通过python中的命令行调用gdal),但可能会有所帮助

你最好在询问更多信息


我不清楚上面的代码是从哪里来的。如果您链接到它,我/某人可以检查明显的实现错误。

这些公式应该可以帮助您:


您可以在地图表面上选择一个网格,找出这些网格点的纵横比,然后使用插值进行转换,而不是尝试完成所有的数学运算。根据投影的线性,可能不需要很多点就可以获得良好的精度。

一个词的答案:


也许可以让你开始吗?关于所用投影的更多细节:只要阅读那篇文章并开始实现公式,然后我意识到我正在做一个椭球变换,公式不在那里。它说的是:椭球基准的Formulæ更复杂。你的代码说明这是一个圆锥投影,不是椭球体…嗯,很好的捕捉,我甚至没有看到,这可能就是为什么我只是一个头发了。当数据是圆锥曲线时,我正在计算椭球体的偏心率。嘿,谢谢大家!我在蒙大拿州地理信息系统研究所找到了一些代码。它是用asp/vb编写的,链接在这里。它与我的代码几乎相同。不过我要去看看这个图书馆。我也有这些建筑物的地址,这就是我得到正确地理编码的原因。我只是想使用地理编码服务来实现这些功能。@arboc7发现了我的数据是圆锥形的,但这个程序是针对椭球体的。我想这就是为什么我得到了接近的答案,但不是正确的答案。这看起来太棒了!但仍然不是我所需要的准确度,这只是数据在x,y中的一个限制吗?实际上,这只是输出了我已经得到的结果:Salso在玩了这个游戏之后,不应该使用Google从我的地址对经度-74I进行地理编码。这应该在曼哈顿下城的某个地方结束。这里有一个地图描述的链接没关系,地址是曼哈顿的BROAD STREET 99号,即使有-74的变化,我仍然会在上州的Poughkeepsie登陆。除非我从纽约得到的数据不好。现在我真的弄明白了。纽约市的数据以英尺为单位:(
>>> from pyproj import Proj
>>> pnyc = Proj(
...     proj='lcc',
...     datum='NAD83',
...     lat_1=40.666667,
...     lat_2=41.033333,
...     lat_0=40.166667,
...     lon_0=-74.0,
...     x_0=984250.0,
...     y_0=0.0)
>>> x = [981106.0]
>>> y = [195544.0]
>>> lon, lat = pnyc(x, y, inverse=True)
>>> lon, lat
([-74.037898165369015], [41.927378144152335])