首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用Numpy转换为Web Mercator

用Numpy转换为Web Mercator
EN

Stack Overflow用户
提问于 2014-07-31 12:29:12
回答 1查看 2.1K关注 0票数 2

我的程序垂直延伸一个Numpy数组,表示一个180×360的地图图像,因此它代表了一个Web Mercator地图图像。

我编写了一个函数(下面),它做我想做的-但它是疯狂的慢(大约5分钟)。有没有更快更容易的方法来做到这一点?也许使用Numpy interpolate2d或MatPlotLib?

代码语言:javascript
复制
def row2lat(row):
  return 180.0/math.pi*(2.0*math.atan(math.exp(row*math.pi/180.0))-math.pi/2.0)

def mercator(geodetic):
    geo = np.repeat(geodetic, 2, axis=0)
    merc = np.zeros_like(geo)
    side = geo[0].size
    for row in range(side):
        lat = row2lat(180 - ((row * 1.0)/side) * 360)
        g_row = (abs(90 - lat)/180)*side
        fraction = g_row-math.floor(g_row)
        for col in range(side):
            high_row = geo[math.floor(g_row)][col] * (fraction)
            low_row = geo[math.ceil(g_row)][col] * (1-fraction)
            merc[row][col] = high_row + low_row
    return merc

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-07-31 14:46:27

尽量避免内部for循环,并将函数向量化。Numpy经过高度优化,可以高效地运行这些东西。然后,您的函数读起来就像

代码语言:javascript
复制
def mercator_faster(geodetic):
    geo = np.repeat(geodetic, 2, axis=0)
    merc = np.zeros_like(geo)
    side = geo[0].size
    for row in range(side):
        lat = row2lat(180 - ((row * 1.0)/side) * 360)
        g_row = (abs(90 - lat)/180)*side
        fraction = g_row-math.floor(g_row)

        # Here I optimized the code by using the numpy vector operations 
        # instead of the for loop:

        high_row = geo[math.floor(g_row), :] * (fraction)
        low_row = geo[math.ceil(g_row), :] * (1-fraction)
        merc[row, :] = high_row + low_row

    return merc

如果我在我的机器上运行它,它所需的时间少于一秒钟:

代码语言:javascript
复制
%timeit mercator_faster(geo)
1 loops, best of 3: 727 ms per loop

它看起来像这样(我不得不把它重放一遍,因为它太大了,不能这样做):

可能外层for循环也可能被矢量化,但我想这要困难得多。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25058880

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档