def test_props(): crs = epsg4326 box1 = geometry.box(10, 10, 30, 30, crs=crs) assert box1 assert box1.is_valid assert not box1.is_empty assert box1.area == 400.0 assert box1.boundary.length == 80.0 assert box1.centroid == geometry.point(20, 20, crs) triangle = geometry.polygon([(10, 20), (20, 20), (20, 10), (10, 20)], crs=crs) assert triangle.envelope == geometry.BoundingBox(10, 10, 20, 20) outer = next(iter(box1)) assert outer.length == 80.0 box1copy = geometry.box(10, 10, 30, 30, crs=crs) assert box1 == box1copy assert box1.convex_hull == box1copy # NOTE: this might fail because of point order box2 = geometry.box(20, 10, 40, 30, crs=crs) assert box1 != box2 bbox = geometry.BoundingBox(1, 0, 10, 13) assert bbox.width == 9 assert bbox.height == 13 pt = geometry.point(3, 4, crs) assert pt.json['coordinates'] == (3.0, 4.0) assert 'Point' in str(pt) assert bool(pt) is True assert pt.__nonzero__() is True
def test_gridspec_upperleft(): """ Test to ensure grid indexes can be counted correctly from bottom left or top left """ tile_bbox = geometry.BoundingBox(left=1934400.0, top=2414800.0, right=2084400.000, bottom=2264800.000) bbox = geometry.BoundingBox(left=1934615, top=2379460, right=1937615, bottom=2376460) # Upper left - validated against WELD product tile calculator # http://globalmonitoring.sdstate.edu/projects/weld/tilecalc.php gs = GridSpec(crs=geometry.CRS('EPSG:5070'), tile_size=(-150000, 150000), resolution=(-30, 30), origin=(3314800.0, -2565600.0)) cells = {index: geobox for index, geobox in list(gs.tiles(bbox))} assert set(cells.keys()) == {(30, 6)} assert cells[(30, 6)].extent.boundingbox == tile_bbox gs = GridSpec(crs=geometry.CRS('EPSG:5070'), tile_size=(150000, 150000), resolution=(-30, 30), origin=(14800.0, -2565600.0)) cells = {index: geobox for index, geobox in list(gs.tiles(bbox))} assert set(cells.keys()) == { (30, 15) } # WELD grid spec has 21 vertical cells -- 21 - 6 = 15 assert cells[(30, 15)].extent.boundingbox == tile_bbox
def test_props(): crs = epsg4326 box1 = geometry.box(10, 10, 30, 30, crs=crs) assert box1 assert box1.is_valid assert not box1.is_empty assert box1.area == 400.0 assert box1.boundary.length == 80.0 assert box1.centroid == geometry.point(20, 20, crs) triangle = geometry.polygon([(10, 20), (20, 20), (20, 10), (10, 20)], crs=crs) assert triangle.boundingbox == geometry.BoundingBox(10, 10, 20, 20) assert triangle.envelope.contains(triangle) assert box1.length == 80.0 box1copy = geometry.box(10, 10, 30, 30, crs=crs) assert box1 == box1copy assert box1.convex_hull == box1copy # NOTE: this might fail because of point order box2 = geometry.box(20, 10, 40, 30, crs=crs) assert box1 != box2 bbox = geometry.BoundingBox(1, 0, 10, 13) assert bbox.width == 9 assert bbox.height == 13 assert bbox.points == [(1, 0), (1, 13), (10, 0), (10, 13)] assert bbox.transform(Affine.identity()) == bbox assert bbox.transform(Affine.translation(1, 2)) == geometry.BoundingBox( 2, 2, 11, 15) pt = geometry.point(3, 4, crs) assert pt.json['coordinates'] == (3.0, 4.0) assert 'Point' in str(pt) assert bool(pt) is True assert pt.__nonzero__() is True # check "CRS as string is converted to class automatically" assert isinstance(geometry.point(3, 4, 'epsg:3857').crs, geometry.CRS) # constructor with bad input should raise ValueError with pytest.raises(ValueError): geometry.Geometry(object())
def bounds(self): """ :rtype: geometry.BoundingBox """ bounds = self.metadata.grid_spatial['geo_ref_points'] return geometry.BoundingBox(left=min(bounds['ur']['x'], bounds['ll']['x']), right=max(bounds['ur']['x'], bounds['ll']['x']), top=max(bounds['ur']['y'], bounds['ll']['y']), bottom=min(bounds['ur']['y'], bounds['ll']['y']))
def bounds(self) -> Optional[geometry.BoundingBox]: """ :returns: bounding box of the dataset in the native crs """ gs = self._gs if gs is None: return None bounds = gs['geo_ref_points'] return geometry.BoundingBox(left=min(bounds['ur']['x'], bounds['ll']['x']), right=max(bounds['ur']['x'], bounds['ll']['x']), top=max(bounds['ur']['y'], bounds['ll']['y']), bottom=min(bounds['ur']['y'], bounds['ll']['y']))
def bounds(self) -> Optional[geometry.BoundingBox]: """ :rtype: geometry.BoundingBox """ gs = self._gs if gs is None: return None bounds = gs['geo_ref_points'] return geometry.BoundingBox(left=min(bounds['ur']['x'], bounds['ll']['x']), right=max(bounds['ur']['x'], bounds['ll']['x']), top=max(bounds['ur']['y'], bounds['ll']['y']), bottom=min(bounds['ur']['y'], bounds['ll']['y']))
def test_props(): box1 = geometry.box(10, 10, 30, 30, crs=geometry.CRS('EPSG:4326')) assert box1 assert box1.is_valid assert not box1.is_empty assert box1.area == 400.0 assert box1.boundary.length == 80.0 assert box1.centroid == geometry.point(20, 20, geometry.CRS('EPSG:4326')) triangle = geometry.polygon([(10, 20), (20, 20), (20, 10), (10, 20)], crs=geometry.CRS('EPSG:4326')) assert triangle.envelope == geometry.BoundingBox(10, 10, 20, 20) outer = next(iter(box1)) assert outer.length == 80.0 box1copy = geometry.box(10, 10, 30, 30, crs=geometry.CRS('EPSG:4326')) assert box1 == box1copy assert box1.convex_hull == box1copy # NOTE: this might fail because of point order box2 = geometry.box(20, 10, 40, 30, crs=geometry.CRS('EPSG:4326')) assert box1 != box2