|
|
|
@ -1,139 +0,0 @@
|
|
|
|
---
|
|
|
|
|
|
|
|
title: Внеклассное чтение
|
|
|
|
|
|
|
|
---
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
В этом разделе содержатся дополнительные материалы
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
## Кроме веб-карт
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Определения для продуктов веб-картографии можно получить, добавляя к традиционному определению ГИС, глобуса, атласа “**предназначенный для использования в Интернете**” или “в компьютерных сетях”.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Тогда отличие между, например, веб-ГИС и веб-атласом становится очевидным.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
> Веб-ГИС должна не только визуализировать данные, но и реализовывать функции хранения, передачи, обработки пространственных данных
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Отдельно стоит упомянуть геопортал и картографические веб-сервисы. Их мы формируем от родовых IT-терминов приземляя к картографии и пространственным данным.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
*Геопортал* — это веб-ресурс, предоставляющий доступ к каталогам пространственных данных, наборам пространственных данных, веб-сервисам, публикующим пространственные данные.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
*Картографический веб-сервис* — это веб-ресурс, предоставляющий возможности обращения к пространственным данным или метаданным, в т. ч. по стандартизированным протоколам обмена (WMS, WFS, WCS и т. д.). Картографические веб-сервисы не имеют графического интерфейса, к этим сервисам обращаются программно через API (прикладной программный интерфейс).
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Этими терминами злоупотребляют по отношению к любым веб-ресурсам, связанным с пространственными данными и картами. Правильнее объединить картографические продукты, публикуемые в сети, под названием *картографические веб-ресурсы*. Они являются веб-ресурсами, основным назначением которых является предоставление доступа к картографической информации.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
## Зум, детальность, масштаб
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Вопрос о сопоставлении уровня зума, детальности данных и масштаба карты можно отнести к дискуссионным. Однако в прикладных задачах можно следовать следующим соотношениям.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| Уровень зума | Детальность | Масштаб |
|
|
|
|
|
|
|
|
| ------------ | ----------- | ------------- |
|
|
|
|
|
|
|
|
| z0 | 10 000 м | 1:320 000 000 |
|
|
|
|
|
|
|
|
| z1 | 5000 м | 1:160 000 000 |
|
|
|
|
|
|
|
|
| z2 | 2500 м | 1:80 000 000 |
|
|
|
|
|
|
|
|
| z3 | 1250 м | 1:40 000 000 |
|
|
|
|
|
|
|
|
| z4 | 600 м | 1:20 000 000 |
|
|
|
|
|
|
|
|
| z5 | 300 м | 1:10 000 000 |
|
|
|
|
|
|
|
|
| z6 | 150 м | 1:5 000 000 |
|
|
|
|
|
|
|
|
| z7 | 80 м | 1:2 500 000 |
|
|
|
|
|
|
|
|
| z8 | 40 м | 1:1 250 000 |
|
|
|
|
|
|
|
|
| z9 | 20 м | 1:640 000 |
|
|
|
|
|
|
|
|
| z10 | 10 м | 1:320 000 |
|
|
|
|
|
|
|
|
| z11 | 5 м | 1:160 000 |
|
|
|
|
|
|
|
|
| z12 | 2 м | 1:80 000 |
|
|
|
|
|
|
|
|
| z13 | 1 м | 1:40 000 |
|
|
|
|
|
|
|
|
| z14 | 50 см | 1:20 000 |
|
|
|
|
|
|
|
|
| z15 | 25 см | 1:10 000 |
|
|
|
|
|
|
|
|
| z16 | 15 см | 1:5000 |
|
|
|
|
|
|
|
|
| z17 | 8 см | 1:2500 |
|
|
|
|
|
|
|
|
| z18 | 4 см | 1:1250 |
|
|
|
|
|
|
|
|
| z19 | 2 см | 1:600 |
|
|
|
|
|
|
|
|
| z20 | 1 см | 1:300 |
|
|
|
|
|
|
|
|
| ... | ... | ... |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<!-- ## Стиль программирования карты -->
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
## Тайлы векторные и растровые
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Нельзя сказать, что векторные тайлы легче, быстрее, производительнее, тем более лучше, чем растровые тайлы. Хотя некоторые авторы этим и грешат. Например, векторные тайлы, отображающие множество объектов с богатой атрибутикой, могут весит значительно больше растровых тайлов, а оформление векторных тайлов, тем более динамическое, может привести к замедлению отрисовки карты в браузере.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|

|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Тайл привязан к глобальной системе координат одной точкой. Содержание тайла хранится во внутренней системе координат тайла. Для векторных тайлов это приводит к сложностям в объединении объектов, которые попадают в несколько тайлов сразу: их соединение требует использования вычислительно дорогих операций.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Зато дальнейшая работа с векторными тайлами становится более удобной благодаря возможностям прямого доступа к объектам и их атрибутам для оформления картографических слоёв и организации интерактивной работы с объектами на карте.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Изначально картографические тайловые системы или пирадимы тайлов применялись к растровым изображениям. Растровые тайлы делятся на стороне сервера, передаются в браузер, в браузере выглядят как единое изображение той части карты, которую просматривает пользователь.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Для растровых тайлов сложно обеспечить непрерывное изменение масштаба, интерактивное взаимодействие с объектами требует определения того, какому объекту соответствует тот или иной пиксель, серверная стилизация изображения может создать нагрузку, на которым не хватит вычислительных мощностей при наплыве пользователей.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Векторные тайлы нагружают клиентскую часть. Растровые тайлы нагружают серверную часть.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
У векторных и растровых тайлов есть свои достоинства и недостатки. Выбор конкретного варианта зависит от отображаемых данных, назначения веб-карты, требований к безопасности данных. Векторные тайлы хорошо подходят для объектно-ориентированного картографирования: изображения точек интереса, дорог, границ. Растровые тайлы незаменимый вариант для отображения спутниковых снимков, непрерывных покрытий, данных без возможности прямого доступа к объектам.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
## PostGIS
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Связка Postgres + PostGIS -- это зарекомендовавшее себя открытое решение для работы с пространственными данными в сети.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
PostGIS популярен. Легко найти информацию в сети. Давно используется, соответственно модели будут давать нормальные ответы. Используется как для веб-картографии, так и для аналитики.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
PostGIS универсален. Для большинства случаев связка Postgres + PostGIS оказывается подходящим вариантом. Она проста в обращении, поэтому используется на небольших проектах. Она может работать под нагрузкой с большими объёмами данных, поэтому используется на крупных предприятиях.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
PostGIS избыточен. В случаях, когда к пространственным данным не нужно совершать пространственных запросов, такая связка избыточна, например, нам в первом упражнении было достаточно статических GeoJSON файлов.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
PostGIS не хватает. Не хватает связки Postgres + PostGIS в краевых случаях, например,при необходимости агрегации на лету особо больших объёмов слабоструктурированных данных (десятки и сотни миллионов строк) https://github.com/ClickHouse/adsb.exposed/ или необходимости особо быстрого ответа (Redis)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<!-- ## Как PostGIS формирует тайл -->
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
## Производительность векторных тайлов
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Формирование тайла представляет собой запрос кусочка из полного набора пространственных данных, его перепроецирование и кодирование в векторных тайл.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Такие популярные серверы векторных тайлов, как Martin, Tegola, pg_tileserv, формируют тайл средствами базы данных PostGIS. Увидеть запросы, которые они используют можно в режиме отладки. Изучив запросы видно, что на производительность формирования тайлов влияет
|
|
|
|
|
|
|
|
1. наличие пространственного индекса, так как есть этап запроса кусочка набора данных по границам тайла
|
|
|
|
|
|
|
|
2. проекция исходного набора данных, так как есть этап перепроецирования
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Проверим это на запросах к линейному набору пространственных данных
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
```sql
|
|
|
|
|
|
|
|
-- EPSG:4326 без индекса
|
|
|
|
|
|
|
|
SELECT ((SELECT ST_AsMVT(q,'lines',4096,'geom','fid') AS data FROM (SELECT ST_AsMVTGeom(ST_Transform(geom, 3857), ST_TileEnvelope(6, 37, 20)) as geom, fid FROM lines WHERE geom && ST_TileEnvelope(6, 37, 20)) AS q)) AS data;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
-- EPSG:4326 с индексом
|
|
|
|
|
|
|
|
SELECT ((SELECT ST_AsMVT(q,'lines_index',4096,'geom','fid') AS data FROM (SELECT ST_AsMVTGeom(ST_Transform(geom, 3857), ST_TileEnvelope(6, 37, 20)) as geom, fid FROM lines_index WHERE geom && ST_TileEnvelope(6, 37, 20)) AS q)) AS data;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
-- EPSG:3857 без индекса
|
|
|
|
|
|
|
|
SELECT ((SELECT ST_AsMVT(q,'lines3857',4096,'geom','fid') AS data FROM (SELECT ST_AsMVTGeom(geom, ST_TileEnvelope(6, 37, 20)) as geom, fid FROM lines3857 WHERE geom && ST_TileEnvelope(6, 37, 20)) AS q)) AS data;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
-- EPSG:3857 с индексом
|
|
|
|
|
|
|
|
SELECT ((SELECT ST_AsMVT(q,'lines3857_index',4096,'geom','fid') AS data FROM (SELECT ST_AsMVTGeom(geom, ST_TileEnvelope(6, 37, 20)) as geom, fid FROM lines3857_index WHERE geom && ST_TileEnvelope(6, 37, 20)) AS q)) AS data;
|
|
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| | без индекса | с индексом |
|
|
|
|
|
|
|
|
| ------------------------- | ----------- | ---------- |
|
|
|
|
|
|
|
|
| другая проекция (4326) | 389,4 мс | 3,5 мс |
|
|
|
|
|
|
|
|
| проекция веб-карты (3857) | 13,5 мс | 0,7 мс |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
При запросе тайла на весь мир (фактически всех данных) индекс становится менее существенным.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
```sql
|
|
|
|
|
|
|
|
-- EPSG:4326 без индекса
|
|
|
|
|
|
|
|
SELECT ((SELECT ST_AsMVT(q,'lines',4096,'geom','fid') AS data FROM (SELECT ST_AsMVTGeom(ST_Transform(geom, 3857), ST_TileEnvelope(0, 0, 0)) as geom, fid FROM lines WHERE geom && ST_TileEnvelope(0, 0, 0)) AS q)) AS data;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
-- EPSG:4326 с индексом
|
|
|
|
|
|
|
|
SELECT ((SELECT ST_AsMVT(q,'lines_index',4096,'geom','fid') AS data FROM (SELECT ST_AsMVTGeom(ST_Transform(geom, 3857), ST_TileEnvelope(0, 0, 0)) as geom, fid FROM lines_index WHERE geom && ST_TileEnvelope(0, 0, 0)) AS q)) AS data;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
-- EPSG:3857 без индекса
|
|
|
|
|
|
|
|
SELECT ((SELECT ST_AsMVT(q,'lines3857',4096,'geom','fid') AS data FROM (SELECT ST_AsMVTGeom(geom, ST_TileEnvelope(0, 0, 0)) as geom, fid FROM lines3857 WHERE geom && ST_TileEnvelope(0, 0, 0)) AS q)) AS data;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
-- EPSG:3857 с индексом
|
|
|
|
|
|
|
|
SELECT ((SELECT ST_AsMVT(q,'lines3857_index',4096,'geom','fid') AS data FROM (SELECT ST_AsMVTGeom(geom, ST_TileEnvelope(0, 0, 0)) as geom, fid FROM lines3857_index WHERE geom && ST_TileEnvelope(0, 0, 0)) AS q)) AS data;
|
|
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| | без индекса | с индексом |
|
|
|
|
|
|
|
|
| ------------------------- | ----------- | ---------- |
|
|
|
|
|
|
|
|
| другая проекция (4326) | 544,7 мс | 519,3 мс |
|
|
|
|
|
|
|
|
| проекция веб-карты (3857) | 44,1 мс | 41,2 мс |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Проекция и пространственный индекс позволяют ускорить формирование тайлов, однако наибольший прирост производительности даёт *кэширование*, то есть сохранение результатов запросов.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Если данные меняются редко можно предварительно рассчитать тайлы. Для хранения используются форматы MBTiles и PMTiles.
|
|
|
|
|