Как найти связь между изменением широт в центре карты и сверху / снизу - PullRequest
2 голосов
/ 11 марта 2010

Я 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 карты больше, чем изменение на краю карты Y, или просто, если мне нужно переместить центр карты с 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);

    } 

Ответы [ 2 ]

1 голос
/ 11 марта 2010

Я решил похожую проблему некоторое время назад и, возможно, смогу дать вам несколько советов.

Панорамирование во всех 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 обозначают Северную Америку, Южную Америку, Европу и Африку, соответственно (здесь карта упрощенно упрощена). ПО - это Тихий океан. Вокруг этой исходной карты я сшил еще одну копию карты по горизонтали и пустое пространство (ws) по вертикали.

Первоначально ваше представление центрируется в 0/0, то есть между NA / SA и EU / AF, и обрезано, чтобы показать вам 90 ° северной и южной, восточной и западной сторон от него, в общей сложности 180 ° в обоих направлениях , Оттуда вы можете поворачиваться на 180 ° к востоку или западу и все еще видеть такое же количество света. Вы можете, например, повернуть 180 ° к востоку от Международной линии дат (в Тихом океане) и увидеть Европу и Африку слева и Северную / Южную Америку справа.

Вы также можете перемещаться вверх и вниз на 90 °. Так как обтекание здесь не имеет никакого смысла, тогда часть вашего обзора будет пустым пространством.

Недостатком является то, что изображение вашей карты будет примерно в два раза больше по размеру сжатого файла и в четыре раза больше по размеру в пикселях. Вы можете добиться того же эффекта, вставив код, но использовать карту мира большого размера немного проще.

0 голосов
/ 11 марта 2010

Это будет сильно зависеть от проекции карты вашего исходного изображения Земли. Не зная конкретной проекции, которую вы используете, невозможно создать и уравнить, который отображает расстояния в пикселях x-y на вашем изображении до длинных чисел по широте (и наоборот).

Если вы используете равную площадь проекцию, такую ​​как Галл-Петерс , то вы сэкономите много времени и уйму времени, так как не существует уравнений для применения: расстояния в пикселях будут относиться линейно к длинным числам.

Удачи!

...