Comment trouver relation entre le changement dans les latitudes au centre de la carte et haut / bas

StackOverflow https://stackoverflow.com/questions/2422770

Question

Im having little trouble finding a relation between the movement at centre and edge of a circle, Im faire pour panning carte du monde, mon étendue de la carte est 180,89: -180, -89, mes casseroles carte en ajoutant le changement (dx, dy) à ses degrés et non son centre. Maintenant, une situation arrrised où je dois déplacer la carte vers un centre spécifique pour calculer la variation de longitudes est très facile et simple, mais ce changement dans les mers du Sud qui a causé problème. Il semble que le changement centreY de carte est plus que le changement au bord du MAPY, ou tout simplement si je dois déplacer le centre de la carte de 0long, 0lat à 73long, 33lat, pour dX je reçois simplement 73, mais pour dY apparemment regarde 33 mais si j'ajoute 33 en haut de la carte qui est 89, ce sera 122 qui est incorrect car Latitudes sont entre 90 et -90. Il semble le cas d'une projection d'un cercle sur le plan 2D où le bord du cercle se déplace vers l'arrière depuis due à angle expereinces moins de changement et le centre expereinces plus le changement, est à présent il une relation entre ces deux facteurs? J'ai essayé de convertir la différence entre originY et destinationY en radians et puis ajouter au haut et bas de la carte, mais il ne nous gênait pas vraiment travailler pour moi. S'il vous plaît noter que la carte est projet sur un canevas virtuel dont la largeur est à partir de 256 et augmente de 256 * 2 ^ z, z = 0 est sélectionné par défaut et dans le monde entier est visible à l'étendue de la toile

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);

    } 
Était-ce utile?

La solution

Je résolu un problème similaire un certain temps et peut-être en mesure de vous donner quelques conseils.

Panning dans les 4 directions en ajoutant une longitude ou de latitude mis à l'échelle ne fonctionne que pour une projection de Mercator; Est-ce que vous avez? Si oui, bon.

Pour effectuer un panoramique nord et au sud, je pense que la seule chose que vous pouvez faire est de montrer un blanc (vide) fond au nord du pôle si vous avez Enrobés du Nord; à savoir vous montrer moins de la carte.

Pour effectuer un panoramique à l'est et à l'ouest, vous devez remplacer la partie du monde qui est allé offscreen avec le bord enroulé autour du côté opposé.

J'ai trouvé que mon code devient très simple si je crée une carte comme ceci:

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

La partie centrale, en lettres majuscules, est votre carte du monde d'origine: NA, SA, UE et AF se tiennent pour l'Amérique du Nord, Amérique du Sud, en Europe et en Afrique, respectivement (carte grossièrement simplifiée ici). PO est l'océan Pacifique. Autour de cette carte originale que j'ai une autre copie du cousu la carte horizontalement et dans l'espace blanc (ws) verticalement.

Dans un premier temps, votre point de vue est centrée à 0/0, à savoir entre NA / SA et l'UE / AF et clipsée vous montrer 90 ° au nord et au sud et à l'est et à l'ouest de là, pour un total de 180 ° dans les deux sens . De là, vous pouvez effectuer un panoramique jusqu'à l'est de 180 ° ou à l'ouest et de voir toujours la même quantité du monde. Vous pouvez, par exemple un panoramique à 180 ° est à la ligne de changement de date (dans le Pacifique) et de voir l'Europe et de l'Afrique vers la gauche et l'Amérique du Nord / Sud sur la droite.

Vous pouvez également déplacer vers le haut et vers le bas de 90 °. Depuis enroulant autour de ne faire aucun sens ici, une partie de votre point de vue sera alors l'espace blanc.

L'inconvénient est que l'image de votre carte sera environ deux fois plus grande taille de fichier compressé et quatre fois plus grande taille de pixel. Vous pouvez obtenir le même effet par une couture dans le code, mais en utilisant la carte du monde super-taille est un peu juste plus facile.

Autres conseils

Cela dépendra en grande partie de la de href="http://en.wikipedia.org/wiki/Map_projection" de l'image de la terre d'origine. Sans connaître la projection particulière que vous utilisez, il est impossible de produire et équation des cartes de distances de pixels x-y sur l'image vers les numéros lat-longs (et vice-versa).

Si vous utilisez un égale zone projection, comme le Gall-Peters , alors vous allez vous faire économiser beaucoup de temps et tripoter car il n'y a pas d'équations à appliquer:. distances de pixels se rapporteront linéairement aux nombres lat long

Bonne chance!

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top