geojson – Fixing Incorrect Coordinates After Converting GML to GeoJSON

cgeojsongmlosgeo

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.gmlmakes the right result.

{
"type": "FeatureCollection",
"name": "Lufthavn",
"crs": { "type": "name", "properties": { "name": "urn:ogc:def:crs:OGC:1.3:CRS84" } },
"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": "Varoy helikopterhavn", "ICAOKode": "ENVR", "IATAKode": "VRY", "hoydeOverHavet": 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": "Sandnessjoen lufthavn, Stokka", "ICAOKode": "ENST", "IATAKode": "SSJ", "hoydeOverHavet": 17.463 }, "geometry": { "type": "Point", "coordinates": [ 12.473464697204886, 65.96081704848379 ] } },
{ "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", "hoydeOverHavet": 3.99 }, "geometry": { "type": "Point", "coordinates": [ 15.031520801165499, 68.580670821003068 ] } }
]
}

You probably did something wrong with the source coordinates. See:

gdaltransform -s_srs epsg:25833 -t_srs epsg:4326
Enter X Y [Z [T]] values separated by space, and press Return.
385178.19000007 7317855.14999908
12.4734646972049 65.9608170484838 0
7317855.14999908 385178.19000007
67.1032827331979 2.13020214844529 0

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.