I'm using OSGeo.OGR (C#) library to perform GML to GeoJson conversion.
Parsing works perfect except extracting incorrect coordinates.
After conversion map objects appears in another place on the map. But Aspose gml to geoJson converter outputs extracts/calculates correct coordinates ( belongs to Norway).
GML file:
<?xml version="1.0" encoding="UTF-8"?>
<gml:FeatureCollection xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:gts="http://www.isotc211.org/2005/gts" xmlns:gsr="http://www.isotc211.org/2005/gsr"
xmlns:gss="http://www.isotc211.org/2005/gss" xmlns:sc="http://www.interactive-
instruments.de/ShapeChange/AppInfo" xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns:gco="http://www.isotc211.org/2005/gco" xmlns:gml="http://www.opengis.net/gml/3.2"
xmlns:gmd="http://www.isotc211.org/2005/gmd">
<gml:boundedBy>
<gml:Envelope srsName="urn:ogc:def:crs:EPSG::25833" srsDimension="2">
<gml:lowerCorner>371288.48000018 7262927.30999763</gml:lowerCorner>
<gml:upperCorner>568674.61 7607606.54000031</gml:upperCorner>
</gml:Envelope>
</gml:boundedBy>
<gml:featureMember>
<app:Lufthavn gml:id="id4c0c9f68-eb83-4931-b7ae-0b0ca561a81e">
<app:identifikasjon>
<app:Identifikasjon>
<app:lokalId>10209c2b-8ea8-46b8-99d7-f79223b09fd3</app:lokalId>
<app:navnerom>https://data.geonorge.no/sosi/samferdsel/lufthavn_punkt</app:navnerom>
<app:versjonId>20181115</app:versjonId>
</app:Identifikasjon>
</app:identifikasjon>
<app:kommunenummer>1857</app:kommunenummer>
<app:datauttaksdato>2021-06-24T04:00:11</app:datauttaksdato>
<app:posisjon>
<gml:Point gml:id="id4c0c9f68-eb83-4931-b7ae-0b0ca561a81e-0" srsName="urn:ogc:def:crs:EPSG::25833" srsDimension="2">
<gml:pos>403582.480000027 7506119.62999981</gml:pos>
</gml:Point>
</app:posisjon>
<app:lufthavnnavn>Værøy helikopterhavn</app:lufthavnnavn>
<app:ICAOKode>ENVR</app:ICAOKode>
<app:IATAKode>VRY</app:IATAKode>
<app:høydeOverHavet>4.438</app:høydeOverHavet>
</app:Lufthavn>
</gml:featureMember>
<gml:featureMember>
<app:Lufthavn gml:id="id0b0bbcd1-9127-4fa3-8883-5662dc8fa62e">
<app:identifikasjon>
<app:Identifikasjon>
<app:lokalId>ff739ca9-2e70-41a4-b56a-79b7014d1c02</app:lokalId>
<app:navnerom>https://data.geonorge.no/sosi/samferdsel/lufthavn_punkt</app:navnerom>
<app:versjonId>20181115</app:versjonId>
</app:Identifikasjon>
</app:identifikasjon>
<app:kommunenummer>1820</app:kommunenummer>
<app:datauttaksdato>2021-06-24T04:00:11</app:datauttaksdato>
<app:posisjon>
<gml:Point gml:id="id0b0bbcd1-9127-4fa3-8883-5662dc8fa62e-0" srsName="urn:ogc:def:crs:EPSG::25833" srsDimension="2">
<gml:pos>385178.19000007 7317855.14999908</gml:pos>
</gml:Point>
</app:posisjon>
<app:lufthavnnavn>Sandnessjøen lufthavn, Stokka</app:lufthavnnavn>
<app:ICAOKode>ENST</app:ICAOKode>
<app:IATAKode>SSJ</app:IATAKode>
<app:høydeOverHavet>17.463</app:høydeOverHavet>
</app:Lufthavn>
</gml:featureMember>
<gml:featureMember>
<app:Lufthavn gml:id="id0d453b17-a461-4e34-845a-79db88dd2991">
<app:identifikasjon>
<app:Identifikasjon>
<app:lokalId>db5eaa8e-7881-4e88-938a-4a8bcac5ea3f</app:lokalId>
<app:navnerom>https://data.geonorge.no/sosi/samferdsel/lufthavn_punkt</app:navnerom>
<app:versjonId>20181115</app:versjonId>
</app:Identifikasjon>
</app:identifikasjon>
<app:kommunenummer>1866</app:kommunenummer>
<app:datauttaksdato>2021-06-24T04:00:11</app:datauttaksdato>
<app:posisjon>
<gml:Point gml:id="id0d453b17-a461-4e34-845a-79db88dd2991-0" srsName="urn:ogc:def:crs:EPSG::25833" srsDimension="2">
<gml:pos>501284.63 7607606.54000031</gml:pos>
</gml:Point>
</app:posisjon>
<app:lufthavnnavn>Stokmarknes lufthavn, Skagen</app:lufthavnnavn>
<app:ICAOKode>ENSK</app:ICAOKode>
<app:IATAKode>SKN</app:IATAKode>
<app:høydeOverHavet>3.99</app:høydeOverHavet>
</app:Lufthavn>
</gml:featureMember>
</gml:FeatureCollection>
Parser code:
public GmlMapLayer[] ParseFile(string path)
{
GdalBase.ConfigureAll();
if (!GdalBase.IsConfigured)
{
throw new ApplicationException("GdalBase cannot be configured properly.");
}
using (OSGeo.OGR.Driver drv = Ogr.GetDriverByName("GML"))
{
if (drv == null)
{
throw new ApplicationException("An appropriate GML driver not found.");
}
using (var ds = drv.Open(path, 0))
{
if (ds == null)
{
throw new ApplicationException("GML file has incorrect format or not found.");
}
var layerCount = ds.GetLayerCount();
var mapLayers = new GmlMapLayer[layerCount];
for (int i = 0; i < layerCount; i++)
{
Layer layer = ds.GetLayerByIndex(i);
var layerName = layer.GetName();
Feature f;
layer.ResetReading();
List<string> features = new List<string>();
while ((f = layer.GetNextFeature()) != null)
{
Dictionary<string, string> properties = new Dictionary<string, string>();
var def = f.GetDefnRef();
var fieldCount = def.GetFieldCount();
for (int fieldIndex = 0; fieldIndex < fieldCount; fieldIndex++)
{
var field = def.GetFieldDefn(fieldIndex);
var fieldName = FixNorwegianEncoding(field.GetNameRef());
var fieldValue = f.GetFieldAsString(fieldIndex);
properties.Add(fieldName, fieldValue);
}
var propertiesString = properties.ToJsonString();
var geom = f.GetGeometryRef();
var newSP = new OSGeo.OSR.SpatialReference(null);
newSP.SetWellKnownGeogCS("EPSG:4326");
geom = geom.MakeValid();
geom.TransformTo(newSP);
var geometryJson = geom.ExportToJson(new string[0]);
if (!string.IsNullOrEmpty(geometryJson))
{
features.Add($"{{\"type\":\"Feature\",\"properties\":{propertiesString},\"geometry\":{geometryJson}}}");
}
}
var featuresString = string.Join(",", features);
var geoJSON = $"{{\"type\":\"FeatureCollection\",\"name\":\"{layerName}\", \"features\":[{featuresString}]}}";
var mapLayer = new GmlMapLayer
{
Name = layerName,
OverlayCollection = geoJSON
};
mapLayers[i] = mapLayer;
}
return mapLayers;
}
}
}
{
"type": "FeatureCollection",
"name": "Lufthavn",
"features": [
{
"type": "Feature",
"properties": {
"gml_id": "id4c0c9f68-eb83-4931-b7ae-0b0ca561a81e",
"lokalId": "10209c2b-8ea8-46b8-99d7-f79223b09fd3",
"navnerom": "https://data.geonorge.no/sosi/samferdsel/lufthavn_punkt",
"versjonId": "20181115",
"kommunenummer": "1857",
"datauttaksdato": "2021-06-24T04:00:11",
"lufthavnnavn": "Værøy helikopterhavn",
"icaoKode": "ENVR",
"iataKode": "VRY",
"høydeOverHavet": "4.438"
},
"geometry": {
"type": "Point",
"coordinates": [
12.727040456279207,
67.654549594804607,
]
}
},
{
"type": "Feature",
"properties": {
"gml_id": "id0b0bbcd1-9127-4fa3-8883-5662dc8fa62e",
"lokalId": "ff739ca9-2e70-41a4-b56a-79b7014d1c02",
"navnerom": "https://data.geonorge.no/sosi/samferdsel/lufthavn_punkt",
"versjonId": "20181115",
"kommunenummer": "1820",
"datauttaksdato": "2021-06-24T04:00:11",
"lufthavnnavn": "Sandnessjøen lufthavn, Stokka",
"icaoKode": "ENST",
"iataKode": "SSJ",
"høydeOverHavet": "17.463"
},
"geometry": {
"type": "Point",
"coordinates": [
2.130202148445286,
67.103282733197915
]
}
},
{
"type": "Feature",
"properties": {
"gml_id": "id0d453b17-a461-4e34-845a-79db88dd2991",
"lokalId": "db5eaa8e-7881-4e88-938a-4a8bcac5ea3f",
"navnerom": "https://data.geonorge.no/sosi/samferdsel/lufthavn_punkt",
"versjonId": "20181115",
"kommunenummer": "1866",
"datauttaksdato": "2021-06-24T04:00:11",
"lufthavnnavn": "Stokmarknes lufthavn, Skagen",
"icaoKode": "ENSK",
"iataKode": "SKN",
"høydeOverHavet": "3.99"
},
"geometry": {
"type": "Point",
"coordinates": [
2.671688028890271,
68.700998863765506
]
}
}
]
}
Best Answer
Drop this into https://geojson.io/ and you can see that GDAL ogr2ogr with command
ogr2ogr -f geojson -t_srs epsg:4326 norge.json norge_fixed.gml
makes the right result.You probably did something wrong with the source coordinates. See:
First example is taking EPSG:25833 coordinates correctly as easting-northing and gives the correct lon-lat coordinates. In the second example the EPSG:25833 coordinates are flipped (north coordinate used as easting) and the result shows the same wrong coordinates that you got with your code.