2

一世m having little trouble finding a relation between the movement at centre and edge of a circle, I我正在做平移世界地图,我的地图范围是 180,89:-180,-89,我的地图通过将 change(dx,dY) 添加到其范围而不是其中心来平移。现在出现了一种情况,我必须将地图移动到特定的中心,以计算经度的变化非常容易和简单,但是纬度的变化引起了问题。似乎地图 centerY 的变化超过了 mapY 边缘的变化,或者只是如果我必须将地图中心从 0long,0lat 移动到 73long,33lat,对于 dX 我只是得到 73,但对于 dY 显然它看起来 33 但如果我将 33 添加到地图顶部 89 ,它将是 122 ,这是不正确的,因为纬度在 90 和 -90 之间。似乎是一个圆在 2D 平面上的投影,其中圆的边缘由于角度而向后移动,变化较小,而中心变化较大,现在这两个因素之间有关系吗?我尝试将 OriginY 和 destinationY 之间的差异转换为弧度,然后添加到地图的顶部和底部,但这对我来说并没有真正起作用。请注意,地图是在虚拟画布上的项目,其宽度从 256 开始并增加 256*2^z ,z=0 是默认值,整个世界在画布范围内可见

public void moveMapTo(double destinationLongitude,double destinationLattitude) // moves map to the new centre
        {
            double dXLong=destinationLongitude-centreLongitude; // centreLongitude and centreLattitude are centre of current map position
            double atanhsinO = atanh(Math.sin(destinationLattitude * Math.PI / 180.00));
            double atanhsinD = atanh(Math.sin(centreLatitude * Math.PI / 180.00));
            double atanhCentre = (atanhsinD + atanhsinO) / 2;
            double latitudeSpan =destinationLattitude - centreLatitude;
            double radianOfCentreLatitude = Math.atan(Math.sinh(atanhCentre));
            double dXLat=latitudeSpan / Math.cos(radianOfCentreLatitude);
            dXLat*=getLattitudeSpan()*(Math.PI/180); //<--- HERE IS THE PORBLEM

            System.out.println("dxLong:"+dXLong+"_dxLat:"+dXLat);
    //map left.right.top,bottom are current extents of map
            mapLeft+=dXLong;
            mapRight+=dXLong;
                         mapTop+=dXLat;
            mapBottom+=dXLat;




    }
    private double getLattitudeSpan()
    {

            double latitudeSpan = mapTop - mapBottom;
            latitudeSpan = latitudeSpan / Math.cos(radianOfCentreLatitude);
            return Math.abs(latitudeSpan);

    } 
4

2 回答 2

1

不久前我解决了一个类似的问题,也许能给你一些提示。

通过添加缩放的经度或纬度在所有 4 个方向上平移仅适用于墨卡托投影;这是你有的吗?如果是这样,很好。

要向北和向南平移,我认为您唯一能做的就是在向北平移的情况下显示极北的白色(空)背景;即您显示的地图较少。

要向东和向西平移,您必须用对面的环绕边缘替换屏幕外的世界部分。

我发现如果我创建这样的地图,我的代码会变得非常简单:

ws ws ws ws ws ws ws ws
eu po PO NA EU PO po na
af po PO SA AF PO po sa
ws ws ws ws ws ws ws ws

大写字母的中心部分是您的原始世界地图:NA、SA、EU 和 AF 分别代表北美、南美、欧洲和非洲(此处为简化地图)。PO是太平洋。在该原始地图周围,我水平缝合了地图的另一个副本,并垂直缝合了空白 (ws)。

最初,您的视图以 0/0 为中心,即在 NA/SA 和 EU/AF 之间,并从那里向您显示南北 90° 以及东西方向 90°,两个方向总共 180°。从那里,您可以向东或向西平移 180°,仍然可以看到相同数量的世界。例如,您可以向东平移 180° 到国际日期变更线(在太平洋),然后在左侧看到欧洲和非洲,在右侧看到北/南美洲。

您还可以上下平移 90°。由于在这里环绕没有任何意义,因此您的部分视图将是空白。

这样做的缺点是您的地图图像的压缩文件大小大约是其两倍,像素大小是其四倍。您可以通过在代码中拼接来实现相同的效果,但使用超大世界地图要容易一些。

于 2010-03-11T06:08:07.123 回答
0

这将很大程度上取决于原始地球图像的地图投影。在不知道您正在使用的特定投影的情况下,不可能生成将图像上的 xy 像素距离映射到经纬度数的方程式(反之亦然)。

如果您使用等面积投影,例如Gall-Peters,那么您将节省大量时间和摆弄,因为没有适用的方程:像素距离将与经纬度数线性相关。

祝你好运!

于 2010-03-11T05:48:41.417 回答