Отображение данных из OSM в Google Earth

Здравствуйте
Есть желание экспортировать дороги, водные объекты, города и ещё пару мелочей в гуглоземлю в виде отдельных слоев, причем исходная карта гуглоземли не должна перекрываться фоном карт OSM. После некоторого раздумья написал веб-сервис на PHP, который по запросу kml-файла подкачивает данные через Overpass API, получившееся с примерами находится тут: http://forum.paradelta.ru/projects/osm/index.php (пока все очень сырое, скорее просто для примера). Желателен именно веб-сервис.

Собственно все было бы хорошо, но гуглоземля тупит и виснет при большом количестве точек в kml. Частично можно выйти из ситуации меняя детализацию выдачи при изменении масштаба, но видимо нужен полноценный рендеринг тайлов с прозрачным фоном. К сожалению в наличии есть только веб-сервер с PHP и MySQL, без прав на установку мапника и т.д. и с довольно ограниченными ресурсами. В вики проекта упоминается некий PHP renderer, судя по описанию он то, что надо, но ссылки на скачивание мертвые.

Как можно решить такую задачу?

Есть сервера Рамблера :wink:

Ну да, есть. А поконкретнее можно?

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

Ух ты! Это было бы прекрасно, тем более там похоже можно напрямую к SQL-серверу обращаться. Спасибо, напишу.

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

Если я бы и стал генерировать тайлы, то без хранилища, просто налету. Медленно, но почему бы и нет? Пользователей изначально предполагалось немного, в предельном случае только я :smiley:

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

С фильтрацией согласен, в существующем виде она необходима. Есть пара идей, постараюсь реализовать как будет время. Просто отбрасывать мелкие дорожки при увеличении масштаба я не согласен, т.к. писал эту штуку именно чтобы видеть весь дорожный граф на большой площади. Я пилот-дельтапланерист, и собственно мне для планирования маршрута надо было знать ответ - может ли в принципе в ту или иную точку проехать машина подбора, или нет. При этом не так уж и важно, будет там автомагистраль или “track”, важна только связность дорожного графа и отсутствие непреодолимых препятствий типа реки.

Варианты фильтрации, которые сразу приходят на ум: при выводе линейного объекта в каждой точке смотреть поворот от предыдущего направления. Если меньше N градусов, точку игнорируем. Так можно без потери информации о наличии дороги и о крупных поворотах неплохо уменьшить детализацию. Однако как я понимаю Земле не нравится не только число точек, но и число самих объектов (placemark в терминологии KML). Можно просто не отрисовывать объект если его линейный размер становится меньше пары пикселов, но тут такая проблема - не может ли быть так, что визуально длинная дорога внутри OSM состоит из нескольких последовательных блоков way, каждый из которых очень мал? Тогда мы выкинем все эти объектики, и исчезнет дорога целиком, хотя должна была бы отобразиться.

Всё уже давно придумано :smiley:
http://ru.wikipedia.org/wiki/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%A0%D0%B0%D0%BC%D0%B5%D1%80%D0%B0_%E2%80%94_%D0%94%D1%83%D0%B3%D0%BB%D0%B0%D1%81%D0%B0_%E2%80%94_%D0%9F%D0%B5%D0%BA%D0%B5%D1%80%D0%B0
Нужно только узловые точки предварительно зафиксировать.

Полностью переписал конвертер, наконец разобрался почему висла гугл земля. Теперь не виснет и работает намного быстрее :slight_smile: Плюс добавил снижение детализации в зависимости от масштаба. Качать там же (ссылка в первом посте).

На рамблере выделили место, но пока не дали доступ к SQL-базе - жду ответа на письмо.

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

P.S. А домики трехмерные забавно смотрятся:

этажность много где проставлена

Возможно, мое демо-приложение окажется полезным для вас. Работает с локальным OSM-файлом.

Стиль отображения настраивается.

Вывод графической информации мгновенно можно перестроить на Google Maps API или Leaflet

Добавил слои с трехмерными зданиями и лесами. Выглядит красиво, хотя и не знаю зачем они нужны :smiley: Отображаются только при больших приближениях, т.к. весят очень много. Картинки кликабельны. Чтобы новые слои появились, надо заново скачать KML-файл.


Спасибо, обязательно посмотрю после праздников.

У меня показывает только дороги. Ни одно здание не отображается, зелень выборочно.
Нашел то же самое место, в Google Earth 7.0.3.8542 выглядит так:

KML-файл брал отсюда http://forum.paradelta.ru/projects/osm/index.php
В чем может быть проблема ? Спасибо.

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

Вот запрос, которым земля получает, например, домики в области на скриншоте: forum.paradelta.ru/projects/osm/osm2kml.php?request=building&BBOX=61.3635378340707,55.15516864647611,61.39288682144441,55.17098098927815

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

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

Вот такой запрос возвращает пустой kmz/kml:
http://forum.paradelta.ru/projects/osm/osm2kml.php?request=building&BBOX=63.02132090158018,52.94588861820916,63.15408517921914,53.00479564897757

Все правильно. Домики подгружаются только совсем-совсем близко. Если быть точным, только если запрос охватывает не более 0.005 кв градуса. Вышеприведенный запрос охватывает площадь 0.01 кв градуса и отсекается как слишком большой. Сообщение об этом не выводится, потому что в противном случае оно бы постоянно мозолило глаза. На зелень лимит 0.05 кв (тоже без сообщения), дороги 1-1.5, реки и озера 5 квадратных градусов, городки и аэропорты 25. По домикам даже на такой небольшой площади в городе ответ от сервера API занимает 2-5 секунд и около 500 кб, если сделать больше - время и размер будут расти в квадрате. А слоев много, и запросов тоже много :slight_smile: Но я работаю над этим, и может быть что-нибудь придумаю.

Увеличивал до предела, включал-выключал слои. Вот этот запрос тоже дает нулевой kmz
http://forum.paradelta.ru/projects/osm/osm2kml.php?request=building&BBOX=63.54523977830566,53.17313056971889,63.66809452754303,53.2316688094914

Я не знаю почему GE дает запрос на такую площадь (охватывает весь город, сотни зданий), смотрю совсем небольшую область:

(added)
Частично решилось - три здания появились только когда сделал вид точно сверху. При малейшем наклоне карты обновление kmz даёт пустоту. Видимо проблема GE.