GIS-LAB

Географические информационные системы и дистанционное зондирование

Учебное руководство по GRASS

12. Пример применения: оптимизация зоны обслуживания на основе векторных данных

<<< предыдущая глава | оглавление | следующая глава >>>

В данной главе представлен небольшой пример использования модуля сетевого анализа v.net.alloc, связанный с новыми особенностями векторных данных.

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

12.1 Импорт данных примера

Как и в некоторых предыдущих примерах здесь будут использоваться бесплатные пространственные данные проекта FRIDA по городу Оснабрюк (Германия): http://frida.intevation.org/. Кроме актуальной дорожной сети данные содержат информацию о доступных водных объектах и парках, а также важных объектах (госпитали, школы и т.д.). Данные представлены в формате Shape-файлов ESRI.

При импорте данных FRIDA в GRASS автоматически происходит создание необходимой области в проекции Гаусса-Крюгера (см. также главу 5.2).

Импорт необходимых SHAPE-файлов осуществляется модулем v.in.ogr (например, для набора данных Spearfish):

# Начать новую сессию GRASS (например, с набором данных Spearfish):
grass60 ~/grassdata/spearfish60/user1/

# Импортировать дорожную сеть с созданием новой области:
v.in.ogr dsn=frida-1.0.1-shp-joined/strassen-joined.shp \
   output=strassen loc=frida
exit # Перезапустить с новой областью: grass60 ~/grassdata/frida/PERMANENT # Импортировать объекты (госпитали, ...): v.in.ogr dsn=frida-1.0.1-shp-joined/poi-joined.shp output=points


Рисунок 25: Базовая карта: дорожная сеть и госпитали города Оснабрюк

Проблемы, связанные с топологией, обычно исправляются при импорте данных с помощью команды v.in.ogr. Если же при импорте данных возникают сообщения об ошибках, например, как это может быть в случае с набором полигональных данных (FRIDA V1.0.1), для их устранения используйте модуль v.clean (см. главу 11.5).

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

# Добавление:
v.category points out=points_2f layer=2 op=add

# Проверка:
v.category points_2f layer=1,2 op=print # -> layer 1 == layer 2

12.2 Получение госпиталей из точечного файла

Следующим шагом из слоя points_2f произведем выборку тех точек, которые обозначены как госпитали:

# Выборка госпиталей:
v.extract in=points_2f out=hospitals_pre type=point\
where="poiTypName='Klinik/Hospital'"
v.select ainput=points_2f binput=hospitals_pre out=hospitals

# Проверка:
v.info hospitals # -> one dblink v.category hospitals layer=1,2 op=print # -> 2 layers d.erase d.vect roads d.vect hospitals disp=attr attr=poiNameID bgcolor=white bcolor=black d.vect hospitals col=red icon=basic/diamond

12.3 Ассоциирование госпиталей с дорожной сетью

На рисунке 25 показана начальная ситуация для вычисления границы зоны оптимизации. Для ассоциирования госпиталей с дорогами необходимо, чтобы они предварительно были интегрированы в дорожную сеть. Также должно быть указано определенное значение, на основе которого с помощью layer 2 затем будут производиться вычисления.

Ассоциирование осуществляется с помощью двух операций. Сначала точечные объекты hospitals (госпитали) объединяются с линейными объектами roads (дороги) в новую карту roads_hospitals, и атрибутивные таблицы связываются друг с другом посредством поля layer.

# Пересечение данных:
v.patch in=roads,hospitals out=roads_hospitals

# Проверка:
v.info roads_hospitals # -> dblinks = 0

d.erase
d.vect roads_hospitals
d.vect roads_hospitals type=point col=red
# определение базы данных (если необходимо) db.connect dr=dbf database='$GISDBASE/$LOCATION_NAME/$MAPSET/dbf/' # показать на экране атрибутивную информацию объектов db.describe -c roads ncols:7 Column 1: cat Column 2: strShapeID Column 3: strID Column 4: strTypID Column 5: strSpuren Column 6: strEbene Column 7: strName # -> Столбец 'cat' был добавлен при импорте данных с помощью 'v.in.ogr'. # Связать атрибутивную информацию линейной темы с новым слоем v.db.connect roads_hospitals dr=dbf \ data='$GISDBASE/$LOCATION_NAME/$MAPSET/dbf/' \ table=roads layer=1 key=cat # Связать атрибутивную таблицу точечной темы с новым слоем v.db.connect roads_hospitals dr=dbf \ data='$GISDBASE/$LOCATION_NAME/$MAPSET/dbf/' \ table=hospitals layer=2 key=cat # Проверка: v.db.connect -p roads_hospital

Примечание:
Учтите, что если карта roads_hospitals будет удалена, удалятся и все связанные с нею атрибутивные таблицы – атрибутивные таблицы тем hospitals и roads (см. главу 10.3). Избежать этого можно путем копирования атрибутивных таблиц, с которыми производится связывание.

Далее госпитали и дорожная сеть автоматически связываются и сохраняются в новой карте roads_hospitals:

# Создать связывающие линии между госпиталями и дорогами:
v.distance -p from=hospitals to=roads output=roads_hospitals_connect\
upload=dist column=dist

# Связать соединяющие линии с самими госпиталями и дорогами:
v.patch in=roads_hospitals,roads_hospitals_connect out=hospitals_net_pre

# Корректировать топологию
v.clean in=hospitals_net_pre out=hospitals_net tool=break,snap

# Почистить
g.remove vect=hospitals_net_pre,hospitals_pre

Итак, создана карта hospitals_net, включающая дорожную сеть, госпитали и связывающие их линии. Кроме того, с помощью layer 2 госпиталям назначена информация о категории. Эти категории используются как отправные точки при вычислении доступности госпиталей.

12.4 Назначение зон оптимальной доступности

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

Как уже было отмечено, мы рассматриваем самый простой способ определения зон оптимальной доступности – без учета дополнительных факторов, таких как скорость или направление движения. В нашем случае возможные дополнительные параметры воображаемы, но могут быть назначены модулю v.net.alloc через дополнительный столбец:

v.net.alloc input=hospitals_net output=hospitals_alloc ccats=40-215

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


Рисунок 26: Назначение наиболее доступных дорог госпиталям

На рисунке 26 представлена итоговая карта к данному примеру. Этот результат можно отразить интерактивно с помощью d.m или командой d.vect:

d.vect map=hospitals_alloc color=red cats=40
d.vect map=hospitals_alloc color=green cats=41
d.vect map=hospitals_alloc color=blue cats=69
...
d.vect map=hospitals_alloc color=black cats=215

В целом, GRASS предлагает пять разных сетевых модулей, коротко представленных в главе 11.1. Они используются похожим образом, поэтому данный пример показателен и для других модулей v.net.x.

<<< предыдущая глава | оглавление | следующая глава >>>

Обсудить в форуме Комментариев — 3

Последнее обновление: March 23 2009