瓷砖数字为lon./lat。在EPSG:3395

时间:2017-11-08 16:20:49

标签: python gis projection tiles

我需要在EPSG:3395中将瓷砖编号转换为lon./lag,但我找不到解决方案。

我找到了code for EPSG:4326,但我没有办法让它适应EPSG:3395

代码为4326(效果很好):

$n = pow(2, $zoom);
$lon_deg = $xtile / $n * 360.0 - 180.0;
$lat_deg = rad2deg(atan(sinh(pi() * (1 - 2 * $ytile / $n))));

我需要在EPSG:3395中将瓷砖编号转换为lon./lag,但我找不到有效的解决方案。我已经基于this answer实现了一些代码。

当我试图将4326度转换为3395度时:

def getVal(x, y, n):
    lon_deg = x / n * 360.0 - 180.0
    lat_rad = math.atan(math.sinh(math.pi * (1 - 2 * y / n)))
    lat_deg = math.degrees(lat_rad)
    #Convert in 3395
    a = 6378137 #WGS84 semi-major axis
    b = 6356752.3142 #WGS84 semi-minor axis
    print(math.sqrt(1 - b^2 / a^2))
    e = math.sqrt(1 - b^2 / a^2) #ellipsoid eccentricity
    c = math.pow((1 - e*math.sin(latitude)) / (1 + e*math.sin(latitude)), e/2)
    lat_deg = a * ln(math.tan(math.pi/4 + lat_deg/2) * c)
    lon_deg = a * lon_deg; 

我收到以下错误消息:

    Unsupported operand type(s) for float and INT

更新:通过将**替换为**,我已将代码更正为以下代码。

代码:

    def getVal(x, y, n):
        #Calcuate coordinates in 4326
        lon_deg = x / n * 360.0 - 180.0
        lat_rad = math.atan(math.sinh(math.pi * (1 - 2 * y / n)))
        lat_deg = math.degrees(lat_rad)
        #Convert coordinates in 3395
        a = 6378137 #WGS84 semi-major axis
        b = 6356752.3142 #WGS84 semi-minor axis
        e = math.sqrt(1 - b**2 / a**2) #ellipsoid eccentricity
        c = math.pow((1 - e*math.sin(lat_deg)) / (1 + e*math.sin(lat_deg)), e/2)
        lon_deg = a * lon_deg;  
        lat_deg = a * math.log(math.tan(math.radians(math.pi/4 + lat_deg/2) * c))

但投影仍然很奇怪。 我认为问题出在这一部分:

        lat_deg = a * math.log(math.tan(math.radians(math.pi/4 + lat_deg/2) 

我必须插入math.radians作为math.tan不喜欢度角。 有什么想法吗?

1 个答案:

答案 0 :(得分:0)

看起来您想知道将坐标转换为EPSG的公式:3395。我不知道这个问题是否适合这个问题,但这可能是help

尝试升级到电源时使用操作数**而不是^。

def getVal(x, y, n):
    lon_deg = x / n * 360.0 - 180.0
    lat_rad = math.atan(math.sinh(math.pi * (1 - 2 * y / n)))
    lat_deg = math.degrees(lat_rad)
    #Convert in 3395
    a = 6378137 #WGS84 semi-major axis
    b = 6356752.3142 #WGS84 semi-minor axis
    print(math.sqrt(1 - b**2 / a**2))
    e = math.sqrt(1 - b**2 / a**2) #ellipsoid eccentricity
    c = math.pow((1 - e*math.sin(latitude)) / (1 + e*math.sin(latitude)), e/2)
    lat_deg = a * ln(math.tan(math.pi/4 + lat_deg/2) * c)
    lon_deg = a * lon_deg;