Gis 如何找到地图中心纬度变化和顶部/底部之间的关系

Gis 如何找到地图中心纬度变化和顶部/底部之间的关系,gis,trigonometry,projection,map-projections,Gis,Trigonometry,Projection,Map Projections,我很容易找到圆的中心和边缘之间的运动关系,我做的是平移世界地图,我的地图范围是180,89:-180,-89,我的地图通过向其范围而不是其中心添加变化(dx,dY)来平移。现在出现了一种情况,我必须把地图移到一个特定的中心,来计算经度的变化是非常容易和简单的,但正是晶格的变化引起了问题。地图中心的变化似乎比地图边缘的变化更大,或者如果我必须将地图中心从0long,0lat移动到73long,33lat,对于dX,我只得到73,但是对于dY,它看起来是33,但是如果我在地图顶部加上33,即89,它

我很容易找到圆的中心和边缘之间的运动关系,我做的是平移世界地图,我的地图范围是180,89:-180,-89,我的地图通过向其范围而不是其中心添加变化(dx,dY)来平移。现在出现了一种情况,我必须把地图移到一个特定的中心,来计算经度的变化是非常容易和简单的,但正是晶格的变化引起了问题。地图中心的变化似乎比地图边缘的变化更大,或者如果我必须将地图中心从0long,0lat移动到73long,33lat,对于dX,我只得到73,但是对于dY,它看起来是33,但是如果我在地图顶部加上33,即89,它将是122,这是不正确的,因为纬度在90和-90之间。这似乎是一个圆在二维平面上的投影,由于角度变化较小,圆的边缘向后移动,而中心变化较大,现在这两个因素之间有关系吗?我试着将原始和目的地之间的差异转换成弧度,然后添加到地图的顶部和底部,但这对我来说并不奏效。请注意,地图投影在虚拟画布上,其宽度从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);

    } 
public void moveMapTo(双目标方向,双目标姿态)//将地图移动到新中心
{
double dXLong=目标纵向中心长度;//中心长度和中心相关长度是当前地图位置的中心
双atanhsinO=atanh(数学sin(目的态度*Math.PI/180.00));
双atanhsinD=atanh(数学sin(中心相关度*Math.PI/180.00));
双阿塔西诺中心=(阿塔西诺+阿塔西诺)/2;
双纬度SPAN=目的地态度-中心相关性;
中心纬度的双弧度=Math.atan(Math.sinh(atanhcenter));
double dXLat=纬度espan/Math.cos(中心纬度的弧度);

dXLat*=getLattitudeSpan()*(Math.PI/180);//这将在很大程度上取决于原始地球图像的投影。如果不知道您使用的特定投影,就不可能生成将图像上的x-y像素距离映射到lat长数字的公式(反之亦然)

如果您使用投影,如,那么您将节省大量时间和精力,因为没有方程可应用:像素距离将与lat long数字线性相关


祝你好运!

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

通过添加缩放的经度或纬度在所有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°到国际日期e(在太平洋),左边是欧洲和非洲,右边是北/南美洲

你也可以上下平移90度。因为在这里环绕没有任何意义,你的部分视图将是空白


这样做的缺点是,您的地图图像的压缩文件大小将是原来的两倍,像素大小将是原来的四倍。您可以通过拼接代码来实现同样的效果,但使用超大尺寸的世界地图要简单得多。

好的,谢谢您的想法,但我使用的是简单的WGS84基准地理投影,即等面积projection看起来不错,但当您在世界坐标和屏幕坐标之间进行转换时,问题就来了。我的平移工作如下:水平: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);正如您可以看到的那样,范围移动了当前视图范围的某个百分比原始帖子发生了什么?