public IEnumerable<JObject> ReadElementElement(IAixmConverter converter, JObject currentObject, XElement element)
        {
           
            var elementElement = element.Elements().ToArray();
            if(elementElement.Length != 1)
            {
                throw new NotSupportedException("ReadElementElement do not support more than one nested element");
            }
         
            var id = currentObject["properties"]["id"];
            currentObject.SetGeometry(new JObject());
            var obj = new JObject(new JProperty("properties",new JObject(
                new JProperty("elementSource",elementElement[0].Name.LocalName),
                new JProperty("parent", id is JObject ? id["#text"].ToString() : id.ToString())
                )));

            //Need to yield the current feature when going to sub types.
            //When no sub features are returned the current feature is automaticly returned for all other cases.
            yield return currentObject;

            foreach (var feature in converter.ReadElement(obj, elementElement[0].Elements()).ToList())
            {
                yield return feature;
            }
            
       
          
        }
 public IEnumerable<JObject> ReadElevatedSurfaceElement(IAixmConverter converter, JObject currentObject, XElement element)
 {
   
     //Read elevation property and return
     return ReadSurfaceElement(converter, currentObject, element).Concat(
         converter.ReadElement(currentObject, element.Elements(aximNs + "elevation")));
 }
 public IEnumerable<JObject> ReadElement(IAixmConverter converter, JObject currentObject, XElement element)
 {
     var AixmElement = element.Elements().First();
     var feature = new JObject(new JProperty("type","Feature"));
     feature.AddToProperties("AixmType", AixmElement.Name.LocalName.ToString());
     return converter.ReadElement(feature, AixmElement.Elements());
 }
        public IEnumerable<JObject> ReadElement(IAixmConverter converter, JObject currentObject, XElement element)
        {
            var AixmTimeSlice = element.Elements().First();

          
            currentObject.AddToProperties("AixmTimeSlice", JToken.FromObject(AixmTimeSlice.Attributes().ToDictionary(a=>a.Name,a=>a.Value)));

            return converter.ReadElement(currentObject, AixmTimeSlice.Elements());
        }
        public IEnumerable<JObject> ReadExtentElement(IAixmConverter converter, JObject currentObject, XElement element)
        {
         
            currentObject.AddToProperties("geometrySource", "extent");
            //set the ElementType of the extent on feature property extentSource, to be used when writing back.
            currentObject.AddToProperties("extentSource", element.Elements().First().Name.LocalName);

            return converter.ReadElement(currentObject, element.Elements());           
        }
        public IEnumerable<JObject> ReadElement(IAixmConverter converter, JObject currentObject, XElement element)
        {
           
            XNamespace aximNs = "http://www.aixm.aero/schema/5.1";
            var AirspaceVolume = element.Descendants(aximNs + "AirspaceVolume").ToArray();
            if (AirspaceVolume.Length != 1)
                throw new NotSupportedException("AirSpaceVolme must be of length 1");


            return converter.ReadElement(currentObject, AirspaceVolume.Elements());


        }
        public IEnumerable<JObject> ReadElement(IAixmConverter converter, JObject currentObject, XElement element)
        {
            XNamespace aximNs = "http://www.aixm.aero/schema/5.1";

            //Convert ElevatedPoint to a GML Surface and convert to geojson.
            var geometry = GeometryFactory.GmlToGeometry(DownCastToPointElement(element));
                       
            //Set the geometry
            currentObject.SetGeometry(geometry);

            //Set the projection on the feature obj.
            currentObject.SetSrs(element);

            //Read elevation property and return
            return converter.ReadElement(currentObject, element.Elements(aximNs + "elevation"));
        }
        public IEnumerable<JObject> ReadGeometryComponenentElement(IAixmConverter converter, JObject currentObject, XElement element)
        {
            currentObject.AddToProperties("geometrySource", element.Elements().First().Name.LocalName);

            return converter.ReadElement(currentObject, element.Elements());
          //  currentObject.Add("geometry", JObject.FromObject(element));
          

            return Enumerable.Empty<JObject>();
        }
 public IEnumerable<JObject> ReadLocationElement(IAixmConverter converter, JObject currentObject, XElement element)
 {
     return converter.ReadElement(currentObject, element.Elements());
    
 }