Skip to content

Instantly share code, notes, and snippets.

@LtGlahn
Last active January 12, 2023 09:10
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save LtGlahn/5a6993ee4d36e675fa74f5a6d6d61b01 to your computer and use it in GitHub Desktop.
Save LtGlahn/5a6993ee4d36e675fa74f5a6d6d61b01 to your computer and use it in GitHub Desktop.
Lagre NVDB data som geojson i ulike koordinatsystem

Geojson - strengt tatt lon, lat koordinater

Geojson skal i følge spesifikasjonen strengt tatt være (lon, lat) i koordinatsystem EPSG:4326. Uten å ta opp diskusjonen om hva som er korrekt rekkefølge så må vi bytte om på koordinatene fra LES, som kommer i rekkefølgen (lat, lon)

import pandas as pd
import geopandas as gpd 
from shapely import wkt 
from shapely.ops import transform 

import nvdbapiv3

def swapXY( mygeom): 
    if mygeom.has_z:
        mygeom = transform(lambda x, y,z: (y, x, z), mygeom)
    else: 
        mygeom = transform(lambda x, y: (y, x), mygeom)
    return mygeom 

if __name__ == '__main__':
    sok = nvdbapiv3.nvdbFagdata(45, filter={'srid' : 4326 })
    mydf = pd.DataFrame( sok.to_records())
    mydf['geometry'] = mydf['geometri'].apply( wkt.loads )
    mydf['geometry'] = mydf['geometry'].apply( swapXY )
    myGdf = gpd.GeoDataFrame( mydf, geometry='geometry', crs=4326 )
    myGdf.to_file( 'geojsonexample.geojson', driver='GeoJSON')

Andre koordinatsystem

Geojson-spesifikasjonen sier følgende om andre koordinatsystem:

However, where all involved parties have a prior arrangement, alternative coordinate reference systems can be used

Hvis dette er relevant for deg så kan du angi koordinatsystem ved å føye til et "crs" - element på rotnivå i geojson-fila:

"crs": { "type": "name", "properties": { "name": "urn:ogc:def:crs:EPSG::5973" } } 

Geopandas-biblioteket gjør selvsagt dette for deg. Helt enkelt så bare fjerner vi alt som handler om lat,lon-håndtering fra eksemplet over:

import pandas as pd
import geopandas as gpd
from shapely import wkt

import nvdbapiv3

if __name__ == '__main__':
    sok = nvdbapiv3.nvdbFagdata(45)
    mydf = pd.DataFrame( sok.to_records())
    mydf['geometry'] = mydf['geometri'].apply( wkt.loads )
    myGdf = gpd.GeoDataFrame( mydf, geometry='geometry', crs=5973 )
    myGdf.to_file( 'geojsonexampleUTM33.geojson', driver='GeoJSON')

Men vær advart: Det varierer veldig hvilke klienter som har støtte for geojson med andre koordinatsystem enn EPSG:4326

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment