Здесь можно разместить предложения и пожелания по развитию сайта

"Листание" карт с пощью стрелок

Сообщение Bellevue » 30 янв 2012, 15:45

Думаю, что у всех возникает иногда потребность посмотреть, как выглядела та или иная местность в прошлом. Но для отдаленных от центра районов Москвы тут возникает некоторая проблема: большинство карт не охватывает их. Приходится просматривать множество карт до нахождения тех, в которых есть искомое место. Хорошо было бы сделать так, чтобы "пролистывая" карты с помощью стрелок (около Выбора карты), неинформативные в выбранном районе автоматически пропускались.
Bellevue
 
Сообщения: 32
Зарегистрирован: 19 янв 2012, 15:19

Re: "Листание" карт с пощью стрелок

Сообщение Лемур » 31 янв 2012, 10:28

Совершенно верно отмечено, давно собирался об этом написать. Нужно пропускать карты, на которых нет выбранной точки, равно как и те, масштаб которых явно не позволяет ничего увидеть в этом месте. Более того, как мне кажется, было бы неплохо выдавать что-нибудь типа "рекомендуемые карты" для тех точек, которые находятся на окраинах города или за его пределами.
Аватара пользователя
Лемур
 
Сообщения: 98
Зарегистрирован: 17 июл 2010, 11:12

Re: "Листание" карт с пощью стрелок

Сообщение retromap » 31 янв 2012, 13:40

Bellevue писал(а):...Хорошо было бы сделать так, чтобы "пролистывая" карты с помощью стрелок (около Выбора карты), неинформативные в выбранном районе автоматически пропускались.

Совершенно с Вами согласен, спасибо за пожелание. Сейчас это сделано простейшим образом: например, если вначале была выбрана карта Московской области, то при "пролистывании" карт будут появляться только карты области. Если была вначале выбрана карта города, то, например, карты Московской области или Кремля появляться не будут. Причина довольно банальна: в описании карты нет точного указания на охватываемую ей территорию.

Нужно будет сделать небольшую программу, которая будет анализировать имеющиеся фрагменты карты в базе данных, чтобы определить область покрытия карты. Тогда при пролистывании карт можно будет пропускать карты, не покрывающие выбранную территорию. Однако 100% точности здесь все равно не достигнешь: у некоторых карт широкие поля и рамки, некоторые карты, например, Хотевский план, имеют сложную форму, некоторые имеют врезки и легенды, а программа не может выявлять такие места. Но приближенный анализ покрытия можно сделать.
Аватара пользователя
retromap
 
Сообщения: 3921
Зарегистрирован: 04 дек 2009, 21:17

Re: "Листание" карт с пощью стрелок

Сообщение Bellevue » 31 янв 2012, 14:48

Понятно, что 100% точности не будет. Это не страшно.
Bellevue
 
Сообщения: 32
Зарегистрирован: 19 янв 2012, 15:19

Re: "Листание" карт с пощью стрелок

Сообщение allam » 31 янв 2012, 15:24

Ну уж точно нужно обходить карты с несуразным по отношению к первоначально выбранной карте масштабом, явно превосходящим максимальное разрешение загружаемой карты. Или просто уменьшать масштаб.
allam
 
Сообщения: 95
Зарегистрирован: 14 дек 2009, 21:05

Re: "Листание" карт с пощью стрелок

Сообщение retromap » 04 фев 2012, 15:24

Алгоритм "листания" карт изменен:

  • При листании загружаются только те карты, которые захватывают установленную центральную точку.
  • Пропускаются карты, максимальный масштаб которых ниже выбранного.
Используемый алгоритм, увы, не может определить, когда центральная точка захватывает не саму информативную часть очередной карты, а ее поля и врезки - карта загружается и в таких случаях.

Будем признательны, если сообщите о замеченных ошибках и нелогичностях.
Аватара пользователя
retromap
 
Сообщения: 3921
Зарегистрирован: 04 дек 2009, 21:17

Re: "Листание" карт с пощью стрелок

Сообщение Bellevue » 05 фев 2012, 11:33

Спасибо!
В очередной раз восхищаюсь оперативностью работы команды retromap!
Bellevue
 
Сообщения: 32
Зарегистрирован: 19 янв 2012, 15:19

Re: "Листание" карт с пощью стрелок

Сообщение retromap » 07 фев 2012, 11:41

Bellevue писал(а):Спасибо!
В очередной раз восхищаюсь оперативностью работы команды retromap!

Отмечу, что листание с определением тех карт, которые захватывают нужную точку, оказалось не самой простой задачей. Только третий из испытанных алгоритмов оказался достаточно простым и работоспособным.
Аватара пользователя
retromap
 
Сообщения: 3921
Зарегистрирован: 04 дек 2009, 21:17

Re: "Листание" карт с пощью стрелок

Сообщение Bellevue » 08 фев 2012, 18:17

retromap писал(а): листание с определением тех карт, которые захватывают нужную точку, оказалось не самой простой задачей

А в чем оказалась основная сложность, если не секрет?
Bellevue
 
Сообщения: 32
Зарегистрирован: 19 янв 2012, 15:19

Re: "Листание" карт с пощью стрелок

Сообщение retromap » 08 фев 2012, 23:38

Bellevue писал(а):А в чем оказалась основная сложность, если не секрет?


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

В итоге был выбран алгоритм оценки покрытия "on-line" - прямо при пролистывании делаются попытки считывания центральных тайлов последующих и предыдущих карт, и если сервер находит находит такие тайлы, то такие карты загружаются при пролистывании. В итоге пролистывание немного замедляется (особенно когда много очередных карт не подходят по покрытию), но зато абсолютно точно очередная карта содержит тайл для выбранной центральной точки. Программа пролистывания небольшая, но не самая очевидная. Для любителей погружаться в детали программирования представлю примерно ее половину - поиск следующей карты:

Код: Выделить всё
function load_next_map(side,map_code){
   show_loading();
   var current_map=false;
   for (i=0; i<ordered_map_list.length; i++){
      if (current_map){
         var next = ordered_map_list[i].mcode;
         if (ordered_map_list[i].mclass < 5){
            load_map(side,next,1);
            return;
         }
         else {
            var tile = new Image();
            tile.src = central_tile_url(next);
            tile.side = side;
            tile.next = next;
            tile.onerror = function(){load_next_map(this.side,this.next)};
            tile.onload = function(){load_map(this.side,this.next,1);};               
            return;
         }
      }
      if (ordered_map_list[i].mcode==map_code)
         current_map=true;
   }
   load_map(side,"0020090",1)
}
Аватара пользователя
retromap
 
Сообщения: 3921
Зарегистрирован: 04 дек 2009, 21:17