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
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
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)
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)