Import/Catalogue/Topography import for Norway

From OpenStreetMap Wiki
Jump to navigation Jump to search

Introduction

We plan to import topology from N50, the data for the official 1:50 000 topographical map of Norway. N50 is published by the Norwegian Mapping Authority (Kartverket). First the water and waterways are added, then land coverage (wood, wetland, farmland, etc.).

The import has been thoroughly discussed on the Norwegian OSM mailing list, and this wiki page is the result of consensus there.

For information about other imports from Kartverket, see No:Kartverket import or No:Permissions.

Update: This page has been updated with a new import process section for the n50osm import tools available for this import. Alternatively, the earlier import process may still be used.

Licence and permission to use the data

N50 is licensed under CC BY 4.0.

Kartverket has confirmed by e-mail that the data can be integrated into OSM. The e-mail is archived on the Norwegian OSM mailing list.

Kartverket has been added to the list of contributors.

Data quality

As the dataset is the official topographic map of Norway, the data quality is good but not very detailed. Still, as for any dataset, there will be errors. The topography is a good start for further refining based on e.g. aerials.

Changeset tags

Changesets shall be tagged with source=Kartverket N50 and source:date=*.

Import process (new method)

This section describes how to import topography data using the new n50osm.py and n50merge.py scripts available here (GitHub). The section below describes the earlier method.

Preparations

Preparations should usually be done the day before the actual import. It will usually take 2-3 hours for a municipality.

Preparations for the import file:

  1. Check the assignment page for available municipalities.
  2. Generate the import file by running n50osm.py, for example with the command python n50osm.py Lillehammer.
  3. Load the generated import file into JOSM and select Kartverket N50 topo as background imagery.
  4. Resolve names for lakes and wetlands:
    • Search for FIXME:choose to determine which name is correct, for example for a lake or a wetland.
      • Put the result of the search into the Todo plugin in JOSM.
      • Alternative names are provided as nodes within the area in question.
      • If not correct then delete all the name tags and the ssr:stednr=* tag and replace with the tags of the correct extra node.
      • The other names may be included as alt_name=* (an ALT_NAME=* tag has already been provided with all the alternatives).
      • Or use the other name nodes to denote another feature by adding for example natural=bay or natural=strait.
        • Note: If you discover something you think might be an issue in the source data for the names (SSR), and you're feeling generous with your time, you can report the error to the Norwegian Mapping Authority though the web page https://www.rettikartet.no/. They are responsive and will usually address your report within a few days. Doing so can often help clear up naming conflicts you struggle to resolve on your own.
    • Repeat for FIXME:verify as above to verify that the name is correct.
  5. Resolve details for streams and rivers:
    • Search for FIXME:connect and browse around the municipality boundary to check if streams/rivers are overlapping.
    • Search for SSR_WATERWAY and assign names to streams and rivers. Split the way if needed.
    • Search for FIXME:direction and determine the correct direction for waterways.
      • Put the result of the search into the Todo plugin in JOSM.
      • For each stream, study the N50 background imagery to determine the correct direction. Elevations of connected lakes are helpful indications.
      • Reverse the direction of the stream with the R command in JOSM if appropriate.
    • Search for ELVIS (NVE river database) to check if names are missing, if ways could be connected or if streams should be retagged as rivers.
    • Search for waterwat=dam to determine more exact position for dams. The DTM or the orthophoto background maps might be helpful.
  6. Search for FIXME:choose or FIXME:cerify or FIXME:direction or FIXME:connect or SSR_TYPE=* or SSR_WATERWAY or ELVIS and delete tags with capital letters. Make sure FIXME=Merge is not deleted.
  7. Use the Validate function in JOSM to check if there are any errors in the file. Make sure during editing that relations have members in correct order.
  8. Save the edited import file.

Preparations in OSM:

  1. Store the full set of data from OSM for the municipality in a backup file. This can be a useful reference later, in case anything should go wrong beyond this point.
  2. Load all topo features for the municipality into JOSM. Use the Overpass query below.
  3. Remove all natural=wood and natural=forest from the municipality. It is usually low quality Corine data.
  4. Check if relations may need to be temporarily removed, for example relations connecting the coastline of a fjord.
  5. Check that natural=* and landuse=* areas do not have these tags both on a relation and the members of that relation. For example search for natural=water child(natural=water).
  6. Upload your edits to OSM.
  7. For testing, run n50merge.py from the same folder as the import file, for example with the command python n50merge.py Lillehammmer.
    • Discover features in OSM which are preventing merging of the large wood grids, for example ways in OSM along the municipality border which do not match the FIXME=Merge ways. Edit ways so that they match (including same end locations) and upload. This will usually be quicker than manually merging in the "Merging" step.
    • It may help to remove old features in OSM which are (almost) touching the municipality border.
    • Also search for features which have not been merged to check if one of the steps above have not been completed. For example, search for landuse=* -modified, natural=water -modified and natural=coastline -modified.
    • Repeat until the script merges a satisfactory proportion of the topo features. The remaining features will be merged manually in the "Merging" step below.

Overpass query for retrieving OSM topo features in a municipality:

[out:xml][timeout:200];
(area["name"="Risør"]["place"="municipality"];)->.searchArea;
(
  nwr["natural"](area.searchArea);
  nwr["waterway"](area.searchArea);
  nwr["landuse"](area.searchArea);
  nwr["leisure"](area.searchArea);
  nwr["man_made"](area.searchArea);  
  nwr["aeroway"](area.searchArea);
  nwr["seamark:type"="rock"](area.searchArea);
);
(._;>;<;);
out meta;

Merging

Merge the import file for the municipality the next day. It will usually take 3-8 hours depending on the size of the municipality and on how much topo data is already in OSM.

This method will first use n50merge.py to automatically merge all the obvious cases. Afterwards manual merging and fixing will be required, as described below.

The steps of the merging process:

  1. To merge the import file with existing OSM data, run n50merge.py from the same folder as the import file, for example with the command python n50merge.py Lillehammmer.
  2. Load the merged file into JOSM and select Kartverket N50 topo as background imagery.
  3. Search for FIXME=Merge and manually merge features around the borders of the municipality.
    • Try to keep the oldest ways and relations when merging to keep track of historical edits.
    • Remove all the FIXME=Merge tags afterwards.
  4. Search for natural=water -modified to process all water features which were not merged automatically.
    • Either merge manually.
    • Or delete if already taken care of by another feature.
  5. Repeat for the other feature types, such as landuse=* and coastline=*. You may want to group in categories, for example landuse=farmland or landuse=residential separately.
  6. Search for seamark:type=rock -modified to check if any rocks ("skjær") need manual merging.
  7. Search for waterway=* -modified to check if any streams or rivers need manual merging.
  8. Search for water=river modified to check if a waterway=river way should be added as a center line to the river area.
  9. Check the large natural=wood grids to check if anyone should be joined to make a complete rectangular grid (i.e. with no split along the municipality border), or if any grid was only partially merged.
  10. Search for leisure=* new, aeroway=* new and man_made=dam. They are not merged automatically.
  11. Search for OSM_ to process tagging conflicts.
    • Put the search result in the Todo plugin and resolve each case. The previous tag from OSM is now prefixed by OSM_. In many cases they may be deleted.
    • You may want to process in groups, for example search for OSM_waterway or OSM_way separately.
  12. Validate and handle validation errors. By now, no FIXME=* or manual merging should be left. Then upload to OSM. Be prepared to resolve any conflicts during uploading.
  13. Update the wiki progress page as described in the next section.

Import process (older method)

We will import one municipality at a time. The dataset for a municipality will be imported as a .15 deg times .15 deg grid changeset. The number of elements of each square is usually 5k-20k. The progress of the import is tracked on assignment page. The data is preprocessed by Reitstoen and available here. Elements which needs manual interaction are tagged with Fixme and an description of what to do. Data is then merged with existing OSM data by a python script. The user needs now to fix the conflicts marked with a Fixme tag. The data is then uploaded.

Dedicated import accounts

This will be a community import, and various persons will be involved.

The persons importing the data will use separate import accounts, named username_import, where username is their original username. They will be personally responsible for the quality of the import.

Data transformation

N50 is available from Kartverket as SOSI files. There is one SOSI file for each of the municipalities in Norway, 428 in total.

The original SOSI files from Kartverket have been converted to OSM XML files with sosi2osm and vann.lua and arealdekkeUvann.lua. For the rivers and streams are turned to direct downwards by riverTurner.py. Ways are combined to avoid unnecessary short ways by waySimplifyer.py. Ignored elements are removed by emptyRemover.py. The OSM XML is then splitted in smaller OSM XML to avoid large changeset, which gives less risk of failing uploads. Similarly is done for the areal coverage; however, simplifyRelations.py is used aswell to combine small multipolygones.

Framgangsmåte

Oppsett

  • Installer python 2.7.*
  • Installer pakkene lxml og requests
    • F.eks. via pip med pip install lxml og pip install requests
  • Last ned topo2osm fra Github
    • Noter deg stien hvor replaceWithOsm.py ligger og bruk en fullstendig eller relativ path som peker til replaceWithOsm.py — f.eks. kan du legge topo2osm som en mappe under $HOME/bin og kjøre kommandoen slik: python $HOME/bin/topo2osm/replaceWithOsm.py del.osm del2.osm --import:water
  • Installer UtilsPlugin2 i JOSM (Edit - Preferences - Plugin)
    • Denne gir man muligheten til å "Replace Geometry" dvs flette nye og gamle data uten å miste historikken
    • Bind "Replace Geometry"snarveien til noe enklere enn det som er standard, f.eks. "Ctrl+Q". Dette er kun for å gjøre det litt enklere å bruke dette verktøyet: Edit - Preferences - Keyboard shortcuts - Tool: Replace Geometry = Ctrl+Q
  • Installer kartverketimport-pluginen i JOSM (Edit - Preferences - Plugin)
    • Denne brukes for halvautomatisk korreksjon av retning på elver og bekker
  • Sørg for å ha opprettet en dedikert import_bruker og logg inn med denne. All importdata skal lastes opp med en egen bruker
    • Denne skal ha et navn på formen "brukernavn\_import", der "brukernavn" er ditt vanlige brukernavn
    • Les her for mer info

Last ned data

{{Topography import Norway assignment
| status = påbegynt
| kommunenummer=0000
| relation = 000000
| kommunenavn=kommunenavn
| user =   [[User:brukernavn|visningsnavn]]
| mentor =  
| kommentar = 
| kyst = 0
| vann = 0
| areal =0
| start = dato
| slutt = dato
}}
  • Last ned data for den kommunen du vil importere herfra,(kontakt Reitstoen hvis du ønsker nye filer), og pakk ut filen
    • Filen man laster er en ZIP og innholder filer med navn xxxx__type_part_yy.yy_zz.zz.osm. Der xxxx er kommunenummeret, type er coast, water eller landcover, yy.y er nedre breddegrad og zz.z er venstre lengdegrad.
    • Se link til eldre filer nederst på denne siden om du ikke finner den aktuelle kommunen.

Import av kystlinje

  • Åpne den første filen xxxx_coast_part_0_yy.yy_zz.zz.osm i JOSM
  • Søk etter "FIXME"="Check direction of coastline. Land should be on the left side and water on the right side." og sørg for at alt er korrekt og deretter fjern denne taggen
  • Last ned data fra OSM som dekker området til denne filen
  • Marker en bit med gammel kyst og en bit med ny kyst og "Replace Geometry" (Ctrl+Q)
    • Velg source=Kartverket N50 og klikk "Apply"
  • Gjenta dette til hele kysten i denne delfilen er byttet ut
  • Når du er ferdig med å bytte ut alle kystbitene i denne delfilen:
    • Søk etter dette i JOSM: natural=coastline -source="Kartverket N50" for å se om du har glemt å fjerne noen gamle kystlinjer hvor det har blitt importert ny
    • Søk etter dette i JOSM: source:PGS type:node modified og fjern denne taggen fra noden.
  • Etter man har er ferdig med å erstatte kystlinje og rette opp i feil trykk på "Validation" (Shift+V eller knappen nede til høyre) i JOSM og se spesielt etter Reversed coastline, Unordered coastline og Unconnected coastline
  • Last opp og marker changesettet med feks Kartverket N50 coastline import part 1/x for $kommunenavn og kilde/source "Kartverket"
  • Gjenta dette for alle delfilene i denne kommunen

En stund(neste dag) etter du har importert kan man bruke dette verktøyet for å se om man har gjort noe feil

Import av elver og vann

VIKTIG: import av data for kommuner med kyst bør gjøres etter at kysten er importert, for å unngå merarbeid.

  • Åpne den første filen xxxx_water_part_0_yy.yy_zz.zz.osm i JOSM
  • Trykk på "Validation"
  • Under "Errors" dukker det gjerne opp Waterway duplicated nodes - Duplicated nodes, klikk på den kategorien og klikk "Fix"
  • Under "Warnings" dukker det gjerne opp Mixed type duplicated nodes - Duplicated nodes, klikk på denne kategorien og klikk "Fix"
  • Søk etter FIXME=* (store bokstaver i fixme), man får da opp alle elver der retningen er usikker
    • Disse behandles halvautomatisk ved hjelp av tibnors JOSM-plugin (installasjon er beskrevet ovenfor under "Oppsett")
    • Pluginen finner man på verktøyslinjen: More tools - Check directions of streams
    • Pluginen vil da gå igjennom hver elv med FIXME:Check direction of stream. For hver av disse får du opp en boks der du velger Correct/Wrong/Ignore/Stop.
    • Endel bekker må manuelt splittes der retning skal endres. F.eks. hvis to bekker møtes men henger sammen som én linje.. Trykk Ignore på disse og ta dem manuelt etterpå.
    • I stedet for å bruke plugin'et kan du alternativt bruke Reverse-funksjonen (R) i Verktøy-menyen i JOSM.
  • Søk også etter Fixme=*(små bokstaver i fixme), du får da opp elver/riverbanks med manglende midtlinje (Tag:waterway=riverbank).
  • Legg til midtlinjer, koble på bekker/elver som kommer innpå, og fjern Fixme-taggen
    • For å tegne midtlinjer er "Viewport Following (Ctrl+Shift+F)" et nyttig verktøy. Da flyttes fokuset på skjermen nedover elven etterhvert som du tegner
  • Lagre filen, feks med samme navnet den allerede har (Ctrl+S i JOSM)
  • Nå må man kjøre programmet replaceWithOsm.py for å flette sammen denne datafilen med data fra OSM
  • Programmet kan kjøres slik python replaceWithOsm.py xxxx_water_part_0_yy.yy_zz.zz.osm output_part0.osm --import:water
  • Åpne output_part0.osm i JOSM.
  • Last ned data fra OSM for samme område. Sørg for at "Download as new layer" ikke er haket av
  • Søk etter "FIXME=Merge", dette er vann, bekker og elver som finnes i OSM fra før og flett dataene sammen med "Replace Geometry"
  • Trykk "Validation", og rett opp feil
  • Last opp og marker changesettet med feks Kartverket N50 rivers and water import part 1/x for $kommunenavn og kilde/source "Kartverket"
  • Gjenta dette for alle delfilene i kommunen

Import av arealdekke

VIKTIG: Gjør først ferdig importen av kyst og vann før arealdekke importeres

Her vises en lukket relasjon(de markerte) der alle har rolle 'outer' og skulle hatt 'inner'
  • Åpne den første filen xxxx_landcover_part_0_yy.yy_zz.zz.osm i JOSM
  • Trykk "Validation"
  • Under "Warnings" dukker det gjerne opp Role for '0(x nodes)' should be 'inner'.
  • Klikk på en av linjene og klikk deg inn på relasjonen i "Edit new relation in layer ..."-vinduet. Trykk på knappen for å sortere relasjonen. "Sort the relation members (Alt+End)". Dette gjør det mye enklere å se hvilke medlemmer som har feil rolle. Se skjermbilde til høyre her
  • En annen warning som kan dukke opp er Intersection between multipolygon ways. Dette er typisk hvis en myr eller en skog som har rollen 'inner' og berører, altså deler node med en 'outer'-way. Marker skogen og noden og unglue(Alt+J), og flytt myr-noden litt unna. Da løses problemet. Se skjermbilde til nede høyre
  • Lagre filen, feks med samme navnet den allerede har (Ctrl+S i JOSM)
  • Nå må man kjøre programmet replaceWithOsm.py for å flette sammen denne datafilen med data fra OSM
  • Kjør kommandoen python replaceWithOsm.py xxxx_landcover_part_0_yy.yy_zz.zz.osm output_part0.osm --import:area
  • Åpne output_part0.osm i JOSM
  • Last ned data fra OSM for samme område. Sørg for at "Download as new layer" ikke er haket av
  • Søk etter FIXME=Merge, dette er skoger, myrer, etc som finnes i OSM fra før. Flett dataene sammen med "Replace Geometry" og fjern FIXME=Merge-taggen.
  • Trykk "Validation", og rett opp feil
  • Last opp og marker changesettet med feks Kartverket N50 landcover import part 1/x for $kommunenavn og kilde/source "Kartverket"
    "Intersection between multipolygon ways" i JOSM. Noden i rødt er den som skaper problemer
  • Gjenta dette for alle delfilene i kommunen
  • Etter å ha lastet opp et stort changeset, vent helst en stund (f.eks. 15min) før man prosesserer neste fil med replaceWithOsm.py. Hvis man har vært for kjapp så merker man at en får opp en haug med konflikter, duplicate nodes og duplicate ways.
  • Til slutt: Oppdater oversikten over N50importen ved å sitte kommunen til "Ferdig"
    {{Topography import Norway assignment
    | status = ferdig
    | kommunenummer=0000
    | relation = 000000
    | kommunenavn=kommunenavn
    | user =   [[User:brukernavn|visningsnavn]]
    | mentor =  
    | kommentar = 
    | kyst = 100
    | vann = 100
    | areal =100
    | start = dato
    | slutt = dato
    }}
    

Noen tips

  • Det mest optimale er å gjøre hele importen samlet. Dersom du importerer én del først, f.eks. kystlinjen eller alle vann, og deretter lar det gå noen uker eller måneder så vil flettingen med øvrig markslag senere kunne bli vanskeligere fordi andre kan ha endret på linjene i mellomtiden.
  • Gammel skog fra tidligere grov Corine-import kan med fordel fjernes før ny skog skal legges inn, men pass på at skogen utenfor kommunegrensen forblir intakt. Det betyr at det må lages linjer langs kommunegrensen.
  • Vennligst ikke rør kommunegrensene (administrative boundary). Ikke splitt opp grensene for å bruke dem som linjer i relasjonene for skog, myr osv. Da øker sannsynligheten for at grensen blir ødelagt ved at noen flytter på en node. I tillegg blir det vanskeligere å oppdatere grensene etterpå.
  • Slå gjerne sammen vann på tvers av kommunegrensen slik at det ikke ligger to halve vann inntil hverandre. Da kan hele vannet få ett navn.
  • Etter N50-importen kan du gjerne legge inn navn på vann, elver, bekker, myrer osv. Ferdige noder med navn hentes her: No:Import av stedsnavn fra SSR2
  • Noen genererte filer mangler områdene for tettbebyggelse (residential landuse), så sjekk gjerne dette.
  • Du kan bruke To-do plugin i JOSM for å gå gjennom alle FIXME raskere og uten å glemme noen.
  • Ved nedlastning i JOSM vil spørringen nedenfor sørge for at alle data i kommunen kommer inn. Merk ekstra <; i siste linje som sørger for at alle foreldre-relasjoner også blir hentet.
[out:xml][timeout:250]; 
{{geocodeArea:Stor-Elvdal}}->.searchArea;
(
    node(area.searchArea);
    relation(area.searchArea);
    way(area.searchArea);
);
(._;>;<;); out meta;

Keeping the information up to date

We plan to keep the topography information in OSM up to date by regularly comparing OSM data with data from N50. We will write a script which detects changes in the N50 data and merge these changes into OSM, for data which is unchanged since the import.

Links