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')
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