6.2. Занятие: Векторный анализ

Векторные данные также можно анализировать, чтобы узнать, как различные объекты взаимодействуют друг с другом в пространстве. Есть множество различных функций, связанных с анализом, но мы не будем их все рассматривать. Мы лучше зададим вопрос и попытаемся найти на него ответ с помощью инструментов QGIS.

Цель этого урока: Задать вопрос и решить его с помощью инструментов анализа.

6.2.1. basic Процесс GIS

Перед тем как начать было бы хорошо сделать краткий обзор процесса, который надо пройти для решения проблемы. Он представлен ниже:

  1. Обозначить проблему.

  2. Получить данные.

  3. Проанализировать проблему.

  4. Представить результаты.

6.2.2. basic Проблема

Начнем с определения проблемы, которую нужно решить. Например, вы являетесь агентом по продаже недвижимости и ищете жилое помещение в Свеллендаме / Swellendam для своих клиентов со следующими критериями:

  1. Жилое помещение должно находиться в Swellendam.

  2. Оно должно находиться в пределах умеренного расстояния от школы  (например, 1 км).

  3. Его площадь должна быть более 100 квадратных метров.

  4. Находиться на расстоянии менее чем 50 метров от главной дороги.

  5. Находиться на расстоянии менее чем 500 метров от какого-нибудь ресторана.

6.2.3. basic Данные

Чтобы ответить на эти вопросы, нам нужны следующие данные:

  1. Жилые помещения (здания) в этом районе.

  2. Дороги внутри города и вокруг него.

  3. Месторасположение школ и ресторанов.

  4. Размер зданий.

Эти данные можно получить через OSM (OpenStreetMap) и вы узнаете, что набор данных, который вы использовали в этом руководстве, также можно использовать для выполнения этого урока.

Если вы хотите загрузить данные из другой местности, перейдите в Раздел Введение и ознакомьтесь, как это можно сделать.

Примечание

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

6.2.4. basic Идем дальше: Начать проект и получить данные

Сначала нам надо загрузить данные, с которыми мы будет работать.

  1. Начать новый проект QGIS.

  2. Если хотите, можете добавить фоновую карту. Откройте Browser и загрузите фоновую карту OSM из меню XYZ Tiles.

    ../../../_images/osm_swellendam.png
  3. В базе данных Geopackage training_data.gpkg вы сможете найти большинство наборов данных, которые мы будем использовать в это разделе:

    1. buildings

    2. roads

    3. restaurants

    4. schools

    Загрузите их, а также landuse.sqlite.

  4. Увеличьте масштаб слоя, чтобы увидеть Свеллендам в Южной Африке.

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

    Некоторые дороги в наборах данных OSM перечислены как unclassified, tracks, path, а также footway. Нам надо исключить их из нашего набора данных и сосредоточиться на других типах дорог, которые больше подходят для этого упражнения.

    Кроме того, не все данные OSM могут быть актуализированы и мы также надо исключить значения NULL.

  5. Кликните правой кнопкой мыши на слой roads и выберите Filter….

  6. В диалоговом окне, которое появится, мы должны отфильтровать эти объекты с помощью следующего выражения:

    "highway" NOT IN ('footway', 'path', 'unclassified', 'track') AND "highway" IS NOT NULL
    

    Объединение двух команд NOT и IN исключает все объекты, которые имеют эти атрибуты значений в поле highway.

    IS NOT NULL в сочетании с AND исключает дороги, не имеющие значения в поле highway.

    Примечание: значок indicatorFilter рядом со слоем roads. Он поможет вам запомнить, что на этом слое активирован фильтр и потому некоторые функции могут быть недоступны в проекте.

Карта со всеми данными должна выглядеть следующим образом:

../../../_images/osm_swellendam_2.png

6.2.5. basic Попробуйте сами: Сконвертировать ССК слоев

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

У вас появится много различных опций, например, вы сможете экспортировать каждый слой как набор данных формата ESRI Shapefile, вы можете добавить слои в существующий файл GeoPackage или создать другой файл GeoPackage и заполнить его новыми пере-проецированными слоями. Мы покажем последнюю опцию, чтобы training_data.gpkg остался чистым. Вы сможете выбрать для себя свой лучший рабочий процесс.

Примечание

На этом примере мы используем ССК WGS 84 / UTM zone 34S, но вы должны использовать UTM ССК, который больше подходит для вашего региона.

  1. Кликните правой кнопкой мыши на слой roads в панели Layers.

  2. Кликните Export –> Save Features As…

  3. В диалоговом окне Save Vector Layer As выберите GeoPackage в качестве Format.

  4. Кликните на для File name и назовите новый GeoPackage vector_analysis.

  5. Изменить Layer name на roads_34S.

  6. Измените CRS на WGS 84 / UTM зону 34S.

  7. Кликните на OK:

    ../../../_images/save_roads_34S.png

    Это позволит создать новую базу данных GeoPackage и добавить слой roads_34S.

  8. Повторите этот процесс для каждого слоя, создав новый слой в vector_analysis.gpkg файле GeoPackage с _34S как приложение к исходному названию и убрав каждый из старых слоев из проекта.

    Примечание

    Когда вы решите сохранить слой в существующий GeoPackage, QGIS добавит этот слой в GeoPackage.

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

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

6.2.6. basic Идем дальше: Анализируем проблемы: расстояние от школ и дорог

QGIS позволяет рассчитывать расстояния между любыми векторными объектами.

  1. Удостоверьтесь в том, что только слои roads_34S и buildings_34S были видны (для упрощения карты во время работы).

  2. Кликни на Processing ► Toolbox для того, чтобы открыть аналитическое ядро ​​QGIS. В основном, в этом наборе инструментов имеются все алгоритмы (для векторного и растрового анализа).

  3. Мы можем начать рассчитывать площади вокруг roads_34S используя алгоритм Buffer. Вы можете найти его в группе Vector Geometry.

    ../../../_images/processing_buffer_1.png

    Или вы можете набрать в меню поиска buffer в верхней части панели инструментов:

    ../../../_images/processing_buffer_2.png
  4. Два раза кликните по нему, чтобы открыть диалоговое окно алгоритма.

  5. Выбираете roads_34S в качестве Input layer, указываете Distance до 50 и используйте значения по умолчанию для остальных параметров.

    ../../../_images/vector_buffer_setup.png
  6. По умолчанию Distance измеряется в метрах, потому что наш входной набор данных находится в системе координат проекции, которая использует метр в качестве основной единицы измерения. Вы можете использовать поле со списком, чтобы выбрать другие проецируемые единицы, такие как километры, ярды и т.д.

    Примечание

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

  7. По умолчанию при обработке создаются временные слои и они добавляется в панель Layers. Вы также можете приложить результат в базу данных GeoPackage:

    1. Нажав на кнопку и выбрав Save to GeoPackage…

    2. Назвав новый слой roads_buffer_50m.

    3. Сохранив его в файле vector_analysis.gpkg.

    ../../../_images/buffer_saving.png
  8. Кликните на Run, а затем закройте диалоговой окно Buffer.

    Ваша карта теперь будет выглядеть примерно так:

    ../../../_images/roads_buffer_result.png

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

Обратите внимание, что в вашем буфере есть отдельные местности, соответствующие каждой отдельной дороге. Чтобы устранить эту проблему необходимо:

  1. Убрать надпись roads_buffer_50m в слое и снова создать буфер с включённой Dissolve results командой.

    ../../../_images/dissolve_buffer_setup.png
  2. Сохраните выход как roads_buffer_50m_dissolved.

  3. Кликните на Run и закройте диалоговой окно Buffer.

После того, как вы добавили слой в панель Layers, она будет выглядеть так:

../../../_images/dissolve_buffer_results.png

Теперь лишних делений уже нет.

Примечание

Краткая справка (помощь) в правой части диалогового окна объясняет, как работает алгоритм. Если вам нужна дополнительная информация, просто кликните на кнопку Help в нижней части, чтобы открыть более подробное руководство по алгоритму.

6.2.7. basic Попробуйте сами: Расстояние от школ

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

Указать 1 km в радиусе. Сохраните новый слой в файле vector_analysis.gpkg как schools_buffer_1km_dissolved.

Проверьте свои результаты

6.2.8. basic Идем дальше: Зоны перекрытия

Теперь мы определили местности, где дорога находится на расстоянии менее чем в 50 метрах, а также местности, расположенные от школы в пределах 1 км (по прямой линии, а не по дороге). Естественно нам нужны только те местности, которые отвечают обоим этим критериям. Для этого нам нужно будет использовать инструмент Intersect. Вы сможете найти его в группе Vector Overlay в Processing Toolbox.

  1. Используйте два буферных слоя как Input layer и Overlay layer выберите vector_analysis.gpkg GeoPackage в Intersection с Layer name road_school_buffers_intersect. Остальное оставьте как предлагается (по умолчанию).

    ../../../_images/school_roads_intersect.png
  2. Кликните на кнопку Run.

    На изображении ниже местности, окрашенные синим цветом это те местности, где оба соответствия по критериям расстояния соблюдены.

    ../../../_images/intersect_result.png
  3. Вы можете убрать два буферных слоя и оставить только тот, который показывает, где они перекрываются, так как мы действительно хотели это выяснить в первую очередь:

    ../../../_images/final_intersect_result.png

6.2.9. basic Идем дальше: Извлечение зданий

Теперь у вас есть местность, на которой здания должны перекрывать друг друга. Теперь вам надо извлечь здания в этой местности.

  1. Ищите пункт в меню Vector Selection ► Extract by location в Панели инструментов обработки.

  2. Выберите buildings_34S в Extract features from. Проверьте intersect в Where the features (geometric predicate), выберите буферный слой пересечения в By comparing to the features from. Сохраните в vector_analysis.gpkg и назовите слой well_located_houses.

    ../../../_images/location_select_dialog.png
  3. Кликните на кнопку Run и закройте диалоговое окно.

  4. Вы, скорее всего, обнаружите, что мало что изменилось. Если так, переместите слой well_located_houses в верхнюю часть списка слоев, затем увеличьте масштаб.

    ../../../_images/select_zoom_result.png

    Здания красным цветом отвечают нашим критериям, а зеленым - нет.

  5. Теперь у вас два отдельных слоя и вы сможете убрать buildings_34S из списка слоев.

6.2.10. moderate Попробуйте сами: Дальше отфильтровать наши здания

Теперь у нас есть слой, который показывает нам все здания в пределах 1 км от школы и в пределах 50 м от дороги. Нам теперь надо сократить этот отбор и показать только те здания, которые находятся в пределах 500 м от ресторана.

Следуя процессам, описанным выше, вам надо создать новый слой, который будет называться houses_restaurants_500m и который дополнительно профильтрует ваш слой well_located_houses для того, чтобы показать только те, которые находятся в пределах 500 м от ресторана.

Проверьте свои результаты

6.2.11. basic Идем дальше: Выбираем здания подходящего размера

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

  1. Выберите слой houses_restaurants_500m и откройте Калькулятор поля, нажав на кнопку calculateField Open Field Calculator на главной панели инструментов или в окне таблицы.

  2. Выберите Create a new field, установите Output field name на AREA, выберите Decimal number (real) как Output field type, и выберите $area из группы Geometry.

    ../../../_images/buildings_area_calculator.png

    В новом поле AREA будет площадь каждого здания в квадратных метрах.

  3. Кликните на OK. Поле AREA добавлено в конце таблицы атрибутов.

  4. Кликните мышкой на кнопку toggleEditing Toggle Editing для того, чтобы завершить редактирование и сохраните ваши изменения при появлении запроса.

  5. Во вкладке Source в свойствах слоя установите Provider Feature Filter на "AREA >= 100.

    ../../../_images/buildings_area_query.png
  6. Кликните на кнопку OK.

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

6.2.12. basic Попробуйте сами

Сохраните ваш вариант как новый слой, следуя подходу, которому вы научились выше. Файл должен быть сохранен внутри той же базы данных GeoPackage с названием solution.

6.2.13. В заключении

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

6.2.14. Что дальше?

На следующем уроке мы изучим, как рассчитать наикратчайшее расстояние по дорогам от одной точки до другой.