Example #1
0
    def _post_process(self):
        nodes = self.get_type_assets('node')
        nodetypes = self.get_type_assets('nodetype')
        subsites = self.get_type_assets('subsite')
        osites = self.get_type_assets('osite')
        sites = self.get_type_assets('site')
        ssites = self.get_type_assets('ssite')

        # Make sure all node types have a name
        for code, obj in nodetypes.iteritems():
            if not obj.get('name', None):
                obj['name'] = "(" + code + ")"

        # Add rd and parents to ssites
        for key, ssite in ssites.iteritems():
            subsite_rd_list = ssite['subsite_rd_list']
            if not 'lat_north' in ssite or not ssite['lat_north']:
                subsite_objs = [subsites[subsite_id] for subsite_id in subsite_rd_list]
                bbox = GeoUtils.calc_bounding_box_for_points(subsite_objs, key_mapping=dict(depth="depth_subsite"))
                ssite.update(bbox)
            ssite['rd'] = subsite_rd_list[0]
            ooi_rd = OOIReferenceDesignator(subsite_rd_list[0])
            site = sites[ooi_rd.site_rd]
            osite = osites[site['osite']]
            if 'ssite_list' not in osite:
                osite['ssite_list'] = []
            osite['ssite_list'].append(key)
            ssite['parent_id'] = osite['site_rd_list'][0]

        # Add rd to osites
        for key, osite in osites.iteritems():
            site_rd_list = osite['site_rd_list']
            ssite_list = osite.get('ssite_list', [])

            ssite_objs = [ssites[ss_id] for ss_id in ssite_list]
            bbox = GeoUtils.calc_bounding_box_for_boxes(ssite_objs)

            osite.update(bbox)
            osite['rd'] = site_rd_list[0]

        # Make sure all nodes have a name and geospatial coordinates
        for ooi_rd, obj in nodes.iteritems():
            if not obj.get('name', None):
                name = subsites[ooi_rd[:8]]['name'] + " - " + nodetypes[ooi_rd[9:11]]['name']
                obj['name'] = name
            if not obj.get('latitude', None):
                pass
    def _calc_geospatial_point_center(self, site):

        siteTypes = [RT.Site, RT.Subsite, RT.Observatory, RT.PlatformSite, RT.InstrumentSite]
        if site and site.type_ in siteTypes:
            # if the geospatial_bounds is set then calculate the geospatial_point_center
            for constraint in site.constraint_list:
                if constraint.type_ == OT.GeospatialBounds:
                    site.geospatial_point_center = GeoUtils.calc_geospatial_point_center(constraint)
 def _geodp(self, x1, y1, x2=None, y2=None, z1=0.0, z2=None, t1="", t2=None):
     if x2 is None: x2 = x1
     if y2 is None: y2 = y1
     if z2 is None: z2 = z1
     if t2 is None: t2 = t1
     bounds = self._geobb(x1, y1, x2, y2, z1, z2)
     attrs = dict(location=GeoUtils.calc_geospatial_point_center(bounds, return_location=True),
                  geospatial_bounds=bounds,
                  temporal_bounds=self._temprng(t1, t2))
     return attrs
 def _geodp(self, x1, y1, x2=None, y2=None, z1=0.0, z2=None, t1="", t2=None):
     if x2 is None: x2 = x1
     if y2 is None: y2 = y1
     if z2 is None: z2 = z1
     if t2 is None: t2 = t1
     bounds = self._geobb(x1, y1, x2, y2, z1, z2)
     attrs = dict(geospatial_point_center=GeoUtils.calc_geospatial_point_center(bounds),
                  geospatial_bounds=bounds,
                  nominal_datetime=self._temprng(t1, t2))
     return attrs
Example #5
0
def get_obj_geospatial_point(doc, calculate=True):
    """Extracts a geospatial point (lat, lon, elev) from given object dict, by looking for an attribute with
    GeospatialIndex or GeospatialPoint or GeospatialLocation type or computing the center from a bounds
    """
    geo_center = None
    # TODO: Be more flexible about finding attributes with the right types
    if "location" in doc:
        geo_center = doc["location"]
    if "geospatial_point_center" in doc:
        geo_center = doc["geospatial_point_center"]
    if "details" in doc and type(
            doc["details"]) is dict and "location" in doc["details"]:
        geo_center = doc["details"]["location"]
    if not geo_center and calculate:
        # Try to calculate center point from bounds
        present, geo_bounds = get_obj_geospatial_bounds(doc,
                                                        calculate=False,
                                                        return_geo_bounds=True)
        if present:
            try:
                from ion.util.geo_utils import GeoUtils
                geo_bounds_obj = DotDict(**geo_bounds)
                geo_center = GeoUtils.calc_geospatial_point_center(
                    geo_bounds_obj)
            except Exception:
                log.exception("Could not calculate geospatial center point")
    if geo_center and isinstance(geo_center, dict):
        if "lat" in geo_center and "lon" in geo_center:
            lat, lon = geo_center.get("lat", 0), geo_center.get("lon", 0)
            if lat or lon:
                return True, (lat, lon, 0)
        elif "latitude" in geo_center and "longitude" in geo_center:
            lat, lon = geo_center.get("latitude",
                                      0), geo_center.get("longitude", 0)
            elev = geo_center.get("elevation", 0)
            if lat or lon or elev:
                return True, (lat, lon, elev)
        elif "geospatial_latitude" in geo_center and "geospatial_longitude" in geo_center:
            lat, lon = geo_center.get("geospatial_latitude",
                                      0), geo_center.get(
                                          "geospatial_longitude", 0)
            elev = geo_center.get("geospatial_vertical_location", 0)
            if lat or lon:
                return True, (lat, lon, elev)
    return False, (0, 0, 0)
def get_obj_geospatial_point(doc, calculate=True):
    """Extracts a geospatial point (lat, lon, elev) from given object dict, by looking for an attribute with
    GeospatialIndex or GeospatialPoint or GeospatialLocation type or computing the center from a bounds
    """
    geo_center = None
    # TODO: Be more flexible about finding attributes with the right types
    if "location" in doc:
        geo_center = doc["location"]
    if "geospatial_point_center" in doc:
        geo_center = doc["geospatial_point_center"]
    if "details" in doc and type(
            doc["details"]) is dict and "location" in doc["details"]:
        geo_center = doc["details"]["location"]
    if not geo_center and calculate:
        # Try to calculate center point from bounds
        present, geo_bounds = get_obj_geospatial_bounds(
            doc, calculate=False, return_geo_bounds=True)
        if present:
            try:
                from ion.util.geo_utils import GeoUtils
                geo_bounds_obj = DotDict(**geo_bounds)
                geo_center = GeoUtils.calc_geospatial_point_center(
                    geo_bounds_obj)
            except Exception:
                log.exception("Could not calculate geospatial center point")
    if geo_center and isinstance(geo_center, dict):
        if "lat" in geo_center and "lon" in geo_center:
            lat, lon = geo_center.get("lat", 0), geo_center.get("lon", 0)
            if lat or lon:
                return True, (lat, lon, 0)
        elif "latitude" in geo_center and "longitude" in geo_center:
            lat, lon = geo_center.get("latitude", 0), geo_center.get(
                "longitude", 0)
            elev = geo_center.get("elevation", 0)
            if lat or lon or elev:
                return True, (lat, lon, elev)
        elif "geospatial_latitude" in geo_center and "geospatial_longitude" in geo_center:
            lat, lon = geo_center.get("geospatial_latitude",
                                      0), geo_center.get(
                                          "geospatial_longitude", 0)
            elev = geo_center.get("geospatial_vertical_location", 0)
            if lat or lon:
                return True, (lat, lon, elev)
    return False, (0, 0, 0)
 def _geodp(self,
            x1,
            y1,
            x2=None,
            y2=None,
            z1=0.0,
            z2=None,
            t1="",
            t2=None):
     if x2 is None: x2 = x1
     if y2 is None: y2 = y1
     if z2 is None: z2 = z1
     if t2 is None: t2 = t1
     bounds = self._geobb(x1, y1, x2, y2, z1, z2)
     attrs = dict(location=GeoUtils.calc_geospatial_point_center(
         bounds, return_location=True),
                  geospatial_bounds=bounds,
                  temporal_bounds=self._temprng(t1, t2))
     return attrs
Example #8
0
    def _post_process(self):
        node_objs = self.get_type_assets("node")
        nodetypes = self.get_type_assets('nodetype')
        subsites = self.get_type_assets('subsite')
        osites = self.get_type_assets('osite')
        sites = self.get_type_assets('site')
        ssites = self.get_type_assets('ssite')
        inst_objs = self.get_type_assets("instrument")
        series_objs = self.get_type_assets("series")
        pagent_objs = self.get_type_assets("platformagent")

        # Make sure all node types have a name
        for code, obj in nodetypes.iteritems():
            if not obj.get('name', None):
                obj['name'] = "(" + code + ")"

        # Add rd and parents to ssites. Bounding box
        for key, ssite in ssites.iteritems():
            subsite_rd_list = ssite['subsite_rd_list']
            if not 'lat_north' in ssite or not ssite['lat_north']:
                subsite_objs = [subsites[subsite_id] for subsite_id in subsite_rd_list]
                bbox = GeoUtils.calc_bounding_box_for_points(subsite_objs, key_mapping=dict(depth="depth_subsite"))
                ssite.update(bbox)
            ssite['rd'] = subsite_rd_list[0]
            ooi_rd = OOIReferenceDesignator(subsite_rd_list[0])
            site = sites[ooi_rd.site_rd]
            osite = osites[site['osite']]
            if 'ssite_list' not in osite:
                osite['ssite_list'] = []
            osite['ssite_list'].append(key)
            ssite['parent_id'] = osite['site_rd_list'][0]

        # Add rd to osites. Bounding box
        for key, osite in osites.iteritems():
            site_rd_list = osite['site_rd_list']
            ssite_list = osite.get('ssite_list', [])

            ssite_objs = [ssites[ss_id] for ss_id in ssite_list]
            bbox = GeoUtils.calc_bounding_box_for_boxes(ssite_objs)

            osite.update(bbox)
            osite['rd'] = site_rd_list[0]

        # Post-process "node" objects:
        # - Make sure all nodes have a name, geospatial coordinates and platform agent connection info
        # - Convert available node First Deploy Date and override date into datetime objects
        for node_id, node_obj in node_objs.iteritems():
            if not node_obj.get('name', None):
                name = subsites[node_id[:8]]['name'] + " - " + nodetypes[node_id[9:11]]['name']
                node_obj['name'] = name
            if not node_obj.get('latitude', None):
                pass

            pagent_type = node_obj.get('platform_agent_type', "")
            pagent_obj = pagent_objs.get(pagent_type, None)
            if pagent_obj:
                instrument_agent_rt = pagent_obj['rt_data_path'] == "Direct"
                data_agent_rt = pagent_obj['rt_data_path'] == "File Transfer"
                data_agent_recovery = pagent_obj['rt_data_acquisition'] == "Partial"
                node_obj['instrument_agent_rt'] = instrument_agent_rt
                node_obj['data_agent_rt'] = data_agent_rt
                node_obj['data_agent_recovery'] = data_agent_recovery

            if 'deployment_start' not in node_obj:
                log.warn("Node %s appears not in mapping spreadsheet - inconsistency?!", node_id)
                # Parse SAF date
            node_deploy_date = node_obj.get('First Deployment Date', None)
            node_obj['SAF_deploy_date'] = self._parse_date(node_deploy_date, DEFAULT_MAX_DATE)
            # Parse override date if available or set to SAF date
            node_obj['deploy_date'] = self._parse_date(node_obj.get('deployment_start', None), node_obj['SAF_deploy_date'])

        # Post-process "instrument" objects:
        # - Set connection info based on platform platform agent
        # - Convert available instrument First Deploy Date into datetime objects
        for inst_id, inst_obj in inst_objs.iteritems():
            inst_rd = OOIReferenceDesignator(inst_id)
            # Parse override date if available or set to SAF date
            inst_obj['SAF_deploy_date'] = self._parse_date(inst_obj.get('First Deployment Date', None), DEFAULT_MAX_DATE)
            inst_obj['deploy_date'] = inst_obj['SAF_deploy_date']

            # Set instrument connection info based on node platform agent connection and instrument agent
            series_obj = series_objs[inst_rd.series_rd]

            node_id = inst_rd.node_rd
            node_obj = node_objs[node_id]
            pagent_type = node_obj['platform_agent_type']
            pagent_obj = pagent_objs[pagent_type]

            instrument_agent_rt = (pagent_obj['rt_data_path'] == "Direct") and series_obj['ia_exists']
            data_agent_rt = (pagent_obj['rt_data_path'] == "File Transfer") and series_obj['dart_exists']
            data_agent_recovery = pagent_obj['rt_data_acquisition'] == "Partial" or not (series_obj['ia_exists'] or series_obj['dart_exists'])
            inst_obj['ia_rt_data'] = instrument_agent_rt
            inst_obj['da_rt'] = data_agent_rt
            inst_obj['da_pr'] = data_agent_recovery

        # Check all series are in spreadsheet
        for series_id, series_obj in series_objs.iteritems():
            if series_obj.get("tier1", None) is None:
                log.warn("Series %s appears not in mapping spreadsheet - inconsistency?!", series_id)
    def test_midpoint(self):
        geospatial_bounds = IonObject("GeospatialBounds")
        geospatial_bounds.geospatial_latitude_limit_north = 10
        geospatial_bounds.geospatial_latitude_limit_south = -10
        geospatial_bounds.geospatial_longitude_limit_east = 10
        geospatial_bounds.geospatial_longitude_limit_west = -10

        # Basic test
        #TODO. do we really want calc_geospatial_point_center() to return string?
        mid_point = GeoUtils.calc_geospatial_point_center(geospatial_bounds)
        self.assertAlmostEqual(mid_point.lat, 0.0)
        self.assertAlmostEqual(mid_point.lon, 0.0)

        mid_point = GeoUtils.calc_geospatial_point_center(
            geospatial_bounds, distance=GeoUtils.DISTANCE_SHORTEST)
        self.assertAlmostEqual(mid_point.lat, 0.0)
        self.assertAlmostEqual(mid_point.lon, 0.0)

        mid_point = GeoUtils.calc_geospatial_point_center(
            geospatial_bounds, distance=GeoUtils.DISTANCE_LONGEST)
        self.assertAlmostEqual(mid_point.lat, 0.0)
        self.assertAlmostEqual(mid_point.lon, -180)

        geospatial_bounds.geospatial_latitude_limit_north = 10
        geospatial_bounds.geospatial_latitude_limit_south = -10
        geospatial_bounds.geospatial_longitude_limit_east = 179
        geospatial_bounds.geospatial_longitude_limit_west = -179

        mid_point = GeoUtils.calc_geospatial_point_center(geospatial_bounds)
        self.assertAlmostEqual(mid_point.lat, 0.0)
        self.assertAlmostEqual(mid_point.lon, 0.0)
        mid_point = GeoUtils.calc_geospatial_point_center(
            geospatial_bounds, distance=GeoUtils.DISTANCE_SHORTEST)
        self.assertAlmostEqual(mid_point.lat, 0.0)
        self.assertAlmostEqual(mid_point.lon, -180.0)
        mid_point = GeoUtils.calc_geospatial_point_center(
            geospatial_bounds, distance=GeoUtils.DISTANCE_LONGEST)
        self.assertAlmostEqual(mid_point.lat, 0.0)
        self.assertAlmostEqual(mid_point.lon, 0.0)
        geospatial_bounds.geospatial_longitude_limit_east = -179
        geospatial_bounds.geospatial_longitude_limit_west = 179
        mid_point = GeoUtils.calc_geospatial_point_center(geospatial_bounds)
        self.assertAlmostEqual(mid_point.lon, -180.0)

        geospatial_bounds.geospatial_latitude_limit_north = 90
        geospatial_bounds.geospatial_latitude_limit_south = -90
        geospatial_bounds.geospatial_longitude_limit_east = 0
        geospatial_bounds.geospatial_longitude_limit_west = 0
        mid_point = GeoUtils.calc_geospatial_point_center(geospatial_bounds)
        self.assertAlmostEqual(mid_point.lat, 0.0)
        self.assertAlmostEqual(mid_point.lon, 0.0)
        # MM: changed this: if the same values are given, we expect a point not the full globe
        #self.assertAlmostEqual(mid_point.lon, -180.0)

        geospatial_bounds.geospatial_latitude_limit_north = 40
        geospatial_bounds.geospatial_latitude_limit_south = 50
        geospatial_bounds.geospatial_longitude_limit_east = -75
        geospatial_bounds.geospatial_longitude_limit_west = -125
        mid_point = GeoUtils.calc_geospatial_point_center(geospatial_bounds)
        self.assertAlmostEqual(mid_point.lat, 47.801397, 6)
        self.assertAlmostEqual(mid_point.lon, -102.328727, 6)
        mid_point = GeoUtils.calc_geospatial_point_center(
            geospatial_bounds, distance=GeoUtils.DISTANCE_SHORTEST)
        self.assertAlmostEqual(mid_point.lat, 47.801397, 6)
        self.assertAlmostEqual(mid_point.lon, -102.328727, 6)

        mid_point = GeoUtils.calc_geospatial_point_center(
            geospatial_bounds, distance=GeoUtils.DISTANCE_LONGEST)
        self.assertAlmostEqual(mid_point.lat, 47.801397, 6)
        self.assertAlmostEqual(mid_point.lon, 77.671273, 6)

        geospatial_bounds.geospatial_longitude_limit_west = 165
        geospatial_bounds.geospatial_latitude_limit_north = 5
        geospatial_bounds.geospatial_longitude_limit_east = -170
        geospatial_bounds.geospatial_latitude_limit_south = 5
        mid_point = GeoUtils.calc_geospatial_point_center(geospatial_bounds)
        self.assertAlmostEqual(mid_point.lat, 5.121583, 6)
        self.assertAlmostEqual(mid_point.lon, 177.5, 6)

        geospatial_bounds.geospatial_longitude_limit_west = 65
        geospatial_bounds.geospatial_latitude_limit_north = 0
        geospatial_bounds.geospatial_longitude_limit_east = 165
        geospatial_bounds.geospatial_latitude_limit_south = 0
        mid_point = GeoUtils.calc_geospatial_point_center(geospatial_bounds)
        self.assertAlmostEqual(mid_point.lat, 0.0, 6)
        self.assertAlmostEqual(mid_point.lon, 115.0, 6)

        geospatial_bounds.geospatial_longitude_limit_west = 10.0
        geospatial_bounds.geospatial_latitude_limit_north = 0
        geospatial_bounds.geospatial_longitude_limit_east = -150
        geospatial_bounds.geospatial_latitude_limit_south = 0
        mid_point = GeoUtils.calc_geospatial_point_center(geospatial_bounds)
        self.assertAlmostEqual(mid_point.lat, 0.0, 6)
        self.assertAlmostEqual(mid_point.lon, 110.0, 6)

        geospatial_bounds.geospatial_longitude_limit_west = -150
        geospatial_bounds.geospatial_latitude_limit_north = 0
        geospatial_bounds.geospatial_longitude_limit_east = 170
        geospatial_bounds.geospatial_latitude_limit_south = 0
        mid_point = GeoUtils.calc_geospatial_point_center(geospatial_bounds)
        self.assertAlmostEqual(mid_point.lat, 0.0, 6)
        self.assertAlmostEqual(mid_point.lon, 10.0, 6)

        geospatial_bounds.geospatial_longitude_limit_west = 30
        geospatial_bounds.geospatial_latitude_limit_north = 0
        geospatial_bounds.geospatial_longitude_limit_east = 10
        geospatial_bounds.geospatial_latitude_limit_south = 0
        mid_point = GeoUtils.calc_geospatial_point_center(geospatial_bounds)
        self.assertAlmostEqual(mid_point.lat, 0.0, 6)
        self.assertAlmostEqual(mid_point.lon, -160.0, 6)

        geospatial_bounds.geospatial_longitude_limit_west = 10
        geospatial_bounds.geospatial_latitude_limit_north = 0
        geospatial_bounds.geospatial_longitude_limit_east = 50
        geospatial_bounds.geospatial_latitude_limit_south = 0
        mid_point = GeoUtils.calc_geospatial_point_center(geospatial_bounds)
        self.assertAlmostEqual(mid_point.lat, 0.0, 6)
        self.assertAlmostEqual(mid_point.lon, 30.0, 6)

        geospatial_bounds.geospatial_longitude_limit_west = -170
        geospatial_bounds.geospatial_latitude_limit_north = 0
        geospatial_bounds.geospatial_longitude_limit_east = -10
        geospatial_bounds.geospatial_latitude_limit_south = 0
        mid_point = GeoUtils.calc_geospatial_point_center(geospatial_bounds)
        self.assertAlmostEqual(mid_point.lat, 0.0, 6)
        self.assertAlmostEqual(mid_point.lon, -90.0, 6)

        # Bad requests
        with self.assertRaises(BadRequest):
            GeoUtils.calc_geospatial_point_center(geospatial_bounds,
                                                  distance="spacetime")
        geospatial_bounds.geospatial_latitude_limit_north = 10
        geospatial_bounds.geospatial_latitude_limit_south = -10
        geospatial_bounds.geospatial_longitude_limit_east = 10
        geospatial_bounds.geospatial_longitude_limit_west = -181
        with self.assertRaises(BadRequest):
            GeoUtils.calc_geospatial_point_center(geospatial_bounds)

        geospatial_bounds.geospatial_latitude_limit_north = 10
        geospatial_bounds.geospatial_latitude_limit_south = -10
        geospatial_bounds.geospatial_longitude_limit_east = 181
        geospatial_bounds.geospatial_longitude_limit_west = -10
        with self.assertRaises(BadRequest):
            GeoUtils.calc_geospatial_point_center(geospatial_bounds)

        geospatial_bounds.geospatial_latitude_limit_north = 10
        geospatial_bounds.geospatial_latitude_limit_south = -91
        geospatial_bounds.geospatial_longitude_limit_east = 181
        geospatial_bounds.geospatial_longitude_limit_west = -10
        with self.assertRaises(BadRequest):
            GeoUtils.calc_geospatial_point_center(geospatial_bounds)

        geospatial_bounds.geospatial_latitude_limit_north = 91
        geospatial_bounds.geospatial_latitude_limit_south = -10
        geospatial_bounds.geospatial_longitude_limit_east = 0
        geospatial_bounds.geospatial_longitude_limit_west = -10
        with self.assertRaises(BadRequest):
            GeoUtils.calc_geospatial_point_center(geospatial_bounds)
Example #10
0
    def test_midpoint(self):
        geospatial_bounds = IonObject("GeospatialBounds")
        geospatial_bounds.geospatial_latitude_limit_north = 10
        geospatial_bounds.geospatial_latitude_limit_south = -10
        geospatial_bounds.geospatial_longitude_limit_east = 10
        geospatial_bounds.geospatial_longitude_limit_west = -10

        # Basic test
        #TODO. do we really want calc_geospatial_point_center() to return string?
        mid_point = GeoUtils.calc_geospatial_point_center(geospatial_bounds)
        self.assertAlmostEqual(mid_point.lat, 0.0)
        self.assertAlmostEqual(mid_point.lon, 0.0)

        mid_point = GeoUtils.calc_geospatial_point_center(geospatial_bounds, distance=GeoUtils.DISTANCE_SHORTEST)
        self.assertAlmostEqual(mid_point.lat, 0.0)
        self.assertAlmostEqual(mid_point.lon, 0.0)

        mid_point = GeoUtils.calc_geospatial_point_center(geospatial_bounds, distance=GeoUtils.DISTANCE_LONGEST)
        self.assertAlmostEqual(mid_point.lat, 0.0)
        self.assertAlmostEqual(mid_point.lon, -180)


        geospatial_bounds.geospatial_latitude_limit_north = 10
        geospatial_bounds.geospatial_latitude_limit_south = -10
        geospatial_bounds.geospatial_longitude_limit_east = 179
        geospatial_bounds.geospatial_longitude_limit_west = -179

        mid_point = GeoUtils.calc_geospatial_point_center(geospatial_bounds)
        self.assertAlmostEqual(mid_point.lat, 0.0)
        self.assertAlmostEqual(mid_point.lon, 0.0)
        mid_point = GeoUtils.calc_geospatial_point_center(geospatial_bounds, distance=GeoUtils.DISTANCE_SHORTEST)
        self.assertAlmostEqual(mid_point.lat, 0.0)
        self.assertAlmostEqual(mid_point.lon, -180.0)
        mid_point = GeoUtils.calc_geospatial_point_center(geospatial_bounds, distance=GeoUtils.DISTANCE_LONGEST)
        self.assertAlmostEqual(mid_point.lat, 0.0)
        self.assertAlmostEqual(mid_point.lon, 0.0)
        geospatial_bounds.geospatial_longitude_limit_east = -179
        geospatial_bounds.geospatial_longitude_limit_west = 179
        mid_point = GeoUtils.calc_geospatial_point_center(geospatial_bounds)
        self.assertAlmostEqual(mid_point.lon, -180.0)


        geospatial_bounds.geospatial_latitude_limit_north = 90
        geospatial_bounds.geospatial_latitude_limit_south = -90
        geospatial_bounds.geospatial_longitude_limit_east = 0
        geospatial_bounds.geospatial_longitude_limit_west = 0
        mid_point = GeoUtils.calc_geospatial_point_center(geospatial_bounds)
        self.assertAlmostEqual(mid_point.lat, 0.0)
        self.assertAlmostEqual(mid_point.lon, 0.0)
        # MM: changed this: if the same values are given, we expect a point not the full globe
        #self.assertAlmostEqual(mid_point.lon, -180.0)

        geospatial_bounds.geospatial_latitude_limit_north = 40
        geospatial_bounds.geospatial_latitude_limit_south = 50
        geospatial_bounds.geospatial_longitude_limit_east = -75
        geospatial_bounds.geospatial_longitude_limit_west = -125
        mid_point = GeoUtils.calc_geospatial_point_center(geospatial_bounds)
        self.assertAlmostEqual(mid_point.lat, 47.801397, 6)
        self.assertAlmostEqual(mid_point.lon, -102.328727, 6)
        mid_point = GeoUtils.calc_geospatial_point_center(geospatial_bounds, distance=GeoUtils.DISTANCE_SHORTEST)
        self.assertAlmostEqual(mid_point.lat, 47.801397, 6)
        self.assertAlmostEqual(mid_point.lon, -102.328727, 6)

        mid_point = GeoUtils.calc_geospatial_point_center(geospatial_bounds, distance=GeoUtils.DISTANCE_LONGEST)
        self.assertAlmostEqual(mid_point.lat, 47.801397, 6)
        self.assertAlmostEqual(mid_point.lon, 77.671273, 6)

        geospatial_bounds.geospatial_longitude_limit_west = 165
        geospatial_bounds.geospatial_latitude_limit_north = 5
        geospatial_bounds.geospatial_longitude_limit_east = -170
        geospatial_bounds.geospatial_latitude_limit_south = 5
        mid_point = GeoUtils.calc_geospatial_point_center(geospatial_bounds)
        self.assertAlmostEqual(mid_point.lat, 5.121583, 6)
        self.assertAlmostEqual(mid_point.lon, 177.5, 6)

        geospatial_bounds.geospatial_longitude_limit_west = 65
        geospatial_bounds.geospatial_latitude_limit_north = 0
        geospatial_bounds.geospatial_longitude_limit_east = 165
        geospatial_bounds.geospatial_latitude_limit_south = 0
        mid_point = GeoUtils.calc_geospatial_point_center(geospatial_bounds)
        self.assertAlmostEqual(mid_point.lat, 0.0, 6)
        self.assertAlmostEqual(mid_point.lon, 115.0, 6)

        geospatial_bounds.geospatial_longitude_limit_west = 10.0
        geospatial_bounds.geospatial_latitude_limit_north = 0
        geospatial_bounds.geospatial_longitude_limit_east = -150
        geospatial_bounds.geospatial_latitude_limit_south = 0
        mid_point = GeoUtils.calc_geospatial_point_center(geospatial_bounds)
        self.assertAlmostEqual(mid_point.lat, 0.0, 6)
        self.assertAlmostEqual(mid_point.lon, 110.0, 6)

        geospatial_bounds.geospatial_longitude_limit_west = -150
        geospatial_bounds.geospatial_latitude_limit_north = 0
        geospatial_bounds.geospatial_longitude_limit_east = 170
        geospatial_bounds.geospatial_latitude_limit_south = 0
        mid_point = GeoUtils.calc_geospatial_point_center(geospatial_bounds)
        self.assertAlmostEqual(mid_point.lat, 0.0, 6)
        self.assertAlmostEqual(mid_point.lon, 10.0, 6)

        geospatial_bounds.geospatial_longitude_limit_west = 30
        geospatial_bounds.geospatial_latitude_limit_north = 0
        geospatial_bounds.geospatial_longitude_limit_east = 10
        geospatial_bounds.geospatial_latitude_limit_south = 0
        mid_point = GeoUtils.calc_geospatial_point_center(geospatial_bounds)
        self.assertAlmostEqual(mid_point.lat, 0.0, 6)
        self.assertAlmostEqual(mid_point.lon, -160.0, 6)

        geospatial_bounds.geospatial_longitude_limit_west = 10
        geospatial_bounds.geospatial_latitude_limit_north = 0
        geospatial_bounds.geospatial_longitude_limit_east = 50
        geospatial_bounds.geospatial_latitude_limit_south = 0
        mid_point = GeoUtils.calc_geospatial_point_center(geospatial_bounds)
        self.assertAlmostEqual(mid_point.lat, 0.0, 6)
        self.assertAlmostEqual(mid_point.lon, 30.0, 6)

        geospatial_bounds.geospatial_longitude_limit_west = -170
        geospatial_bounds.geospatial_latitude_limit_north = 0
        geospatial_bounds.geospatial_longitude_limit_east = -10
        geospatial_bounds.geospatial_latitude_limit_south = 0
        mid_point = GeoUtils.calc_geospatial_point_center(geospatial_bounds)
        self.assertAlmostEqual(mid_point.lat, 0.0, 6)
        self.assertAlmostEqual(mid_point.lon, -90.0, 6)

        # Bad requests
        with self.assertRaises(BadRequest):
            GeoUtils.calc_geospatial_point_center(geospatial_bounds, distance="spacetime")
        geospatial_bounds.geospatial_latitude_limit_north = 10
        geospatial_bounds.geospatial_latitude_limit_south = -10
        geospatial_bounds.geospatial_longitude_limit_east = 10
        geospatial_bounds.geospatial_longitude_limit_west = -181
        with self.assertRaises(BadRequest):
            GeoUtils.calc_geospatial_point_center(geospatial_bounds)

        geospatial_bounds.geospatial_latitude_limit_north = 10
        geospatial_bounds.geospatial_latitude_limit_south = -10
        geospatial_bounds.geospatial_longitude_limit_east = 181
        geospatial_bounds.geospatial_longitude_limit_west = -10
        with self.assertRaises(BadRequest):
            GeoUtils.calc_geospatial_point_center(geospatial_bounds)

        geospatial_bounds.geospatial_latitude_limit_north = 10
        geospatial_bounds.geospatial_latitude_limit_south = -91
        geospatial_bounds.geospatial_longitude_limit_east = 181
        geospatial_bounds.geospatial_longitude_limit_west = -10
        with self.assertRaises(BadRequest):
            GeoUtils.calc_geospatial_point_center(geospatial_bounds)

        geospatial_bounds.geospatial_latitude_limit_north = 91
        geospatial_bounds.geospatial_latitude_limit_south = -10
        geospatial_bounds.geospatial_longitude_limit_east = 0
        geospatial_bounds.geospatial_longitude_limit_west = -10
        with self.assertRaises(BadRequest):
            GeoUtils.calc_geospatial_point_center(geospatial_bounds)