GDAL tukee maastotietokannan MTK-GML-tiedostomuotoa

Maanmittauslaitoksen maastotietokannan toimitusmuodoista GML on periaatteessa virallisin ja paras. Ikävä kyllä tuon GML:ää skeema on niin räätälöity, että sitä ei ole voinut lukea suoraan millään ilmaisella paikkatieto-ohjelmalla. Jännittävää sinänsä, ettei aineiston tuottajan puolella ilmeisesti ole huomattu, että tällaista ongelmaa olisi edes olemassa. Ainakaan sitä ei mainita tässä mielenkiintoisessa opinnäytetyössä
http://maa.aalto.fi/fi/geoinformatiikan_tutkimusryhma-gma/geoinformatiikka_ja_kartografia/2013_kupsu_m.pdf

Olipa tämä lukuongelma sitten todellinen tai ei, niin nyt siihen on kuitenkin olemassa ainakin yksi ilmainen ja avoin ratkaisu, sillä GDAL:in kehitysversio pystyy nyt avaamaan maastotietokannan GML-tiedostot suoraan. Aiheesta lisää
http://latuviitta.org/documents/Maanmittauslaitoksen_maastotietokannan_GML-tiedostomuodon_haltuunotto.html

Jääkö teksti kesken kohdassa “GML:ssä esiintyy myös”?

Näyttihän se katkeavan. En muista, mitä olin siihen alunperin kirjoittanut, mutta lisäsin nyt ohjeet siitä, miten selvitään samalla tasolla sekaisin esiintyvien 2D- ja 3D-koordinaattien mahdollisesti aiheuttamista ongelmista ja miten tarpeen vaatiessa voidaan levittää StringList-tyyppiset ominaisuustiedot niin, että jokainen kentän arvo tallentuu omaan kenttäänsä.

Gdal uusin versio lukasee sen nätisti postresql tietokantaan.
Enään tarvitsisi mapnik : postgis väliin jotain,… ois siisti vaihtoehto,
voisi olla kaikki tietotyypit !

Toinen vaihto ehto ois tuo ogr2osm tietokantaan niin että se konvertoi,…
osm:lle on kaikki valmiina mapnik:postgis paketissa mutta kun tuo
ogr2osm sanoo mulla ainakin:

joni@mpi1:~/src/ogr2osm$ python ogr2osm.py ~MAP*/M5132R.xml -t road.py
Traceback (most recent call last):
File “ogr2osm.py”, line 59, in
from osgeo import ogr
File “/usr/local/lib/python2.7/dist-packages/osgeo/init.py”, line 21, in
_gdal = swig_import_helper()
File “/usr/local/lib/python2.7/dist-packages/osgeo/init.py”, line 17, in swig_import_helper
_mod = imp.load_module(‘_gdal’, fp, pathname, description)
ImportError: /usr/local/lib/libgdal.so.1: undefined symbol: GEOSGeom_getCoordinateDimension
joni@mpi1:~/src/ogr2osm$

Ongelma voi olla kun on uusi ja vanha GDAL,…,… muuta en oo keksinyt,…

potlatch2 kun saa pelittää voisi sillä tehdä omat reitit omalle palvelimelle ja
kun ok jaella, siirrellä,… en saanut oauthia pelaa viellä,…

MML-GML:n konvertointi ogr2osm:illa (pnorman) ns. toimii ainakin täällä, eli se ei heittänyt mitään virheilmoitukselta näyttävää herjaa. Käytin GDAL uusinta versiota (eli SVN trunk) ja muut rojut olivat Debian wheezy/sid:istä.

Ilman tagikonversiota ei outputilla tosin tee juuri mitään. Olisikohan kenelläkään MML-GML:lle soveltuvaa ogr2osm translations-filettä jemmassa? Edes osittaista? Wikissähän noita on jo dokumentoitu ( http://wiki.openstreetmap.org/wiki/Fi:Maastotietokanta/Luokat ), mutta löytyykö koodina?

Tollanen löytyi aikaisemmista threafeistä.
Tuota yritin käyttää.

=======

coding=utf8

from osgeo import ogr
import re
import urllib
import json

uvmfeatures =

def filterTags(tags):
if tags is None:
return
newtags = {}
for (key, value) in tags.items():
if (value != “”):
value = value.strip()
if (key == “TEKSTI” and value != “”):
newtags[“name”] = value
elif (key == “YKSSUU” and value != “0”):
newtags[“oneway”] = “yes”
elif (key == “YKSSUU” and value == “0”):
continue
elif (key == “VERSUH” and value == “0”):
continue
elif (key == “VERSUH” and value < 0):
newtags[“layer”] = value
elif (key == “VERSUH” and (value > 0 and value < 10)):
newtags[“layer”] = value
elif (key == “VERSUH” and value == “-1”):
newtags[“layer”] = “-1”
# Autotie Ia
elif (key == “LUOKKA” and value == “12111”):
newtags[“highway”] = “primary”
# Autotie Ib
elif (key == “LUOKKA” and value == “12112”):
newtags[“highway”] = “primary”
# Autotie IIa
elif (key == “LUOKKA” and value == “12121”):
newtags[“highway”] = “secondary”
# Autotie IIb
elif (key == “LUOKKA” and value == “12122”):
newtags[“highway”] = “secondary”
# Autotie IIIa
elif (key == “LUOKKA” and value == “12131”):
newtags[“highway”] = “tertiary”
# Autotie IIIb
elif (key == “LUOKKA” and value == “12132”):
newtags[“highway”] = “tertiary”
# Talvitie
elif (key == “LUOKKA” and value == “12312”):
newtags[“highway”] = “winter_road”
# Polku
elif (key == “LUOKKA” and value == “12313”):
newtags[“highway”] = “path”
# Kävely- ja pyörätie
elif (key == “LUOKKA” and value == “12314”):
newtags[“highway”] = “cycleway”
newtags[“foot”] = “yes”
# Ajopolku
elif (key == “LUOKKA” and value == “12316”):
newtags[“highway”] = “track”
# Ajotie
elif (key == “LUOKKA” and value == “12141”):
newtags[“highway”] = “unclassified”
# Tarkista
elif (key == “PAALLY” and value == “0”):
newtags[“surface”] = “unpaved”
# Tarkista
elif (key == “PAALLY” and value == “1”):
newtags[“surface”] = “paved”
# Tarkista
elif (key == “PAALLY” and value == “2”):
newtags[“surface”] = “paved”
elif (value == “”):
continue
else:
newtags[key] = value
#if (key == “Layer” or
# (key == “Text” and value != “”)):
# newtags[key] = value
#if (key == “Layer” and value != “VA-UVM-BLDG-CODE”):
# newtags[“building”] = “yes”
return newtags

Tuo koodi on nähtävästi jollekin toiselle GDAL/OGR:n tukemalle tiedostomuodolle, GML-tiedostoja tuolla konvertoitaessa ei niihin saa tageja aikaan.

Otin sitten editorin kauniiseen käteen ja konvertoin wikistä löytyneet kohdeluokka → OSM tagi -taulukot Python-koodiksi. Translaatiokoodi löytyy täältä: https://github.com/tpikonen/ogr2osm-translations (tiedosto on mtk-gml.py).

Sen verran testailin importteja, että ainakin yksinkertaiset konversiot mallia (kohdeluokkanumero → staattinen tagisetti) toimivat. Jos tageihin pitää lisätä tietoja muista geometrian featureista (tekstit yms.), niin voipa sekin toimia, mutta vastuu debuggauksesta on käyttäjällä.

moi,

Ois kiva kokeilla tuota sun scriptiä,… mutta kun ogr2osm antaa:

File “/usr/local/lib/python2.7/dist-packages/osgeo/init.py”, line 21, in
_gdal = swig_import_helper()
File “/usr/local/lib/python2.7/dist-packages/osgeo/init.py”, line 17, in swig_import_helper
_mod = imp.load_module(‘_gdal’, fp, pathname, description)

Mulla on uusin gdal, kännetty phyton lipun kanssa,… voisko tuo olla niin
että .py kirjastosta on jotenkin vanhempi versio koneessa ja sen se löytää
eikä uutta käännettyä???

Phyton sydeemi ei ole tuttu ja juuri nyt en jaksa tuota perkaamaan,…

Niin keimo, sun scriptistä, siis tagit muuttuu osm muotoon tuolla MTK:n *.xml ( GML )
tiedostoista osm kovertoitaessa,… saako sitten osm2prsql:llä sen sitten
tietokantaan niin että mapnikillä onnistuu renderöinti?

Kakkosvaihtoehto ois että
osm2prsql kyllä lukee uuden GDAL ohjelmalla tuon MTK formaatin suoraan tietokantaan mutta sitten tarttis
saada jotenkin tuo mapnik ymmärtää tuon tietokannan rakenne,… sekin voisi toimia,…

Kuitenkin tuo sun skripti vois olla ratkaisu sillä

MTK-GDL (ogr2osm.py)–> OSM
(osm2psql)—> Opentreet Psql
(nominatimin osm importti)—> nominatim
(xxx) —> Android Navigation

joo löytyy noita aplikaatioita joiden pitäisi OSM tietokanta saada Android aplikaation
ymmärtämään muotoon,… eli lähellä ollaan että aineisto on avointa ihan oikeasti.

Pitää saada tuo ogr2osm.py toimimaan niin kokeilen.

Joo,… kannattaa aina tehdä kopio GIS tietokannasta ennenkuin lisää, poistaa tai muokkaa sitä,
ihan aina !

Mulla on ongelmana kun pienet tiet ja maasto kohteet puuttuu paikallisesti,…
maastotietokannasta ne olis kun tulis,…

joo testi ongelma ratkesi:

export PYTHONPATH=/home/joni/src/gdal_26324/lib/python2.7/site-packages/:$PYTHONPATH
export LD_LIBRARY_PATH=“/home/joni/src/gdal_26324/lib”,$LD_LIBRARY_PATH

mutta kimmo, scriptisi herjaa, kunhan sen ekalle riville ekaksi lisää # -- coding: iso-8859-15 -- seuraavaa:

(gdal)joni@mpi1:~/src/ogr2osm$ python ogr2osm.py …/…/MAP-MTK/M5131R.xml -t MTK-GML.py

Traceback (most recent call last):
File “ogr2osm.py”, line 656, in
parseData(data)
File “ogr2osm.py”, line 336, in parseData
parseLayer(translations.filterLayer(layer))
File “ogr2osm.py”, line 397, in parseLayer
parseFeature(translations.filterFeature(ogrfeature, fieldNames, reproject), fieldNames, reproject)
File “ogr2osm.py”, line 418, in parseFeature
translations.filterFeaturePost(feature, ogrfeature, ogrgeometry)
File “/home/joni/src/ogr2osm/translations/MTK-GML.py”, line 18, in filterFeaturePost
feature.tags = mtk_featuresogrfeature[‘kohdeluokka’]
File “/home/joni/src/ogr2osm/translations/MTK-GML.py”, line 258, in
36291 : lambda _: { “ele:n60” : f[‘teksti’], },
NameError: global name ‘f’ is not defined
(gdal)joni@mpi1:~/src/ogr2osm$

Korjasin tuon enkoodauksen ja yo. näppivirheen skriptiin, kiitos vaan bugiraportista. Testasin nyt ogr2osmia tuolla translaatiolla noin puolen karttalehden GML-fileisiin, eikä se ainakaan niillä enää kaatunut. Konversion sisällön tarkkuudesta en mene edelleenkään takuuseen :slight_smile:

Jos saat MTK-GML → postGIS importin pelaamaan, niin laittelepa raporttia tänne foorumille. Tällä hetkellä org2osm konversio tosin on sellainen, että suurin osa datasta muuntuu ilman mitään tageja. Tietokantaan tulee siis paljon turhaa kamaa jota ei lopullisessa kartassa näy.

python ogr2osm.py …/…/MAP-MTK/M5131L.xml -t MTK-GML.py


UNIT[“metre”,1,
AUTHORITY[“EPSG”,“9001”]],
AXIS[“Easting”,EAST],
AXIS[“Northing”,NORTH],
AUTHORITY[“EPSG”,“3067”]]
Traceback (most recent call last):
File “ogr2osm.py”, line 656, in
parseData(data)
File “ogr2osm.py”, line 336, in parseData
parseLayer(translations.filterLayer(layer))
File “ogr2osm.py”, line 397, in parseLayer
parseFeature(translations.filterFeature(ogrfeature, fieldNames, reproject), fieldNames, reproject)
File “ogr2osm.py”, line 418, in parseFeature
translations.filterFeaturePost(feature, ogrfeature, ogrgeometry)
File “/home/joni/src/ogr2osm/translations/MTK-GML.py”, line 19, in filterFeaturePost
feature.tags = mtk_featuresogrfeature[‘kohdeluokka’]
KeyError: 9325
(jpk)joni@mpi1:~/src/ogr2osm$

Kimmo, jos jaksat testata vaikka MTK:n kartta tiedostolla
https://drive.google.com/folderview?id=0Bw75vZr1UKV-TjFVbXl3MmI1SEU&usp=sharing
niin kun mä testaan niin ollaan jo testaamassa scripitin siirtymistä järjestelmästä toiseen.

Jos tää skulaa niin tää on hieno homma,…

Korjasin tuon fiban, M5131L.xml:n konversio toimii nyt kuin vettä vaan (ainakin täällä :slight_smile: ).

joo ei herjaa,… viellä kun mapnik sen renderöi, yritän tuonnempana uudestaan!
osm2prsql luki kyllä yhden palan sisään mutta lisääminen ei onnistunut, johtuisko
palojen reunalla olevien kohteiden samoista nimistä,… mene tiedä tutkitaan,…

Skriptit toimivat myös Windowsilla kun käyttää Tamas Tzekeresin GDAL:in kehitysversiokäännöksiä http://gisinternals.com/sdk/
Muunnetut kohteet menevät täsmälleen oikeille paikoille, tämän voi tarkistaa vaikka käyttämällä JOSM:ssa kapsin WMS-palvelua taustalla. Rakennuksista syntyy jostain syystä sekä viiva että polygoni, joista viivalla on pelkkä source-tagi ja polygonilla lisäksi building-tagi.

Tollanen herjaus tulee kun ekan jälkeen alkaa lisäilee,…

===
joni@mpi1:~/src/ogr2osm$ osm2pgsql -a --database gismtkosm --slim M5134L.osm
osm2pgsql SVN version 0.83.0 (64bit id space)

Using projection SRS 900913 (Spherical Mercator)
Setting up table: planet_osm_point
NOTICE: table “planet_osm_point_tmp” does not exist, skipping
Setting up table: planet_osm_line
NOTICE: table “planet_osm_line_tmp” does not exist, skipping
Setting up table: planet_osm_polygon
NOTICE: table “planet_osm_polygon_tmp” does not exist, skipping
Setting up table: planet_osm_roads
NOTICE: table “planet_osm_roads_tmp” does not exist, skipping
Using built-in tag processing pipeline
Allocating memory for dense node cache
Allocating dense node cache in one big chunk
Allocating memory for sparse node cache
Sharing dense sparse
Node-cache: cache=800MB, maxblocks=102401*8192, allocation method=11
Mid: pgsql, scale=100 cache=800
Setting up table: planet_osm_nodes
Setting up table: planet_osm_ways
Setting up table: planet_osm_rels

Reading in file: M5134L.osm
Processing: Node(209k 209.7k/s) Way(17k 17.00k/s) Relation(0 0.00/s)COPY_END for COPY planet_osm_nodes FROM STDIN;
failed: ERROR: duplicate key value violates unique constraint “planet_osm_nodes_pkey”
DETAIL: Key (id)=(-2) already exists.
CONTEXT: COPY planet_osm_nodes, line 1: “-2 865508874 316732384 \N”

Error occurred, cleaning up
joni@mpi1:~/src/ogr2osm$

ID on pääavaimena, ja ogr2osm.py aloittaa oletusarvoilla niiden luomisen aina nollasta. Tietokannan eheyssääntöjen takia toista settiä ei voi viedä tauluun, koska pääavaimessa ei voi esiintyä samoja arvoja. Tuossa Paul Normanin versiossa on mahdollista antaa ensimmäiselle muunnetulle kohteelle haluttu ID käyttämällä parametria --id. Kokeile laittaa siihen vaikka miljoona toista ajoa varten, kaksi miljoonaa seuraavalle jne.

–id käyttäen sain useamman karttapalasen luettua tietokantaan. Kuitenkaan mapnik ei uutta dataa renderöinyt, viellä,… voi olla renderd
configurointi ongelma,…

Voisko tuossa olla viellä viilauksen tarve osm.xml,… winter_road, track,… yms puuttui,…
jostain syystä renderd tippuu päältä pois,… niitä on kaksi rullaamassa yksi yhdelle
ja toinen toiselle tietokannalle,

Sain näkymään saimaan maastotietokannan, 23 karttalehteä,… pienien teiden nimet ei näy taitavat olla erilisessä tiedostossa,… seuraavaksi pitää saada
viellä korkeusmallit,…

Vika oli lopulta renderd - apache configuraatiossa,… eli:

  • mapnikissä pitää olla vaikka suomi asennettuna ennen kun ajaa maastotietokantaa sisään
  • kokeilussa kannattaa käyttää eri tietokantaa kun mitä KÄYTTÄÄ, render.conf configuroi esim.

[mtk]
URI=/osmmtk/
XML=/etc/mapnik-osm-data-mtk/osm.xml
DESCRIPTION=This is the standard osm mapnik style

XML on mapnikstyle, kaikille tietokannalle tai tyylille oma hakemisto paketti, data-settings tulee tietokannan nimi
URI on tile serverin polku palvelinnimen juuresta ja se tuonne openstreetmap java skriptiin, niitäkin omansa jokaiselle kopiolle

Noin lyhytesti, aikaa palo kun dokumentaatio pettää, vinkkejä:
http://geoinformatics.fsv.cvut.cz/gwiki/Custom_OpenStreetMap_Rendering_-_OpenTrackMap_Experience
http://wiki.openstreetmap.org/wiki/PostGIS/Installation
http://sourceforge.net/apps/mediawiki/gpsdrive/index.php?title=Setting_up_Mapnik
http://switch2osm.org/serving-tiles/manually-building-a-tile-server/

Komentoja:

ogr2osm ympäristö:
virtualenv jpk
source jpk/bin/activate
pip install /home/joni/src/gdal_26324/lib/python2.7/site-packages
pip install /home/joni/src/gdal/swig/python/setup.py
export PYTHONPATH=/home/joni/src/gdal_26324/lib/python2.7/site-packages/:$PYTHONPATH
export LD_LIBRARY_PATH= /home/joni/src/gdal_26324/lib:$LD_LIBRARY_PATH
cd gdal
make install
cd …
cd ogr2*
python ogr2osm.py …/…/MAP-MTK/M5411L.osm -t MTK-GML.py --id 22000000000
deactivate

Karttojen tuominen postgrestietokantaan *.osm muodosta

osm2pgsql -a --database gismtkosm --slim M5132R.osm

mistä aineistosta saisi syvyyskäyrät, merikarttamerkit, ne on uusista poistettu ?
onko joku siirtänyt laserkeilaus aineistoa openstreet / mapnik renderöinti , miten ?
oisko ohjetta korkeus käyrälle?

Minne koottaisiin, minne on jo koottu ohjeita maanmittauksen aineistojen siirtoon?

Voisi nääkin kokemukset jalostaa selkokielelle!

Kimmo kiitos muunto scriptistä :):):):):slight_smile: