@mikolkin

Можно ли сделать картографический сервис с SVG файлом более 20 мб?

Стоит задача сделать небольшой сайт для изучения и проверки знания карты школьниками.
Есть векторная карта в SVG, которая подходит под задачи, но весит она более 20 мб и пока непонятно как с таким весом что-то нормальное сделать.
Вопрос в том, можно ли с такой картой что-то сделать или проще воспользоваться OSM или API яндекс карт?
5f988de083283427814079.jpeg
  • Вопрос задан
  • 168 просмотров
Решения вопроса 1
trapwalker
@trapwalker
Программист, энтузиаст
Там 20 мегабат векторных данных? Не такая уж и большая проблема, если она у вас быстро рендерится и по содержанию устраивает. Вы бы показали сам svg. тогда было бы понятнее. Может там обычный растр, но каждый пиксель цветным прямоугольником свёрстан в svg, мало ли...
В любом случае, что-то мне подсказывает, что вам не требуется именно в векторе вся физическая карта. Что вы там показывать предлагаете? Реки? Моря? Горы? Может быть отрендерить карту в растр всю или отдельные слои, а сверху положить контуры областей для интерактивного взаимодействия.

Посмотрел упомянутый SVG и да, это долго и больно ждать пока он отрендерится браузером весь. В любом случае придётся его как-то либо сегментировать, либо расслаивать.
Я бы вам порекомендовал посмотреть в сторону NextGIS Web. Исходники есть на гитхабе.
Но ребята барыжат и данными, и советами, и помощью в импорте геоданных из OSM, хотя там ничего особо сложного и нет.
Из полезного вам, там есть поддержка растровых и, вроде бы, векторных подложек, можно настроить свой сервер рендера тайлов. Кроме того они поддерживают слои и выделения. В том числе геоданные в слоях вполне могут быть невидимы, а минимальным кодом можно сделать свою выдачу подсвеченных объектов по клику на карте. При этом данные будут запрашиваться с сервера, а не храниться полным набором локально что делает работу с картами быстрее в плане первичной загрузки и рендера.

Ещё из полезного. НекстГИС умеет подключаться к Postgres (postgis) и брать геоданные оттуда напрямую. Позволяет делать несложный рендер объектов (контуры, заливки), боее сложные стили я не пробовал. но этого достаточно. чтобы подсветить полупрозрачным выделением какой-нибудь бассейн Амазонки или Кордильеры. Добавляя слои вы без дополнительного программирования и специальной обработки данных сможете добавлять на свою карту новые объекты. Конечно всё это можно реализовать и на чистом лифлете.

В общем выбросьте свою svg-шку, предварительно нстроив в том же QGIS стиль, который будет копировать оформление этой карты. Может ыть стоит поискать готовый стиль, ведь наверняка уже кто-то озадачивался уже этой идеей. Потом настойте талйовый сервер, который будет генерить вам подложку в этом стиле и вы получите быстрый просмотрщик карты. Использовать ли NextGIS или пилить своё на leaflet'e (либо аналогах) - дело ваше, по райней мере можно подсмотреть что у них там как.
Импортируйте снапшот OSM себе в локальную БД, можно отфильтровать ненужное, а можно и не фильтровать, если есть место. Я бы пофильтровал, у вас задача довольно узкая, но нужен весь шарик. К чему вам тогда детальная геометрия улочек и домов всех отрисованных захолустий планеты?
Наверно весь необходимый вам объём влезет в пару сотен метров, если не упарываться сильно с фильтрацией, а может и меньше.
Старайтесь использовать стандартные протоколы передачи гео-данных. NextGIS поддерживает WMS из коробки, но можно найти и плагин для лифлета. Можно, кстати, остановитьс яи на голом GeoJSON, если не использовать NextGIS пилить свой бэкенд к вашей карте. то искат, агрегировать и выдавать нужную геометрию в GeoJSON умеет postgis из коробки посредством чистого SQL.

Итак. Резюмируем варианты:
1) NextGIS - и вы получаете:
- работу с геоданными и слоями на пользовательском уровне,
- достаточно понятное место в исходниках бэка, куда можно вписать свою логику выборки данных,
- лютый гемор (если ребята не доилили свои фронтовые решения) с модификацией фронтенда некстгиса под свои задачи;
- профессиональну подготовку данных и консультации (правда платно, но не дорого), у них в портфолио есть задачи и похлеще вашей.
2) Бэк на каком-нибудь Flask или ноде, который будет отрабатывать API клика по карте и отдавать при необходимости geojson, доставая его из postgis через SQL. Растровые тайлы рендерить стандартными сревисами рендера. благо их много. Единственное. что повозитесь с подгонкой стиля, но если онне критичен, то можно взять сторонние сервисы.
3) Порежьте ваш svg на векторные или растровые тайлы, но с уменьшением детализации на мелких масштабах, чтобы показывать на фоне через лифлет, а сверху кладите отдельный GeoJSON с реками, с горами или с чем вам там надо для каждого конкретного случая. Это самый трудоёмкий, на мой взгляд, вариант, и самый труднорасширяемый в дальнейшем.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы