如何使用自定义函数在QGraphicsView和QGraphicsScene坐标之间进行转换?

时间:2016-03-22 00:29:12

标签: qt qgraphicsview qgraphicsscene map-projections projection-matrix

我正在尝试开发一个应用程序,它可以充分利用(Py)Qt图形框架应用于地理地图(想想在平铺背景上渲染KML文件,非常类似于谷歌地图)。

在Web地图上,由于Earth Sphericity,像素位置(i,j)和地理位置(纬度,经度)之间的转换不是线性的,我已经使用以下函数成功执行了此转换:

TILE_SIZE = 256
EARTH_RADIUS = 6378137
EQUATOR_CIRCUMFERENCE = 2 * math.pi * EARTH_RADIUS
INITIAL_RESOLUTION = EQUATOR_CIRCUMFERENCE / TILE_SIZE
ORIGIN_SHIFT = EQUATOR_CIRCUMFERENCE / 2.0

def latlontopixels(lat, lon, zoom):
    mx = (lon * ORIGIN_SHIFT) / 180.0
    my = math.log(math.tan((90 + lat) * math.pi/360.0))/(math.pi/180.0)
    my = (my * ORIGIN_SHIFT) /180.0
    res = INITIAL_RESOLUTION / (2**zoom)
    px = (mx + ORIGIN_SHIFT) / res
    py = (my + ORIGIN_SHIFT) / res
    return px, py

def pixelstolatlon(pos, zoom):
    px, py = pos
    res = INITIAL_RESOLUTION / (2**zoom)
    mx = px * res - ORIGIN_SHIFT
    my = py * res - ORIGIN_SHIFT
    lat = (my / ORIGIN_SHIFT) * 180.0
    lat = 180 / pi * (2*atan(exp(lat*pi/180.0)) - pi/2.0)
    lon = (mx / ORIGIN_SHIFT) * 180.0
    return lon, lat

我的问题是:

  

有没有办法在Scene,View或甚至每个Item中透明地“嵌入”这些转换,子类化和/或覆盖某些metod?

例如,当我有一个“GeoPolyLine”QGraphicsItem时,我想在内部将它的点存储为(lat,lon)对,可能使用QPoint,但我希望它被“看到”场景和视图通过“latLonToPixels”坐标。

另外,由于我希望我的几何形状是“模型”,我不认为我应该让它们继承QGraphicsView,我想知道Qt的Model / View编程模型是否对处理这个映射本身很有用,而不是场景/视图模型。

0 个答案:

没有答案