Как найти связь между изменением широт в центре карты и сверху / снизу

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

Вопрос

Яm having little trouble finding a relation between the movement at centre and edge of a circle, Iя делаю для панорамирования карты мира, мой экстент карты равен 180,89: -180,-89, моя карта панорамируется путем добавления изменений (dx, dY) к ее экстентам, а не к центру.Теперь возникла ситуация, когда я должен переместить карту в определенный центр, вычислить изменение долгот очень легко, но именно изменение широт вызвало проблему.Кажется, что изменение центра карты больше, чем изменение на краю 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 направлениях путем добавления масштабированной долготы или широты работает только для проекции Меркатора;это то, что у тебя есть?Если так, то хорошо.

Для панорамирования на север и юг, я думаю, единственное, что вы можете сделать, это показать белый (пустой) фон к северу от полюса, если вы панорамировали на север;т. е.вы показываете меньше карты.

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

Я обнаружил, что мой код становится очень простым, если я создаю карту, подобную этой:

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 °.Поскольку обтекание здесь не имело бы никакого смысла, тогда часть вашего представления будет представлять собой пустое пространство.

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

Другие советы

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

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

Удачи вам!

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top