def __init__(self, element): self.type = testXMLAttribute(element.find(nspv( "om20:type")), nspv("xlink:href")) self.featureOfInterest = testXMLAttribute(element.find(nspv( "om20:featureOfInterest")), nspv("xlink:href")) self.observedProperty = testXMLAttribute(element.find(nspv( "om20:observedProperty")), nspv("xlink:href")) self.procedure = testXMLAttribute(element.find(nspv( "om20:procedure")), nspv("xlink:href")) ''' Determine if phenom time is instant or a period. This depend on the type of observation -- this could be split out ''' instant_element = element.find(nspv( "om20:phenomenonTime/gml32:TimeInstant")) if instant_element is not None: self.phenomenonTime = extract_time(instant_element) else: start = extract_time(element.find(nspv( "om20:phenomenonTime/gml32:TimePeriod/gml32:beginPosition"))) end = extract_time(element.find(nspv( "om20:phenomenonTime/gml32:TimePeriod/gml32:endPosition"))) self.phenomenonTime = TimePeriod(start, end) self.resultTime = extract_time(element.find(nspv( "om20:resultTime/gml32:TimeInstant/gml32:timePosition"))) self.result = element.find(nspv("om20:result"))
def __init__(self, element): self._root = element self.id = testXMLValue(self._root.attrib.get(nspath_eval("gml:id", namespaces)), True) self.description = testXMLValue(self._root.find(nspath_eval("gml:description", namespaces))) self.name = testXMLValue(self._root.find(nspath_eval("gml:name", namespaces))) val = testXMLValue(self._root.find(nspath_eval("gml:srsName", namespaces))) if val is not None: self.srs = Crs(val) # LOOK: Check on GML boundedBy to make sure we handle all of the cases # gml:boundedBy try: envelope = self._root.find(nspath_eval("gml:boundedBy/gml:Envelope", namespaces)) lower_left_corner = testXMLValue(envelope.find(nspath_eval("gml:lowerCorner", namespaces))).split() upper_right_corner = testXMLValue(envelope.find(nspath_eval("gml:upperCorner", namespaces))).split() # (left, bottom, right, top) in self.bbox_srs units self.bbox = ( float(lower_left_corner[1]), float(lower_left_corner[0]), float(upper_right_corner[1]), float(upper_right_corner[0]), ) self.bbox_srs = Crs(testXMLValue(envelope.attrib.get("srsName"), True)) except Exception as err: self.bbox = None self.bbox_srs = None # LOOK: Support all gml:TimeGeometricPrimitivePropertyType # Right now we are just supporting gml:TimePeriod # sos:Time begin_position_element = self._root.find(nspath_eval("sos:time/gml:TimePeriod/gml:beginPosition", namespaces)) self.begin_position = extract_time(begin_position_element) end_position_element = self._root.find(nspath_eval("sos:time/gml:TimePeriod/gml:endPosition", namespaces)) self.end_position = extract_time(end_position_element) self.result_model = testXMLValue(self._root.find(nspath_eval("sos:resultModel", namespaces))) self.procedures = [] for proc in self._root.findall(nspath_eval("sos:procedure", namespaces)): self.procedures.append(testXMLValue(proc.attrib.get(nspath_eval("xlink:href", namespaces)), True)) # LOOK: Support swe:Phenomenon here # this includes compound properties self.observed_properties = [] for op in self._root.findall(nspath_eval("sos:observedProperty", namespaces)): self.observed_properties.append(testXMLValue(op.attrib.get(nspath_eval("xlink:href", namespaces)), True)) self.features_of_interest = [] for fot in self._root.findall(nspath_eval("sos:featureOfInterest", namespaces)): self.features_of_interest.append(testXMLValue(fot.attrib.get(nspath_eval("xlink:href", namespaces)), True)) self.response_formats = [] for rf in self._root.findall(nspath_eval("sos:responseFormat", namespaces)): self.response_formats.append(testXMLValue(rf)) self.response_modes = [] for rm in self._root.findall(nspath_eval("sos:responseMode", namespaces)): self.response_modes.append(testXMLValue(rm))
def __init__(self, element): self._root = element OM_NS = ns.get_versioned_namespace('om','1.0') GML_NS = ns.get_versioned_namespace('gml','3.1.1') SWE_NS = ns.get_versioned_namespace('swe','1.0') XLINK_NS = ns.get_namespace("xlink") self.name = testXMLValue(self._root.find(nsp("name", GML_NS))) self.description = testXMLValue(self._root.find(nsp("description", GML_NS))) self.observedProperties = [] for op in self._root.findall(nsp('observedProperty', OM_NS)): self.observedProperties.append(testXMLAttribute(op,nsp('href', XLINK_NS))) # BBOX try: envelope = self._root.find(nsp('boundedBy/Envelope', GML_NS)) lower_left_corner = testXMLValue(envelope.find(nsp('lowerCorner', GML_NS))).split(" ") upper_right_corner = testXMLValue(envelope.find(nsp('upperCorner', GML_NS))).split(" ") self.bbox_srs = Crs(testXMLAttribute(envelope,'srsName')) # Always keep the BBOX as minx, miny, maxx, maxy if self.bbox_srs.axisorder == "yx": self.bbox = box(float(lower_left_corner[1]), float(lower_left_corner[0]), float(upper_right_corner[1]), float(upper_right_corner[0])) else: self.bbox = box(float(lower_left_corner[0]), float(lower_left_corner[1]), float(upper_right_corner[0]), float(upper_right_corner[1])) except Exception: self.bbox = None self.bbox_srs = None # Time range fp = nsp('samplingTime', OM_NS) mp = nsp('TimePeriod', GML_NS) lp = nsp('beginPosition', GML_NS) begin_position_element = self._root.find('%s/%s/%s' % (fp, mp, lp)) self.begin_position = extract_time(begin_position_element) ep = nsp('endPosition', GML_NS) end_position_element = self._root.find('%s/%s/%s' % (fp, mp, ep)) self.end_position = extract_time(end_position_element) feature_of_interest_element = self._root.find(nsp("featureOfInterest", OM_NS)) self.feature_type = testXMLValue(feature_of_interest_element.find(nsp("FeatureCollection/metaDataProperty/name", GML_NS))) # Now the fields change depending on the FeatureType result_element = self._root.find(nsp("result", OM_NS)) #TODO: This should be implemented as a Factory self.feature = None if self.feature_type == 'timeSeries': self.feature = SweTimeSeries(feature_of_interest=feature_of_interest_element, result=result_element, GML_NS=GML_NS, OM_NS=OM_NS, SWE_NS=SWE_NS) elif self.feature_type == 'trajectoryProfile': self.feature = SweTrajectoryProfile(feature_of_interest=feature_of_interest_element, result=result_element, GML_NS=GML_NS, OM_NS=OM_NS, SWE_NS=SWE_NS) elif self.feature_type == 'timeSeriesProfile': self.feature = SweTimeseriesProfile(feature_of_interest=feature_of_interest_element, result=result_element, GML_NS=GML_NS, OM_NS=OM_NS, SWE_NS=SWE_NS)
class SosObservationOffering(object): def __init__(self, element): self._root = element self.id = testXMLValue(self._root.attrib.get(nspath_eval('gml:id', namespaces)), True) self.description = testXMLValue(self._root.find(nspath_eval('gml:description', namespaces))) self.name = testXMLValue(self._root.find(nspath_eval('gml:name', namespaces))) val = testXMLValue(self._root.find(nspath_eval('gml:srsName', namespaces))) if val is not None: self.srs = Crs(val) # LOOK: Check on GML boundedBy to make sure we handle all of the cases # gml:boundedBy try: envelope = self._root.find(nspath_eval('gml:boundedBy/gml:Envelope', namespaces)) lower_left_corner = testXMLValue(envelope.find(nspath_eval('gml:lowerCorner', namespaces))).split() upper_right_corner = testXMLValue(envelope.find(nspath_eval('gml:upperCorner', namespaces))).split() # (left, bottom, right, top) in self.bbox_srs units self.bbox = (float(lower_left_corner[1]), float(lower_left_corner[0]), float(upper_right_corner[1]), float(upper_right_corner[0])) self.bbox_srs = Crs(testXMLValue(envelope.attrib.get('srsName'), True)) except Exception, err: self.bbox = None self.bbox_srs = None # LOOK: Support all gml:TimeGeometricPrimitivePropertyType # Right now we are just supporting gml:TimePeriod # sos:Time begin_position_element = self._root.find(nspath_eval('sos:time/gml:TimePeriod/gml:beginPosition', namespaces)) self.begin_position = extract_time(begin_position_element) end_position_element = self._root.find(nspath_eval('sos:time/gml:TimePeriod/gml:endPosition', namespaces)) self.end_position = extract_time(end_position_element) self.result_model = testXMLValue(self._root.find(nspath_eval('sos:resultModel', namespaces))) self.procedures = [] for proc in self._root.findall(nspath_eval('sos:procedure', namespaces)): self.procedures.append(testXMLValue(proc.attrib.get(nspath_eval('xlink:href', namespaces)), True)) # LOOK: Support swe:Phenomenon here # this includes compound properties self.observed_properties = [] for op in self._root.findall(nspath_eval('sos:observedProperty', namespaces)): self.observed_properties.append(testXMLValue(op.attrib.get(nspath_eval('xlink:href', namespaces)), True)) self.features_of_interest = [] for fot in self._root.findall(nspath_eval('sos:featureOfInterest', namespaces)): self.features_of_interest.append(testXMLValue(fot.attrib.get(nspath_eval('xlink:href', namespaces)), True)) self.response_formats = [] for rf in self._root.findall(nspath_eval('sos:responseFormat', namespaces)): self.response_formats.append(testXMLValue(rf)) self.response_modes = [] for rm in self._root.findall(nspath_eval('sos:responseMode', namespaces)): self.response_modes.append(testXMLValue(rm))
def __init__(self, element): self._root = element self.id = testXMLValue(self._root.find(nspath_eval('swes:identifier', namespaces))) if self.id is None: self.id = testXMLValue(self._root.attrib.get(nspath_eval('swes:id', namespaces)), True) self.description = testXMLValue(self._root.find(nspath_eval('swes:description', namespaces))) self.name = testXMLValue(self._root.find(nspath_eval('swes:name', namespaces))) # sos:observedArea try: envelope = self._root.find(nspath_eval('sos:observedArea/gml32:Envelope', namespaces)) lower_left_corner = testXMLValue(envelope.find(nspath_eval('gml32:lowerCorner', namespaces))).split() upper_right_corner = testXMLValue(envelope.find(nspath_eval('gml32:upperCorner', namespaces))).split() # (left, bottom, right, top) in self.bbox_srs units self.bbox = (float(lower_left_corner[1]), float(lower_left_corner[0]), float(upper_right_corner[1]), float(upper_right_corner[0])) self.bbox_srs = Crs(testXMLValue(envelope.attrib.get('srsName'), True)) except Exception as err: self.bbox = None self.bbox_srs = None # LOOK: Support all gml:TimeGeometricPrimitivePropertyType # Right now we are just supporting gml:TimePeriod # sos:Time begin_position_element = self._root.find(nspath_eval('sos:phenomenonTime/gml32:TimePeriod/gml32:beginPosition', namespaces)) self.begin_position = extract_time(begin_position_element) end_position_element = self._root.find(nspath_eval('sos:phenomenonTime/gml32:TimePeriod/gml32:endPosition', namespaces)) self.end_position = extract_time(end_position_element) self.procedures = [] for proc in self._root.findall(nspath_eval('swes:procedure', namespaces)): self.procedures.append(testXMLValue(proc)) self.procedure_description_formats = [] for proc in self._root.findall(nspath_eval('swes:procedureDescriptionFormat', namespaces)): self.procedure_description_formats.append(testXMLValue(proc)) # LOOK: Support swe:Phenomenon here # this includes compound properties self.observed_properties = [] for op in self._root.findall(nspath_eval('swes:observableProperty', namespaces)): self.observed_properties.append(testXMLValue(op)) self.features_of_interest = [] for fot in self._root.findall(nspath_eval('sos:featureOfInterest', namespaces)): self.features_of_interest.append(testXMLValue(fot.attrib.get(nspath_eval('xlink:href', namespaces)), True)) self.response_formats = [] for rf in self._root.findall(nspath_eval('sos:responseFormat', namespaces)): self.response_formats.append(testXMLValue(rf)) self.observation_models = [] for om in self._root.findall(nspath_eval('sos:observationType', namespaces)): self.observation_models.append(testXMLValue(om))
def __init__(self, element): self._root = element self.id = testXMLValue(self._root.find(nspath_eval('swes:identifier', namespaces))) if self.id is None: self.id = testXMLValue(self._root.attrib.get(nspath_eval('swes:id', namespaces)), True) self.description = testXMLValue(self._root.find(nspath_eval('swes:description', namespaces))) self.name = testXMLValue(self._root.find(nspath_eval('swes:name', namespaces))) # sos:observedArea try: envelope = self._root.find(nspath_eval('sos:observedArea/gml32:Envelope', namespaces)) lower_left_corner = testXMLValue(envelope.find(nspath_eval('gml32:lowerCorner', namespaces))).split() upper_right_corner = testXMLValue(envelope.find(nspath_eval('gml32:upperCorner', namespaces))).split() # (left, bottom, right, top) in self.bbox_srs units self.bbox = (float(lower_left_corner[1]), float(lower_left_corner[0]), float(upper_right_corner[1]), float(upper_right_corner[0])) self.bbox_srs = Crs(testXMLValue(envelope.attrib.get('srsName'), True)) except Exception: self.bbox = None self.bbox_srs = None # LOOK: Support all gml:TimeGeometricPrimitivePropertyType # Right now we are just supporting gml:TimePeriod # sos:Time begin_position_element = self._root.find(nspath_eval('sos:phenomenonTime/gml32:TimePeriod/gml32:beginPosition', namespaces)) self.begin_position = extract_time(begin_position_element) end_position_element = self._root.find(nspath_eval('sos:phenomenonTime/gml32:TimePeriod/gml32:endPosition', namespaces)) self.end_position = extract_time(end_position_element) self.procedures = [] for proc in self._root.findall(nspath_eval('swes:procedure', namespaces)): self.procedures.append(testXMLValue(proc)) self.procedure_description_formats = [] for proc in self._root.findall(nspath_eval('swes:procedureDescriptionFormat', namespaces)): self.procedure_description_formats.append(testXMLValue(proc)) # LOOK: Support swe:Phenomenon here # this includes compound properties self.observed_properties = [] for op in self._root.findall(nspath_eval('swes:observableProperty', namespaces)): self.observed_properties.append(testXMLValue(op)) self.features_of_interest = [] for fot in self._root.findall(nspath_eval('sos:featureOfInterest', namespaces)): self.features_of_interest.append(testXMLValue(fot.attrib.get(nspath_eval('xlink:href', namespaces)), True)) self.response_formats = [] for rf in self._root.findall(nspath_eval('sos:responseFormat', namespaces)): self.response_formats.append(testXMLValue(rf)) self.observation_models = [] for om in self._root.findall(nspath_eval('sos:observationType', namespaces)): self.observation_models.append(testXMLValue(om))
def gda_member(gdaMembers): """Function to parse each "GetDataAvailability" member""" #Prefixes gdaPrefix = "gda" gdaProcedureName = gdaPrefix + ":procedure" gdaObservedPropertyName = gdaPrefix + ":observedProperty" gdaFeatureOfInterestName = gdaPrefix + ":featureOfInterest" #Applying a parsing function to the elements procedure_gda = parseGDAReferencedElement(gdaMembers, gdaProcedureName) observedProperty_gda = parseGDAReferencedElement(gdaMembers, gdaObservedPropertyName) featureOfInterest_gda = parseGDAReferencedElement( gdaMembers, gdaFeatureOfInterestName) ''' Determine if phenomenonTime is instant or period. This depend on the type of observation ''' instant_element = gdaMembers.find( nspv("gda:phenomenonTime/gml32:TimeInstant")) if instant_element is not None: phenomenonTime_gda = extract_time(instant_element) else: start = extract_time( gdaMembers.find( nspv("gda:phenomenonTime/gml32:TimePeriod/gml32:beginPosition") )) end = extract_time( gdaMembers.find( nspv("gda:phenomenonTime/gml32:TimePeriod/gml32:endPosition"))) phenomenonTime_gda = TimePeriod(start, end) resultTime_gda = extract_time( gdaMembers.find( nspv("gda:resultTime/gml32:TimeInstant/gml32:timePosition"))) #Constructing the results gda_values = [ procedure_gda, observedProperty_gda, featureOfInterest_gda, phenomenonTime_gda, start, end, resultTime_gda ] gda_index = [ 'Procedure', 'ObservedProperty', 'FeatureOfInterest', 'PhenomenonTime', 'StartTime', 'EndTime', 'ResultTime' ] a = pd.Series(gda_values, index=gda_index, name="gda_member") return (a)
def __init__(self, element): self._root = element OM_NS = ns.get_versioned_namespace('om', '1.0') GML_NS = ns.get_versioned_namespace('gml', '3.1.1') SWE_NS = ns.get_versioned_namespace('swe', '1.0') self.name = testXMLValue(self._root.find(nsp("name", GML_NS))) self.description = testXMLValue( self._root.find(nsp("description", GML_NS))) self.observedProperties = [] for op in self._root.findall(nsp('observedProperty', OM_NS)): self.observedProperties.append( testXMLAttribute(op, nspv('xlink:href'))) # BBOX try: envelope = self._root.find(nsp('boundedBy/Envelope', GML_NS)) lower_left_corner = testXMLValue( envelope.find(nsp('lowerCorner', GML_NS))).split(" ") upper_right_corner = testXMLValue( envelope.find(nsp('upperCorner', GML_NS))).split(" ") self.bbox_srs = Crs(testXMLAttribute(envelope, 'srsName')) # Always keep the BBOX as minx, miny, maxx, maxy if self.bbox_srs.axisorder == "yx": self.bbox = box(float(lower_left_corner[1]), float(lower_left_corner[0]), float(upper_right_corner[1]), float(upper_right_corner[0])) else: self.bbox = box(float(lower_left_corner[0]), float(lower_left_corner[1]), float(upper_right_corner[0]), float(upper_right_corner[1])) except Exception: self.bbox = None self.bbox_srs = None # Time range fp = nsp('samplingTime', OM_NS) mp = nsp('TimePeriod', GML_NS) lp = nsp('beginPosition', GML_NS) begin_position_element = self._root.find('%s/%s/%s' % (fp, mp, lp)) self.begin_position = extract_time(begin_position_element) ep = nsp('endPosition', GML_NS) end_position_element = self._root.find('%s/%s/%s' % (fp, mp, ep)) self.end_position = extract_time(end_position_element) feature_of_interest_element = self._root.find( nsp("featureOfInterest", OM_NS)) self.feature_type = testXMLValue( feature_of_interest_element.find( nsp("FeatureCollection/metaDataProperty/name", GML_NS))) # Now the fields change depending on the FeatureType result_element = self._root.find(nsp("result", OM_NS)) #TODO: This should be implemented as a Factory self.feature = None if self.feature_type == 'timeSeries': self.feature = SweTimeSeries( feature_of_interest=feature_of_interest_element, result=result_element, GML_NS=GML_NS, OM_NS=OM_NS, SWE_NS=SWE_NS) elif self.feature_type == 'trajectoryProfile': self.feature = SweTrajectoryProfile( feature_of_interest=feature_of_interest_element, result=result_element, GML_NS=GML_NS, OM_NS=OM_NS, SWE_NS=SWE_NS) elif self.feature_type == 'timeSeriesProfile': self.feature = SweTimeseriesProfile( feature_of_interest=feature_of_interest_element, result=result_element, GML_NS=GML_NS, OM_NS=OM_NS, SWE_NS=SWE_NS)
def __init__(self, element): self._root = element self.description = testXMLValue(self._root.find(nspv("gml311:description"))) self.begin_position = extract_time(self._root.find(nspv('om10:samplingTime/gml311:TimePeriod/gml311:beginPosition'))) self.end_position = extract_time(self._root.find(nspv('om10:samplingTime/gml311:TimePeriod/gml311:endPosition'))) self.procedures = [testXMLAttribute(e, nspv("xlink:href")) for e in self._root.findall(nspv("om10:procedure/om10:Process/gml311:member"))] self.observedProperties = [testXMLAttribute(e, nspv("xlink:href")) for e in self._root.findall(nspv("om10:observedProperty/swe101:CompositePhenomenon/swe101:component"))] # Can't use a full Xpath expression, so iterate over all metaDataProperties to find the IOOS FeatureType self.feature_type = None ft = self._root.findall(nspv("om10:featureOfInterest/gml311:FeatureCollection/gml311:metaDataProperty/gml311:GenericMetaData/gml311:name")) ft.extend(self._root.findall(nspv("om10:featureOfInterest/gml311:FeatureCollection/gml311:metaDataProperty/gml311:name"))) ft_def = "http://cf-pcmdi.llnl.gov/documents/cf-conventions/1.6/cf-conventions.html#discrete-sampling-geometries" for f in ft: if testXMLAttribute(f, "codeSpace") == ft_def: self.feature_type = testXMLValue(f) # BBOX envelope = self._root.find(nspv("om10:featureOfInterest/gml311:FeatureCollection/gml311:boundedBy/gml311:Envelope")) self.bbox_srs = Crs(testXMLAttribute(envelope, 'srsName')) lower_left_corner = testXMLValue(envelope.find(nspv('gml311:lowerCorner'))).split(" ") upper_right_corner = testXMLValue(envelope.find(nspv('gml311:upperCorner'))).split(" ") if self.bbox_srs.axisorder == "yx": self.bbox = box(float(lower_left_corner[1]), float(lower_left_corner[0]), float(upper_right_corner[1]), float(upper_right_corner[0])) else: self.bbox = box(float(lower_left_corner[0]), float(lower_left_corner[1]), float(upper_right_corner[0]), float(upper_right_corner[1])) # LOCATION location = self._root.find(nspv("om10:featureOfInterest/gml311:FeatureCollection/gml311:location")) # Should only have one child geo = list(location)[-1] self.location = {} def get_point(element, srs): name = testXMLValue(element.find(nspv("gml311:name"))) point = testXMLValue(element.find(nspv("gml311:pos"))).split(" ") if srs.axisorder == "yx": point = Point(float(point[1]), float(point[0])) else: point = Point(float(point[0]), float(point[1])) return name, point self.location_srs = Crs(testXMLAttribute(geo, "srsName")) if geo.tag == nspv("gml311:Point"): n, p = get_point(geo, self.location_srs) self.location[n] = p elif geo.tag == nspv("gml311:MultiPoint"): for point in geo.findall(nspv("gml311:pointMembers/gml311:Point")): n, p = get_point(point, self.location_srs) self.location[n] = p # Now the fields change depending on the FeatureType self.results = self._root.find(nspv("om10:result")) # TODO: This should be implemented as a Factory self.feature = None data = self.results.find(nspv("swe20:DataRecord")) if data is not None: if self.feature_type == 'timeSeries': self.feature = TimeSeries(data).feature elif self.feature_type == 'timeSeriesProfile': self.feature = TimeSeriesProfile(data).feature else: print("No feature type found.")
def __init__(self, element): self._root = element self.description = testXMLValue( self._root.find(nspv("gml311:description"))) self.begin_position = extract_time( self._root.find( nspv('om10:samplingTime/gml311:TimePeriod/gml311:beginPosition' ))) self.end_position = extract_time( self._root.find( nspv( 'om10:samplingTime/gml311:TimePeriod/gml311:endPosition'))) self.procedures = [ testXMLAttribute(e, nspv("xlink:href")) for e in self._root.findall( nspv("om10:procedure/om10:Process/gml311:member")) ] self.observedProperties = [ testXMLAttribute(e, nspv("xlink:href")) for e in self._root.findall( nspv( "om10:observedProperty/swe101:CompositePhenomenon/swe101:component" )) ] # Can't use a full Xpath expression, so iterate over all metaDataProperties to find the IOOS FeatureType self.feature_type = None ft = self._root.findall( nspv( "om10:featureOfInterest/gml311:FeatureCollection/gml311:metaDataProperty/gml311:GenericMetaData/gml311:name" )) ft.extend( self._root.findall( nspv( "om10:featureOfInterest/gml311:FeatureCollection/gml311:metaDataProperty/gml311:name" ))) ft_def = "http://cf-pcmdi.llnl.gov/documents/cf-conventions/1.6/cf-conventions.html#discrete-sampling-geometries" for f in ft: if testXMLAttribute(f, "codeSpace") == ft_def: self.feature_type = testXMLValue(f) # BBOX envelope = self._root.find( nspv( "om10:featureOfInterest/gml311:FeatureCollection/gml311:boundedBy/gml311:Envelope" )) self.bbox_srs = Crs(testXMLAttribute(envelope, 'srsName')) lower_left_corner = testXMLValue( envelope.find(nspv('gml311:lowerCorner'))).split(" ") upper_right_corner = testXMLValue( envelope.find(nspv('gml311:upperCorner'))).split(" ") if self.bbox_srs.axisorder == "yx": self.bbox = box(float(lower_left_corner[1]), float(lower_left_corner[0]), float(upper_right_corner[1]), float(upper_right_corner[0])) else: self.bbox = box(float(lower_left_corner[0]), float(lower_left_corner[1]), float(upper_right_corner[0]), float(upper_right_corner[1])) # LOCATION location = self._root.find( nspv( "om10:featureOfInterest/gml311:FeatureCollection/gml311:location" )) # Should only have one child geo = list(location)[-1] self.location = {} def get_point(element, srs): name = testXMLValue(element.find(nspv("gml311:name"))) point = testXMLValue(element.find(nspv("gml311:pos"))).split(" ") if srs.axisorder == "yx": point = Point(float(point[1]), float(point[0])) else: point = Point(float(point[0]), float(point[1])) return name, point self.location_srs = Crs(testXMLAttribute(geo, "srsName")) if geo.tag == nspv("gml311:Point"): n, p = get_point(geo, self.location_srs) self.location[n] = p elif geo.tag == nspv("gml311:MultiPoint"): for point in geo.findall(nspv("gml311:pointMembers/gml311:Point")): n, p = get_point(point, self.location_srs) self.location[n] = p # Now the fields change depending on the FeatureType self.results = self._root.find(nspv("om10:result")) # TODO: This should be implemented as a Factory self.feature = None data = self.results.find(nspv("swe20:DataRecord")) if data is not None: if self.feature_type == 'timeSeries': self.feature = TimeSeries(data).feature elif self.feature_type == 'timeSeriesProfile': self.feature = TimeSeriesProfile(data).feature else: print("No feature type found.")