Использование мапника в клиент-серверном приложении

Не знаете, где задать вопрос? Задавайте здесь.
Ответить
ygroeg
Новоприбывший
Сообщения: 7
Зарегистрирован: 26 авг 2021, 13:08
Репутация: 0
Откуда: Санкт-Петербург

Использование мапника в клиент-серверном приложении

Сообщение ygroeg » 15 окт 2021, 08:19

Вопрос косвенно связанный с ГИС, в основном про техническую часть использования mapnik в проекте.
Я пытаюсь создать мапсервер, который мог бы, помимо прочего, отвечать на следующий запрос: дай отрисованный рисунок карты если дали текущие координаты и радиус рисунка. Вкратце опишу, что я делаю.
При старте сервера я считываю данные карт из папки с ними и записываю их в базу данных Postgres, да, делать это неообходимо заново каждый раз, в силу особенностей ТЗ, делаю это с помощью ogr2ogr. После инциализирую мапник:

Код: Выделить всё

  std::string mapnikDir = "/usr/lib/mapnik/2.2/input";  // mapnik-config --input-plugins
  mapnik::datasource_cache::instance().register_datasources(mapnikDir);
  whole_map_ = mapnik::Map(CANVAS_HEIGHT, CANVAS_WIDTH);
  mapnik::load_map(whole_map_, xml_file);
CANVAS_HEIGHT, CANVAS_WIDTH это константы равные 1024, xml_file это файл со стилями отрисовки для мапника, whole_map_ это приватное поле класса с типом mapnik::Map.

После этого я просто жду запросов. По tcp читаю запрос с координатой и радиусом, высчитываю координты квадрата, обрамлющего эти координаты и радус по формуле по которой можно высчитать координаты точки из заданной точки, по заданному углу и расстоянию (https://www.movable-type.co.uk/scripts/latlong.html параграф про destination point given distance and bearing from start point). И использую квадрат - box так:

Код: Выделить всё

  whole_map_.zoom_to_box(box);
  mapnik::image_32 im(CANVAS_HEIGHT, CANVAS_WIDTH);
  mapnik::agg_renderer<mapnik::image_32> ren(whole_map_, im);
  ren.apply();
  
  mapnik::save_to_file(im, output_file);
Затем отпрвляю байты картинки обратно по tcp.

У меня есть вопрос, правильное ли это использование мапника в принципе, документация у мапника скудная и старая, я вообще не уверен, что понимаю как работает zoom_to_box.
Есть ли влияние изначальных констант на дальнейшую карту, или нет? В этой команде

Код: Выделить всё

whole_map_ = mapnik::Map(CANVAS_HEIGHT, CANVAS_WIDTH);
я вроде бы говорю размеры карты, но потом когда я хочу получить свои картинки я их рендерю такого же размера, не совсем понимаю их смысл вообще.
Если попробовать сюда прикрутить разбивку на тайлы, то каким образом это лучше делать? Когда касался этой темы, использовал кривые формулы и получалась картинка, которая не сходится в одну большую.
Делаю всё соответственно на c++, если есть какие то советы по подобному использованию мапника то был бы рад их услышать.

Ответить

Вернуться в «Я новичок!»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 13 гостей