Я пытаюсь создать мапсервер, который мог бы, помимо прочего, отвечать на следующий запрос: дай отрисованный рисунок карты если дали текущие координаты и радиус рисунка. Вкратце опишу, что я делаю.
При старте сервера я считываю данные карт из папки с ними и записываю их в базу данных 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);
После этого я просто жду запросов. По 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);
У меня есть вопрос, правильное ли это использование мапника в принципе, документация у мапника скудная и старая, я вообще не уверен, что понимаю как работает zoom_to_box.
Есть ли влияние изначальных констант на дальнейшую карту, или нет? В этой команде
Код: Выделить всё
whole_map_ = mapnik::Map(CANVAS_HEIGHT, CANVAS_WIDTH);
Если попробовать сюда прикрутить разбивку на тайлы, то каким образом это лучше делать? Когда касался этой темы, использовал кривые формулы и получалась картинка, которая не сходится в одну большую.
Делаю всё соответственно на c++, если есть какие то советы по подобному использованию мапника то был бы рад их услышать.