powrót

Zadanie GEO


To zadanie zostało wykonane przez - Marek Białousz.
Przedstawiono:
--- Zadania geodezyjne w bazach danych postgreSQL oraz elasticsearch.
--- Czas wykonania oraz ilość zużytych zasobów.
--- Opis danych oraz instrukcja.

Informacje o danych

Plik zawiera najnowsze dane (luty 2017) Krajowych Statystyk wyszukiwania kodu pocztowego dla Wielkiej Brytanii.
National Statistics Postcode Lookup (Latest) Centroids
Rozmiar: > 902 MB
Ilość: 2593613


Instalacja i konfiguracja oprogramowania

PostgreSQL

Baza, na której odbywały się badania - postgreSQL.
Link do pobrania - TUTAJ.

Jdk

Do badań na bazie elasticsearch potrzebny jest jdk.
Link do pobrania - TUTAJ.
Konfiguracja zmiennych środowiskowych:

Panel sterowania -> System -> Zmień ustawienia -> Zaawansowane (zakładka) -> Zmienne środowiskowe...

W zmienne systemowe szukamy zmiennej JAVA_HOME oraz sprawdzamy czy ścieżka jest ustawiona na zainstalowany przez z nas jdk.
Jeśli nie, zaznaczamy zmienną, klikamy Edytuj... oraz zmieniamy ścieżkę i ponownie uruchamiamy komputer.

Jq

W pracy konieczne będzie przekształcenie danych . Konieczna jest instalacja frameworka Chocolatey oraz narzędzia jq.
Polecenia w cdm (tryb administratora):

@powershell -NoProfile -ExecutionPolicy Bypass -Command "iex ((New-Object System.Net.WebClient).DownloadString('https://chocolatey.org/install.ps1'))" && SET "PATH=%PATH%;%ALLUSERSPROFILE%\chocolatey\bin"
Następnie:
chocolatey install jq

Python

Python będzie potrzebny do uruchomienia skryptów.
Link do pobrania - TUTAJ.


PostgreSQL

Utworzenie tabeli

Aby uruchomić serwer, trzeba przejść do pliku binarnego postgreSQL'a, polecenie w konsoli cmd:

cd [ścieżka gdzie jest zainstalowany postgreSQL]\PostgreSQL\9.6\bin
Logowanie jako domyślnie utworzony użytkownik postgres polecenie:
psql -U postgres
oraz podajemy hasło które ustawiliśmy przy instalacji postgreSQL'a.

Import danych

1. Pobrać dane

2. Pobrać skrypt
Skrypt trzeba umieścić w folderze z danymi. Jest on potrzebny, ponieważ usunie znaki, które nie są kodowane w windows-1250 w cmd.

py s1.py
3. Pobrać pgfutter, oraz zamień nazwę pobranego pliku na pgfutter.exe.
Następnie zaimportować dane do postreSQL'a (wszystkie pliki w tym samym katalogu):
pgfutter --pass "[hasło]" --table "test" csv map.csv

Zużycie zasobów komputera podczas importu danych ukazuje poniższa grafika.
Import danych do postreSQL


Cały proces trwał ok. 4 min.
Po zakończeniu importu pojawił się komunikat o ilości zaimportowanych wierszy.
Import danych do postgreSQL

Przykładowy rekord

1. Należy uruchamić serwer

cd [ścieżka gdzie jest zainstalowany postgreSQL]\PostgreSQL\9.6\bin
2. Trzeba się zalogować.
psql -U postgres


3. Polecenie aby wyświetlić przykładowe dane:

select * from import.test limit 1;
Wynik zapytania:
Przykładowy rekord postreSQL

Zapytania geodezyjne

Aby korzystać z zapytań geodezyjnych należy pobrać PostGis - LINK
Należy zmienić nazwy kolumn
- x na longitude

alter table import.test rename x to longitude;
- y na latitude
alter table import.test rename y to latitude;
Przykładowe zapytanie, które tworzy poligon w: [-2.1, 57.15],[-2.19,57.25],[-2.20,57.35]
select * from import.test where ST_MakeEnvelope(-2.1, 57.15, -2.19, 57.25, -2.20, 57.35);

Elasticsearch

Przekształcenie danych

Pobierz plik z danymi (.geojson) - LINK

Plik z danymi, wymaga zmiany nazwy gdyż nie może zawierać znaków takich jak: _. Można zamienić nazwę na map.geojson.
Polecenie, aby przekształcić pole features z pobranego pliku:

jq ".features[] | (.geometry.coordinates | map( .*1000|floor|./1000)) as $l | .properties |= .+ {location: $l} | .properties" map.geojson > mapPom.geojson
Zużycie zasobów komputera.

Zasoby komputera podczas przekształcania danych


Wykonanie polecenia trwało 30 minut.

Następnie należy wydać polecenie:
< mapPom.geojson jq --compact-output "{ \"index\": { \"_type\": \"test\" } }, ." > mapPom.bulk
Tutaj dane zostały szybko przekształcone.


Import danych

1. Teraz trzeba pobrać ElasticSearch - LINK
2. Uruchom serwer w konsoli cmd

[ścieżka gdzie znajduje się pobrany elasticsearch]\elasticsearch-5.3.0\bin\elasticsearch.bat
3. Trzeba pobrać narzędzie Curl - LINK
4. Plik binarny (.exe) skopiować do folderu roboczego
5. W nowej konsoli należy stworzyć bazę danych z mappingiem:
curl -XPUT http://localhost:9200/test -d "{\"mappings\": {\"place\": {\"properties\": {\"objectid\": {\"type\": \"integer\"},\"pcd2\": {\"type\": \"string\"},\"pcds\": {\"type\": \"string\"},\"dointr\": {\"type\": \"string\"},\"oseast100m\": {\"type\": \"string\"},\"osnrth100m\": {\"type\": \"string\"},\"oscty\": {\"type\": \"string\"},\"odslaua\": {\"type\": \"string\"},\"oslaua\": {\"type\": \"string\"},\"osward\": {\"type\": \"string\"},\"usertype\": {\"type\": \"string\"},\"osgrdind\": {\"type\": \"string\"},\"ctry\": {\"type\": \"string\"},\"oshlthau\": {\"type\": \"string\"},\"gor\": {\"type\": \"string\"},\"oldha\": {\"type\": \"string\"},\"nhscr\": {\"type\": \"string\"},\"ccg\": {\"type\": \"string\"},\"psed\": {\"type\": \"string\"},\"cened\": {\"type\": \"string\"},\"edind\": {\"type\": \"string\"},\"ward98\": {\"type\": \"string\"},\"oa01\": {\"type\": \"string\"},\"nhsrg\": {\"type\": \"string\"},\"hro\": {\"type\": \"string\"},\"lsoa01\": {\"type\": \"string\"},\"ur01ind\": {\"type\": \"string\"},\"msoa01\": {\"type\": \"string\"},\"cannet\": {\"type\": \"string\"},\"scn\": {\"type\": \"string\"},\"oshaprev\": {\"type\": \"string\"},\"oldpct\": {\"type\": \"string\"},\"oldhro\": {\"type\": \"string\"},\"pcon\": {\"type\": \"string\"},\"canreg\": {\"type\": \"string\"},\"pct\": {\"type\": \"string\"},\"oseast1m\": {\"type\": \"string\"},\"osnrth1m\": {\"type\": \"string\"},\"oa11\": {\"type\": \"string\"},\"lsoa11\": {\"type\": \"string\"},\"msoa11\": {\"type\": \"string\"},\"location\": {\"type\": \"geo_point\" }}}}}"

6. Import danych:
curl -XPOST localhost:9200/test/_bulk --data-binary @mapPom.bulk


Zużycie zasobów komputera podczas importu danych do elasticsearch


Proces importu trwał ok. 55 min.
7. Sprawdzenie zaimportowanych danych, polecenie:
curl -XGET localhost:9200/test/_count
8. Sprawdzenie zaimportowanych danych, komunikat:
					
{"count":2593613,"_shards":{"total":5,"successful":5,"failed":0}}
					
				

Przykładowy rekord

Po zaimportowaniu danych:

curl -s "http://localhost:9200/test/_search?size=1&pretty=1" | jq .hits.hits[].\"_source\"


Przykładowy rekord


Przykładowy rekord cd.


Polecenie geodezyjne (mapki)

--- Polecenie, które pokaże pierwsze 2000 danych ---

Z właściwości, które podane są w poleceniu, faktycznie na mapie wykorzystywane są tylko 15 z 42. Oto one:
objectid
pcd2
pcds
dointr
doterm
oseast1m
usertype
ctry
ccg
hro
pct
osnrth1m
oa11
lsoa11
msoa11

--- Polecenie, które wyświetli poligon pomiędzy miejscowościami Aberdeen, Gilcomston, Kittybrewster. ---

(współrzędne: [-2.1, 57.15]), (współrzędne: [-2.11,57.14]), (współrzędne: [-2.12,57.16])


powrót