2010-03-11 45 views
2

I m having little trouble finding a relation between the movement at centre and edge of a circle, I m为平移世界地图做准备,我的地图范围是180,89:-180,-89,我的地图通过添加变化平移(dx ,dY)到其范围而不是其中心。现在有一种情况出现了,我必须把地图移到一个特定的中心,计算经度的变化是非常简单和容易的,但是它引起了问题的变化。看起来地图中心的变化比地图Y边缘的变化更大,或者仅仅是如果我必须将地图中心从0long,0lat移动到73long,33lat,对于dX,我只得到73,但对于dY显然它看起来是33,但是如果我把33加到89的地图顶部,它会是122,这是不正确的,因为纬度在90到90之间。这似乎是一个二维平面上圆的投影,由于角度变化较小,中心向前后移动,并且中心变化更大,现在是否存在这两个因素之间的关系?我尝试将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); 

    } 
+0

原帖发生了什么? – TheSteve0 2010-03-12 04:05:50

回答

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,欧盟和AF分别代表北美,南美,欧洲和非洲(这里的简化地图)。 PO是太平洋。围绕原始地图,我已经在水平方向和空白区域(ws)垂直拼接了另一个地图副本。

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

您也可以上下90°。由于包裹在这里没有任何意义,所以你的观点的一部分将是空白。

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

+0

我的平移工作是这样的:说水平: extentVirtual .mapLeft- = extentVirtual.currentSpanLong/100)* 0.75; extentVirtual.mapRight - =((extentVirtual.currentSpanLong/100)* 0.75); 垂直: extentVirtual.mapTop - =(extentVirtual.currentSpanLat/100)* 0.75; extentVirtual.mapBottom - =((extentVirtual.currentSpanLat/100)* 0.75); 正如您所看到的范围移动当前视图跨度的百分比 – Imran 2010-03-11 06:58:40

0

这将取决于项目很大程度上取决于您原始地球图像的map projection。在不知道您使用的特定投影的情况下,无法生成将公式中的x-y像素距离映射到经纬度数字(反之亦然)的方程式。

如果您使用equal-area投影,如Gall-Peters,那么您将节省大量时间和摆弄,因为没有适用的公式:像素距离将线性关联到经纬度数字。

祝你好运!

+0

好的谢谢你的想法,但我正在使用简单的WGS84基准地理投影,等面积投影看起来不错,但问题出现在你做世界和屏幕坐标之间的变形时 – Imran 2010-03-11 06:53:35

相关问题