Создание TIN со структурными линиями в ГИС GRASS: различия между версиями
Amuriy (обсуждение | вклад) мНет описания правки |
м (→TIN в GRASS) |
||
(не показано 27 промежуточных версий 3 участников) | |||
Строка 1: | Строка 1: | ||
{{Статья| | {{Статья|Опубликована|struct-tin-grass}} | ||
{{Аннотация|В статье описан вариант построения TIN со структурными линиями в ГИС GRASS. | {{Аннотация|В статье описан вариант построения TIN со структурными линиями в ГИС GRASS.}} | ||
== Введение == | == Введение == | ||
Триангуляционные нерегулярные сети (англ. "[http://en.mimi.hu/gis/triangulated_irregular_network.html TIN]") часто используются в современных ГИС (и не только ГИС) для создания цифровых моделей рельефа. Такие модели имеют известные преимущества перед растровыми (например, способность совмещать в себе данные | Триангуляционные нерегулярные сети (англ. "[http://en.mimi.hu/gis/triangulated_irregular_network.html TIN]") часто используются в современных ГИС (и не только ГИС) для создания цифровых моделей рельефа. Такие модели имеют известные преимущества перед растровыми (например, способность совмещать в себе данные разного пространственного разрешения). Наиболее распространённый способ построения TIN — триангуляция Делоне. Для более точного моделирования поверхностей применяется метод построения TIN со "структурными линиями" (англ. [http://en.mimi.hu/gis/breakline.html breakline]), которые могут представлять собой, например, тальвеги водотоков или бровки террас, уступы и т.д. (подробнее [http://www.ian-ko.com/resources/triangulated_irregular_network.htm 1], [http://help.arcgis.com/en/arcgisdesktop/10.0/help/index.html#/Fundamentals_of_creating_TIN_surfaces/006000000010000000/ 2]). | ||
Структурные линии в TIN служат для принудительной триангуляции, выполняющейся вдоль них. Существует два основных типа структурных линий: "мягкие" (линии гладкого перегиба) "жёсткие" (линии негладкого перегиба, англ. [http://webhelp.esri.com/arcgisdesktop/9.3/index.cfm?TopicName=Breaklines%20in%20surface%20modeling hard breaklines]). "Жёсткие" структурные линии определяют резкие изменения в уклонах поверхности, в то время как "мягкие" просто включаются в триангуляцию без изменения характера поверхности. | |||
== TIN в GRASS == | == TIN в GRASS == | ||
ГИС GRASS включает модуль [http://grass.gis-lab.info/grass64/manuals | ГИС GRASS включает модуль [http://grass.gis-lab.info/grass64/manuals/v.delaunay.html v.delaunay], который строит триангуляцию Делоне по двух- или трёхмерным точкам, на выходе получается набор двух- или трёхмерных полигонов или линий. Однако, с помощью <v.delaunay> нельзя строить триангуляцию со структурными линиями. | ||
== Модуль GRASS '''v.triangle''' == | |||
Модуль [https://raw.github.com/amuriy/GRASS-scripts/master/v.triangle v.triangle] является попыткой заполнить упомянутый выше функциональный пробел. Он представляет собой shell-скрипт с использованием разных модулей GRASS, стандартных Unix-утилит, <awk> и фактически является "обёрткой" для программы <Triangle>. | |||
= | === Программа <Triangle> === | ||
== | [http://www.cs.cmu.edu/~quake/triangle.html Triangle] — программа для построения двухмерной [http://www.cs.cmu.edu/~quake/triangle.delaunay.html триангуляции Делоне] (в том числе триангуляции с ограничениями и конформной), диаграмм Вороного и качественных полигональных сеток. Написана математиком из университета Беркли Джонатоном Шевчуком (Jonathan Richard Shewchuk). Об опциях программы подробнее можно почитать в объёмном [http://www.cs.cmu.edu/~quake/triangle.help.html мануале] и на [http://www.cs.cmu.edu/~quake/triangle.switch.html специальной] странице. Публикации по используемым методам и алгоритмам даны на странице [http://www.cs.cmu.edu/~quake/triangle.research.html библиографии]. | ||
[http://www.cs.cmu.edu/~quake/triangle.html Triangle] — программа для построения двухмерной [http://www.cs.cmu.edu/~quake/triangle.delaunay.html триангуляции Делоне] (в том числе триангуляции | |||
Последняя версия <Triangle> (1.6) выпущена в 2005 г. Исходный код (на языке программирования С) находится в публичном доступе, | Последняя версия <Triangle> (1.6) выпущена в 2005 г. Исходный код (на языке программирования С) фактически находится в публичном доступе, но не под открытой лицензией , и может свободно использоваться в исследовательских и других некоммерческих целях. | ||
Для триангуляции любых данных с координатами и атрибутами (в том числе, геоданных) с помощью <Triangle> их нужно вначале преобразовать в специальным образом отформатированные текстовые файлы ([http://www.cs.cmu.edu/~quake/triangle.node.html node] и [http://www.cs.cmu.edu/~quake/triangle.poly.html poly]), а затем подать их на вход программе с нужными параметрами. Модуль <v.triangle> работает по следующему алгоритму: | |||
<HR> | <HR> | ||
Исходные | Исходные точки/линии из базы данных GRASS → ASCII → специальное форматирование → '''Triangle''' → разбор текстовых файлов с триангуляцией → импорт TIN в ГИС в виде полигонов (через ASCII). | ||
<HR> | <HR> | ||
=== Описание работы модуля === | === Описание работы модуля === | ||
Для работы скрипта необходим любой современный дистрибутив Linux (тестировался в Ubuntu 10.04), ГИС GRASS версии не ниже 6.4.* и установленная программа <Triangle> (процесс компиляции описан в файле README в [http://www.netlib.org/voronoi/triangle.zip архиве] с исходным кодом). | |||
Строка 31: | Строка 36: | ||
'''На заметку''': | |||
* на момент написания статьи в модуле реализована только триангуляция с "жёсткими" структурными линиями; | |||
* исходные данные (точки и линии) должны быть трёхмерными; | |||
* модуль работает только в областях GRASS с прямоугольной системой координат (в метрах); | |||
* модуль имеет описание на английском языке, ниже даны его параметры на русском языке. | |||
<u>'''Использование:'''</u> | <u>'''Использование:'''</u> | ||
Модуль запускается из командной строки GRASS. Возможен также запуск через интерфейс Tcl/Tk. Для этого вначале необходимо поместить скрипт в каталог, куда установлена GRASS ($GISBASE/scripts) или в каталог с дополнительными модулями (заданный переменной | Модуль запускается из командной строки GRASS. Возможен также запуск через интерфейс Tcl/Tk. Для этого вначале необходимо поместить скрипт в каталог, куда установлена GRASS ($GISBASE/scripts) или в каталог с дополнительными модулями (заданный переменной GRASS_ADDON_PATH). | ||
<br> '''v.triangle''' [-cdqalysif] ''points''=имя [''lines''=имя] ''tin''=имя<br> [''max_area''=имя] [''min_angle''=имя] [''steiner_points''=имя] [''save''=имя]<br><br> | <br> '''v.triangle''' [-cdqalysif] ''points''=имя [''lines''=имя] ''tin''=имя<br> [''max_area''=имя] [''min_angle''=имя] [''steiner_points''=имя] [''save''=имя]<br><br> | ||
<u>'''Флаги:'''</u> | <u>'''Флаги:'''</u> | ||
{| class="wikitable" | {| class="wikitable" | ||
| '''-c''' || конформная триангуляция Делоне с ограничениями (без задания свойств углов и площадей) | | '''-c''' || конформная триангуляция Делоне с ограничениями (без задания свойств углов и площадей) | ||
|- | |- | ||
Строка 73: | Строка 83: | ||
{| class="wikitable" | {| class="wikitable" | ||
|- | |- | ||
| '''''points''''' || входная векторная карта с точками | | '''''points''''' || входная векторная карта с точками (обязательно) | ||
|- | |- | ||
| '''''lines''''' || входная векторная карта со структурными линиями | | '''''lines''''' || входная векторная карта со структурными линиями (опционально) | ||
|- | |- | ||
| '''''tin''''' || выходная векторная карта (TIN) | | '''''tin''''' || выходная векторная карта (TIN) (обязательно) | ||
|- | |- | ||
| '''''max_area''''' || максимальный размер треугольника (использовать с флагом "-а") | | '''''max_area''''' || максимальный размер треугольника (использовать с флагом "-а") (опционально) | ||
|- | |- | ||
| '''''min_angle''''' || минимальный угол для сетки (использовать с флагом "-q") | | '''''min_angle''''' || минимальный угол для сетки (использовать с флагом "-q") (опционально) | ||
|- | |- | ||
| '''''steiner_points''''' || максимальное число точек Штейнера, которые могут быть вставлены в сетку (использовать с флагом "-s") | | '''''steiner_points''''' || максимальное число точек Штейнера, которые могут быть вставлены в сетку (использовать с флагом "-s") (опционально) | ||
|- | |- | ||
| '''''save''''' || путь для сохранения рабочих файлов Triangle (*.node,*.poly,*.edge,*.ele,*.off). По умолчанию используется директория текущей области | | '''''save''''' || путь для сохранения рабочих файлов Triangle (*.node,*.poly,*.edge,*.ele,*.off). По умолчанию используется директория текущей области (опционально) | ||
|} | |} | ||
Запуск через Tcl/Tk: | Запуск через интерфейс Tcl/Tk: | ||
[[ | [[File:V.triangle_tcltk_gui.png|400px|thumb|center|Запуск <v.triangle> в GRASS через интерфейс Tcl/Tk:]] | ||
=== Примеры === | |||
Для примеров использованы данные из стандартной поставки ArcView 3.2: шейп-файлы с точками высот (masspntz.shp) и структурными линиями (brklinz.shp). | |||
* Сравнение участков TIN, построенных с помощью модулей GRASS <'''v.delaunay'''> и <'''v.triangle'''> | |||
Для создания TIN по точкам использована команда: | |||
<syntaxhighlight lang="bash"> | |||
v.delaunay in=masspntz out=tin | |||
</syntaxhighlight> | |||
Для создания TIN | Для создания TIN по точкам и структурным линиям использована команда: | ||
<syntaxhighlight lang="bash"> | <syntaxhighlight lang="bash"> | ||
v.triangle -c points= | v.triangle -c points=masspntz lines=brklinz tin=tin | ||
</syntaxhighlight> | </syntaxhighlight> | ||
[[Файл:Vdelaunay_vtriangle_compare.png|800px|thumb|center|'''Слева''' — исходные данные; '''в центре''' — TIN, построенная только по точкам; '''справа''' — TIN, построенная по точкам и структурным линиям.]] | |||
* Сравнение TIN, построенных в '''ArcView 3D Analyst''' и <'''v.triangle'''> | |||
На рисунке ниже показаны TIN-модели, построенные с помощью ArcView 3D Analyst (слева) и с помощью модуля GRASS <v.triangle> (справа). Как видно, они практически идентичны. | |||
Для создания TIN в GRASS в примере использована следующая команда: | |||
<syntaxhighlight lang="bash"> | |||
v.triangle -c points=masspntz lines=brklinz tin=tin | |||
</syntaxhighlight> | |||
[[Файл:ArcView_GRASS_TIN_breaklines.png|thumb|800px|center|TIN-модели, построенные с помощью ArcView 3D Analyst ('''слева''') и с помощью модуля GRASS <v.triangle> ('''справа''')]] | |||
== Визуализация и обработка TIN == | |||
Построенная в GRASS TIN-модель представляет собой набор топологически корректных 3D-полигонов (центроиды имеют высоту "0", но в общем это не влияет на обработку и визуализацию полигонов). | |||
=== Вывод на экран === | |||
На рисунке ниже отображён участок TIN на графическом мониторе GRASS (красным показаны наложенные сверху структурные линии, синим — вершины треугольников с их высотами). | |||
[[Файл:TIN_on_monitor.png|500px|thumb|center|Вывод TIN с высотами вершин треугольников на графическом мониторе GRASS]] | |||
Можно вывести TIN на экран с "раскраской" по высоте треугольников (модуль [http://grass.gis-lab.info/grass64/manuals/html64_user/d.vect.html d.vect] с флагом "-z" и опцией "zcolor" либо этим же способом через GUI). Для создания эффекта "отмывки" на рисунке ниже использована команда: | |||
<syntaxhighlight lang="bash"> | |||
d.vect -z tin type=area col=none zcol=sepia | |||
</syntaxhighlight> | |||
[[Файл:TIN_on_monitor_colors.png|500px|thumb|center|Вывод TIN с эффектом "отмывки" на графическом мониторе GRASS]] | |||
=== 3D-визуализация === | |||
В GRASS возможна также 3D-визуализация TIN в специальном модуле [http://grass.gis-lab.info/grass64/manuals/html64_user/nviz.html NVIZ]. В его помощью можно не только отображать TIN и накладывать другие векторные данные, но и задавать вертикальный масштаб модели, её расположение относительно растров, параметры освещения, менять цвета и т.д. | |||
При визуализации TIN в NVIZ по умолчанию показываются рёбра треугольников, что практично, но не слишком эстетично. Решить проблему поможет небольшая хитрость, выявленная опытным путём: нужно задать текущий регион так, чтобы он НЕ захватывал TIN (с растрами обычно нужно обратное действие). | |||
Теперь можно запустить NVIZ из командной строки или через GUI, загрузить нашу TIN-модель, настроить цвета/освещение по вкусу и любоваться результатом :) | |||
[[Файл:TIN_NVIZ_clear.png|800px|thumb|center|3D-визуализация TIN в NVIZ.]] | |||
=== Обработка === | |||
С полученной TIN можно производить все те же операции, что и с "обычными" полигонами. НО: т.к. в GRASS в настоящее время отсутствует 3D-топология, то любые действия с геометрией (оверлеи и т.п.) приводят к потере векторами Z-координаты (высоты). | |||
== TODO == | |||
Планируется добавить / сделать: | |||
* | * Поддержку "ограничивающих" полигонов в <v.triangle> (для них в Triangle используется термин "hole"), а также "мягких" структурных линий; | ||
* | * поддержку [http://www.cs.cmu.edu/~quake/triangle.refine.html улучшения TIN/сеток]; | ||
* | * модуль для растеризации TIN; | ||
* | * примеры со свободными данными; | ||
* | * сравнить результаты построения TIN в <v.triangle> с ArcGIS 3D Analyst / AutoCAD Civil 3D / другим ПО; | ||
* переписать на Python для большей кроссплатформенности. |
Текущая версия от 09:39, 3 ноября 2013
по адресу http://gis-lab.info/qa/struct-tin-grass.html
В статье описан вариант построения TIN со структурными линиями в ГИС GRASS.
Введение
Триангуляционные нерегулярные сети (англ. "TIN") часто используются в современных ГИС (и не только ГИС) для создания цифровых моделей рельефа. Такие модели имеют известные преимущества перед растровыми (например, способность совмещать в себе данные разного пространственного разрешения). Наиболее распространённый способ построения TIN — триангуляция Делоне. Для более точного моделирования поверхностей применяется метод построения TIN со "структурными линиями" (англ. breakline), которые могут представлять собой, например, тальвеги водотоков или бровки террас, уступы и т.д. (подробнее 1, 2).
Структурные линии в TIN служат для принудительной триангуляции, выполняющейся вдоль них. Существует два основных типа структурных линий: "мягкие" (линии гладкого перегиба) "жёсткие" (линии негладкого перегиба, англ. hard breaklines). "Жёсткие" структурные линии определяют резкие изменения в уклонах поверхности, в то время как "мягкие" просто включаются в триангуляцию без изменения характера поверхности.
TIN в GRASS
ГИС GRASS включает модуль v.delaunay, который строит триангуляцию Делоне по двух- или трёхмерным точкам, на выходе получается набор двух- или трёхмерных полигонов или линий. Однако, с помощью <v.delaunay> нельзя строить триангуляцию со структурными линиями.
Модуль GRASS v.triangle
Модуль v.triangle является попыткой заполнить упомянутый выше функциональный пробел. Он представляет собой shell-скрипт с использованием разных модулей GRASS, стандартных Unix-утилит, <awk> и фактически является "обёрткой" для программы <Triangle>.
Программа <Triangle>
Triangle — программа для построения двухмерной триангуляции Делоне (в том числе триангуляции с ограничениями и конформной), диаграмм Вороного и качественных полигональных сеток. Написана математиком из университета Беркли Джонатоном Шевчуком (Jonathan Richard Shewchuk). Об опциях программы подробнее можно почитать в объёмном мануале и на специальной странице. Публикации по используемым методам и алгоритмам даны на странице библиографии.
Последняя версия <Triangle> (1.6) выпущена в 2005 г. Исходный код (на языке программирования С) фактически находится в публичном доступе, но не под открытой лицензией , и может свободно использоваться в исследовательских и других некоммерческих целях.
Для триангуляции любых данных с координатами и атрибутами (в том числе, геоданных) с помощью <Triangle> их нужно вначале преобразовать в специальным образом отформатированные текстовые файлы (node и poly), а затем подать их на вход программе с нужными параметрами. Модуль <v.triangle> работает по следующему алгоритму:
Исходные точки/линии из базы данных GRASS → ASCII → специальное форматирование → Triangle → разбор текстовых файлов с триангуляцией → импорт TIN в ГИС в виде полигонов (через ASCII).
Описание работы модуля
Для работы скрипта необходим любой современный дистрибутив Linux (тестировался в Ubuntu 10.04), ГИС GRASS версии не ниже 6.4.* и установленная программа <Triangle> (процесс компиляции описан в файле README в архиве с исходным кодом).
Для установки модуля необходимо:
- сохранить скрипт по ссылке, приведённой выше, в какой-нибудь каталог;
- сделать скрипт исполняемым (например, командой chmod +x ./v.triangle);
- вписать (если нужно) каталог в системный PATH (можно также задать переменную окружения GRASS_ADDONS_PATH).
На заметку:
- на момент написания статьи в модуле реализована только триангуляция с "жёсткими" структурными линиями;
- исходные данные (точки и линии) должны быть трёхмерными;
- модуль работает только в областях GRASS с прямоугольной системой координат (в метрах);
- модуль имеет описание на английском языке, ниже даны его параметры на русском языке.
Использование:
Модуль запускается из командной строки GRASS. Возможен также запуск через интерфейс Tcl/Tk. Для этого вначале необходимо поместить скрипт в каталог, куда установлена GRASS ($GISBASE/scripts) или в каталог с дополнительными модулями (заданный переменной GRASS_ADDON_PATH).
v.triangle [-cdqalysif] points=имя [lines=имя] tin=имя
[max_area=имя] [min_angle=имя] [steiner_points=имя] [save=имя]
Флаги:
-c | конформная триангуляция Делоне с ограничениями (без задания свойств углов и площадей) |
-d | конформная триангуляция Делоне |
-q | генерация качественной полигональной сетки (все углы имеют значения от 20 до 140 градусов) |
-a | ограничение на максимальную площадь треугольника |
-l | использование только вертикальных отрезков в алгоритме "разделяй и властвуй" |
-y | запрещение вставки точек Штейнера на границе сетки |
-s | максимальное число добавляемых точек Штейнера |
-i | использование инкрементального алгоритма для триангуляции Делоне (вместо алгоритма "разделяй и властвуй") |
-f | использование алгоритма "Fortune's sweepline" для триангуляции Делоне (вместо алгоритма "разделяй и властвуй") |
--o | позволять выходным файлам перезаписывать существующие файлы |
--v | подробный вывод модуля |
--q | краткий вывод модуля |
Параметры:
points | входная векторная карта с точками (обязательно) |
lines | входная векторная карта со структурными линиями (опционально) |
tin | выходная векторная карта (TIN) (обязательно) |
max_area | максимальный размер треугольника (использовать с флагом "-а") (опционально) |
min_angle | минимальный угол для сетки (использовать с флагом "-q") (опционально) |
steiner_points | максимальное число точек Штейнера, которые могут быть вставлены в сетку (использовать с флагом "-s") (опционально) |
save | путь для сохранения рабочих файлов Triangle (*.node,*.poly,*.edge,*.ele,*.off). По умолчанию используется директория текущей области (опционально) |
Запуск через интерфейс Tcl/Tk:
Примеры
Для примеров использованы данные из стандартной поставки ArcView 3.2: шейп-файлы с точками высот (masspntz.shp) и структурными линиями (brklinz.shp).
- Сравнение участков TIN, построенных с помощью модулей GRASS <v.delaunay> и <v.triangle>
Для создания TIN по точкам использована команда:
v.delaunay in=masspntz out=tin
Для создания TIN по точкам и структурным линиям использована команда:
v.triangle -c points=masspntz lines=brklinz tin=tin
- Сравнение TIN, построенных в ArcView 3D Analyst и <v.triangle>
На рисунке ниже показаны TIN-модели, построенные с помощью ArcView 3D Analyst (слева) и с помощью модуля GRASS <v.triangle> (справа). Как видно, они практически идентичны. Для создания TIN в GRASS в примере использована следующая команда:
v.triangle -c points=masspntz lines=brklinz tin=tin
Визуализация и обработка TIN
Построенная в GRASS TIN-модель представляет собой набор топологически корректных 3D-полигонов (центроиды имеют высоту "0", но в общем это не влияет на обработку и визуализацию полигонов).
Вывод на экран
На рисунке ниже отображён участок TIN на графическом мониторе GRASS (красным показаны наложенные сверху структурные линии, синим — вершины треугольников с их высотами).
Можно вывести TIN на экран с "раскраской" по высоте треугольников (модуль d.vect с флагом "-z" и опцией "zcolor" либо этим же способом через GUI). Для создания эффекта "отмывки" на рисунке ниже использована команда:
d.vect -z tin type=area col=none zcol=sepia
3D-визуализация
В GRASS возможна также 3D-визуализация TIN в специальном модуле NVIZ. В его помощью можно не только отображать TIN и накладывать другие векторные данные, но и задавать вертикальный масштаб модели, её расположение относительно растров, параметры освещения, менять цвета и т.д.
При визуализации TIN в NVIZ по умолчанию показываются рёбра треугольников, что практично, но не слишком эстетично. Решить проблему поможет небольшая хитрость, выявленная опытным путём: нужно задать текущий регион так, чтобы он НЕ захватывал TIN (с растрами обычно нужно обратное действие).
Теперь можно запустить NVIZ из командной строки или через GUI, загрузить нашу TIN-модель, настроить цвета/освещение по вкусу и любоваться результатом :)
Обработка
С полученной TIN можно производить все те же операции, что и с "обычными" полигонами. НО: т.к. в GRASS в настоящее время отсутствует 3D-топология, то любые действия с геометрией (оверлеи и т.п.) приводят к потере векторами Z-координаты (высоты).
TODO
Планируется добавить / сделать:
- Поддержку "ограничивающих" полигонов в <v.triangle> (для них в Triangle используется термин "hole"), а также "мягких" структурных линий;
- поддержку улучшения TIN/сеток;
- модуль для растеризации TIN;
- примеры со свободными данными;
- сравнить результаты построения TIN в <v.triangle> с ArcGIS 3D Analyst / AutoCAD Civil 3D / другим ПО;
- переписать на Python для большей кроссплатформенности.