Laboratorium II



Pobieranie 80,15 Kb.
Data24.02.2019
Rozmiar80,15 Kb.


Laboratorium II




Temat


Pojęcie generalizacji danych. Podział metod generalizacji danych. Podstawowe pojęcia i algorytmy z geometrii obliczeniowej. Algorytm generalizacji Douglasa-Peuckera. Algorytmy wygładzania obiektów liniowych.

Cel ćwiczenia

Poznanie definicji wraz z podstawowymi rodzajami generalizacji.

Poznanie algorytmu generalizacji Douglasa – Peuckera oraz redukcji liczby wierzchołków

Algorytmy wygładzania obiektów liniowych



Zagadnienia do przygotowania

Podstawowe operacje bazodanowe:

Połączenie z bazą danych, utworzenie nowej tabeli, dodanie nowych kolumn do tabeli, wyświetlenie zawartości (wiersze) tabel.
Strukura plików SHP.

Wiadomości teoretyczne

1. Ogólne wiadomości o generalizacji, podział metod generalizacji


1.1 Podstawowe pojęcia geometrii obliczeniowej
- punkt, odcinek, linia, półprosta (half-line, ray)

- iloczyn wektorowy, skalarny


1.2 Podstawowe algorytmy geometrii obliczeniowej

1.3 Obliczanie:

- reprezentacja prostej

- odległości punktu od prostej


1. Metody generalizacji – upraszczania danych przestrzennych: linii i poligonów

- metoda Douglasa-Peukera

2. Metody wygładzania linii i poligonów
- bezpośrednia, kosinusowa, kwadratowa, krzywe sklejane

Opis zadań


1) Utworzyć zbiór danych mapset a1(2,3,4)_L2 w lokalizacji sperafish60

2) Otworzyć następującą mapę wektorową: streams (roads, railroads)

2) Obliczyć długość poszczególnych obiektów liniowych – segmentów przed upraszczaniem

3) Wykonać operację upraszczania warstwy liniowej metodą Douglasa-Pueckera przy zadanych parametrach.

4) Obliczyć długość poszczególnych segmentów po operacji upraszczania

5) Wykonać ponownie upraszczanie z nowymi parametrami


6) Wykonać wygładzanie linii metodą Hermite’a, Snake

7) Obliczyć długość powstałych segmentów



Sprawozdanie powinno zawierać:

  1. Stronę tytułową (autor, data, nr. zajęc, temat ćwiczeń)

  2. Informacje z zadania I

  3. Obraz warstwy z zadania II

  4. Kod skryptów z zadań III, IV, V

  5. Przykładowe obrazy warstw z różnymi parametrami

  6. Krótki opis stosowanych algorytmów



Wprowadzenie

Opis poleceń systemu GRASS znajduje się pod adresem:


http://grass.itc.it/grass64/manuals/html64_user/full_index.html
Zapoznać się z podstawowymi poleceniami i modułami systemu GRASS
Polecenia wektorowe pod adresem: http://grass.itc.it/grass64/manuals/html64_user/vector.html


Zadanie I

Utworzyć nowy mapset a2(b2,c2,d2) w lokalizacji spearfish60


Odczytać informacje o układzie współrzędnych i odwzorowaniu danej lokalizacji
g.proj -p
Odcztać informacje o obszarze roboczym lokalizacji
g.region -p
Odczytać dostępne pliki wektorowe w poszczególnych lokalizacjach
g.list vect
Odczytane informacje zapisać do pliku sprawozdania.
Wydawne polecenia zapisać w skrypcie info.sh (z1.sh)

Zadanie II

Skopiować plik streams do mapsetu a2(b2,c2,d2).


g.copy vect=streams vect=streams_cp
Wyświetlić informacje o skopiowanych danych :
db.describe table=streams_cp
v.info streams_cp
Zapisać odczytane informacje do sprawozdania.

Wykonać operację utworzenia polilinii na zbiorze streams_cp, wynik zapisać w pliku streams_pl:


v.build.polylines in=streams_cp out=streams_pl

d.vect streams_pl col=red

Usunąć z tabeli streams_pl atrybut kategorii, zapisać w tabeli streams_nocat. Odczytać wynikowe dane z tabeli streams_nocat poleceniem v.category z ustawioną opcją report


v.category input=streams_pl option=del out=streams_nocat

v.category input=streams_nocat option=report
(Drugie polecenie nie powinno wyświetlić danych)
Dodać wartość kategorii dla poszczegółnych obiektów (linii), zaczynająć numerowanie od wartości 1, z krokiem 1, wynik zapisać do pliku streams_lenght:
v.category input=streams_nocat option=add step=1 cat=1 out=streams_length

v.category input=streams_length option=report

Odczytać długość poszczególnych linii (obiektów) z wykorzystaniem polecenia v.to.db (opcja –p: najpierw sam odczyt z obliczeniami):


v.to.db -p streams_length option=length units=k col=cat

Ustalić połączenie z katalogiem plików dbf, wyświetlić dostępne tabele:


db.connect driver=dbf database='$GISDBASE/$LOCATION_NAME/$MAPSET/dbf/'

db.tables -p

Utworzyć tabelę streams_length, odczytać informacje o utworzonej tabeli:


echo "create table streams_length (cat int, length double)" | db.execute

db.describe -c streams_length

v.db.connect -o map=streams_length table=streams_length

#v.db.connect -p streams_length
Dotychczas dane wektorowe były przechowywane w sekcji wektorowej, teraz zostaną przepisane do tabeli streams_length:
v.to.db streams_length option=cat col=cat

v.to.db streams_length option=length col=length

Wyświeltić wynikowy plik poleceniem:


d.vect streams_length display=shape col=blue

cp map.png a.png

Zadanie III

Zapisać wszystkie operacje z zadania II w skrypcie z3.sh pobierającym jako parametr nazwę wejściową analizowanego pliku wektorowego, tworzone nazwy wynikowych plików należy tworzyć poprzez dodowanie odpowiendnich końcówek:

Przy nazwie pliku wejściowego streams:

Np. streams, streams_cp, streams_pl, streams_nocat, streams_length


Przy nazwie pliku wejściowgo roads:

Np. roads, roads_cp, roads_pl, roads_nocat, roads_length


Pliki do wykorzystania i testowania z lokalizacji spearfish60

- streams

- roads

- railroads



Skrypt pobiera:

- nazwę wejściowego pliku wektorowego (warstwa liniowa)

- kopiuje wejściwoy plik do mapsetu pod nazwą np. streams_cp

- wykonuje operacje obliczenia długości obiektów pliku wejściowego, wynik zapisuje do pliku o nazwie np. streams_length, zgodnie z poleceniami zadania II
Nazwy plików pośrednich tworzymy dołączając odpowiednie końcówki, np. streams_pl poleceniem:
input=streams

inputpl=${input}_pl

echo inputpl

Zadanie IV

Wykonać operację upraszczania warstwy streams metodą Douglasa-Peuckera:


v.generalize input=in output=out method=douglas threshold=eps
v.generalize input=streams output=out method=douglas threshold=eps
Parametr eps:

1, 5, 10, 15, 20


Napisać skrypt pobierający nazwę pliku wejściowego, nazwę pliku wyjściowego, metodę (DP, Vertex Reduction), parametr eps (dla DP) oraz threshold dla VR, wykonujący operacje upraszczania z zadanymi parametrami.
Operacja wygładzania:
v.generalize input=in output=out method=hermite threshold=eps angle_thresh=5
v.generalize input=in output=out method=snake alpha=1 beta=1

Napisać skrypt pobierający nazwę pliku wejściowego, metodę (Hermite, Snake), parametr threshold i angle_thresh (dla Hermite) oraz alpha i beta dla Snake, wykonujący operacje wygładzania linii z zadanymi parametrami. Pierwszym parametrem powinna być nazwa pliku wejściwego, drugim parametrem nazwa pliku wynikowego, trzecim metoda wygladzania, pozostałe parametry to paratetry algorytmu wygladzania linii.
Skrypty z4.sh, z5.sh


Zadanie V

Napisać z6.sh skrypt pobierający:

- nazwę wejściowego pliku wektorowego (dane liniowe)

- nazwę metody DP, VR, H, S oraz parametry tych metod


Skrypt powinien skopiować plik wejściowy do roboczego mapsetu pod inną nazwą, wykonać operacje upraszczania lub wygładzania linii zgodnie z podanymi parametrami, zapisać do pliku pod ustaloną nazwą. Następnie należy wykonać z poziomu bieżącego skryptu skrypt z zadania III podając odpowiednie parametry. W wyniku otrzymujemy plik wektorowy z obliczoną oraz zapisaną w pliku dbf w polu length długością poszczególnych obiektów liniowych po operacjach upraszczania (ewentualnie wygladzania).
Skrypt powinien wykonywać operacje podane w parametrach wejściowych, zapisywać wynik do plików z zadania IV oraz III tworząc odpowiednie pliki poprzez dołączanie odpowiednich koncówek do nazwy pliku wynikowego.
Zapisać i obliczyć długość poszczególnych obiektów odczytując do pliku długości obiektów poleceniem:
echo "select length from streams_length" | db.select > a.txt

Na zakończenie wyświetlić wynikowe mapy poleceniem d.vect zwiększając rozdzielczość:



export GRASS_WIDTH=1280

export GRASS_HEIGHT=960

d.vect streams_pl col=red

Przydatne polecenia:


Skrypt z parametrami wywołujemy w następujący sposób np:

./z3.sh streams DP 15


Przypisanie wartości oraz wyświetlenie wartości zmiennej EPS, nazwy skryptu z pierwszym parametrem:

EPS=10

echo "Wartosc zmiennej EPS = " $EPS

echo "Nazwa skryptu = " $0

echo "Pierwszy parametr = " $1
Sprawdznie, czy podano przynajmniej jeden parametr

if [ $# -eq 0 ]

then

echo "$0 : Należy podać przynajmniej jeden parametr"

exit 1

fi
Przypisanie do zmiennej j parametru pierwszego, zwiększenie wartości o 10, wyświetlenie

j=$1

j=`expr $j + 10` (uwaga backquote!!!)

echo $j
Łączenie ciagów znakowych:
input=streams

inputpl=${input}_pl

echo inputpl

Zadanie VI


1) Zaimplementować obsługę pozostałych metod generalizacji / wygładzania obiektów dostępnych z wykorzystaniem polecenia v.generalize:

douglas: Douglas-Peucker

douglas_reduction: Douglas-Peucker z redukcją

lang: Lang

reduction: Vertex Reduction Algorithm (usuwa punkty sąsiadujące)

reumann: Reumann-Witkam Algorithm

remove_small: usuwa linie krótsze od wartości progowej

boyle: Boyle's Forward-Looking Algorithm

sliding_averaging: McMaster's Sliding Averaging Algorithm

distance_weighting: McMaster's Distance-Weighting Algorithm

chaiken: Chaiken's Algorithm

hermite: interpolacja wielomianami Herimte’a

snakes: metoda Snakes do wygładzania linii

displacement: przemieszczenie

2) Zaimplementować obsługę interaktywną polecenia generalizacji:

- w przypadku gdy nie podano parametrów, program pobiera nazwę algorytmu, następnie odpowiednie parametry dla wybranej metody.

3) Zaimplementować wyświetlenie predefiniowanych parametrów, wybór z listy dostępnych parametrów, następnie wykonanie polecenia v.generalize z tymi parametrami.

z3.sh


input=$1
inputcp=${input}_cp

inputpl=${input}_pl

inputnocat=${input}_nocat

inputlen=${input}_length

inputpng=${input}.png
g.copy vect=$input vect=$inputcp

db.describe table=$inputcp

v.info $inputcp

v.build.polylines in=$inputcp out=$inputpl

d.vect $inputpl col=red

v.category input=$inputpl option=del out=$inputnocat

v.category input=$inputnocat option=report

v.category input=$inputnocat option=add step=1 cat=1 out=$inputlen

v.category input=$inputnocat option=report

v.to.db -p $inputlen option=length units=k col=cat

db.connect driver=dbf database='$GISDBASE/$LOCATION_NAME/$MAPSET/dbf/'

db.tables -p

echo "create table $inputlen (cat int, length double)" | db.execute

db.describe -c $inputlen

v.db.connect -o map=$inputlen table=$inputlen

(v.db.connect -p $inputlen)

v.to.db $inputlen option=cat col=cat

v.to.db $inputlen option=length col=length

d.vect $inputlen display=shape col=blue

cp map.png $inputpng



z4.sh


if [ $3 = 'DT' ]; then

mh=douglas

else

mh=reduction



fi
v.generalize input=$1 output=$2 method=$mh threshold=$4

z5.sh


if [ $3 = 'hermite' ]; then

v.generalize input=$1 output=$2 method=hermite threshold=$4 angle_thresh=$5

else

v.generalize input=$1 output=$2 method=snakes alpha=$4 beta=$5



fi

z6.sh


input=$1

inputcp=${input}cp

outxt=${input}.txt

inputpl=${2}_pl

outpng=$2.png
g.copy vect=$input vect=$inputcp
case "$3" in

"VR") ./z4.sh $inputcp $2 VR $4 ;;

"DT") ./z4.sh $inputcp $2 DT $4 ;;

"H") ./z5.sh $inputcp $2 hermite $4 $5 ;;

"S") ./z5.sh $inputcp $2 snakes $4 $5 ;;

esac
./z3.sh $2


sel="select length from $2_length"
echo $sel | db.select > $outxt

export GRASS_WIDTH=1280

export GRASS_HEIGHT=960

d.vect $inputpl col=red



cp map.png $outpng




©operacji.org 2017
wyślij wiadomość

    Strona główna