|
В данной главе представлен небольшой пример
использования модуля сетевого анализа 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.
Обсудить в форуме (Комментариев - 0)
Последнее обновление: March 04 2008 (Наверх)
|