Клуб API Карт

Карта как набор геообъектов

Пост в архиве.

Здравствуйте!

Есть карта игрового мира, в данный момент представленная в виде набора обычных тайлов. Очень хочется переделать ее в набор линий и полигонов (для оперативности редактирования и дорисовывания).

Единственный подход, который мне видится - хранить в БД описания всех свойств и координат элементов, изображающих поля, леса, дороги, проверять, какие из всех имеющихся в базе объектов видны сейчас на карте и подгружать их. При перемещении карты или смене масштаба удалять с карты все, что вышло за пределы видимости и загружать видимые объекты по-новой (или как-то хитро построить алгорим так, чтобы он учитывал, какие уже видны и догружал новые). При этом элементы, которые частично выходят за пределы зоны видимости, грузить полностью, без отсечек.

Я права или есть какие-то более элегантыне способы решения?

Есть ли какие-то встроенные процедуры отсечки, чтобы не грузить лишнее?

Как я понимаю, в отличие от тайлов, закешировать тут ничего не удастся?

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

Если мне подскажут, в каком направлении копать для оптимизации и минимизации обмена между клиентом и сервером, буду очень благодарна.

7 комментариев

В чем заключается проблема оперативного дорисовывания и редактирования?

У мена нарисована карта, в виде уймы png. если захочу дорисовать дом, дорогу, кусок леса и пр., мне надо дорисовывать это на куче тайлов для всех соответствующих уровней зумов, что весьма неудобно. Куда проще было бы если бы лес был полигоном или дорога линией, тогда просто перевел их в режим редактирования и дорисовал

посмотрите как работает народная карта

там тоже все нарисовано на тайлах,

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

Изменения сохраняются, тайлы перегенеряются для всех зумов.

Кажется что это самый правильный вариант

народная карта как раз и реализует ту идею, которую я хочу - "дорисовка на лету".

другой вопрос - а как оно реализовано-то?

с одной стороны через файербаг я вижу, что мне приходят png файлы с топоосновой. с другой стороны, объекты проявляют интерактивность

что именно со мной взаимодействует - невидимые объекты, наложенные на соответствующие участки топоосновы и получающие фокус?

я дополнила карту и нарисовала рощу. она каким-то образом врисуется в png для этого участка  (каков механизм или доступные функции этого механизма для перегенерации тайлов)?

или полигон рощи останется независимым объектом поверх топоосновы и будет выбираться из БД каждый раз, когда я буду просматривать это место?

 

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

где можно почитать, как она устроена и работает?

upd сейчас у меня есть а) карта в виде набора png файлов для несколькоих уровней, не которых нарисованы леса, реки и дороги

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

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

если же вновь добавленный объект каким-то образом будет внедряться в уже существующий png, да еще оставаться доступным для редактирования, то это будет фантастика :)

народная карта использует технологию "активных областей"

все объекты растеризованы на тайлах

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

 

Взаимодействуете вы с шейпами (смена курсора мыши при наведении и т.п.), а когда начинаете редактировать - изменяете реальную геометрию

При сохранении новая геометрия отправляется на сервер, он генерит новые тайлы для всех масштабов, на которые попадает измененный геообъект

спасибо. есть теперь над чем вдумчиво поразмыслить.

последний только вопрос - каким образом генерятся новые тайлы?

на сервере работает какое-то приложение, которое экспортирует векторные объекты в png?

Можно использовать любую библиотеку, например GD

Есть специальные библиотеки для работы с геоданными типа GEOS

Есть готовые решения из коробки 

типа postgis + mapnik