def epsg_3857_from_proj4(): """ Return a gdal spatial reference object with 3857 crs using the ImportFromProj4 method. """ spatial_ref = SpatialReference() spatial_ref.ImportFromProj4('+init=epsg:3857') return spatial_ref
def epsg_3857_from_proj4(): """ Return a gdal spatial reference object with 3857 crs using the ImportFromProj4 method. """ ds_3857 = rasterio.open(epsg_3857_raster_path) spatial_ref = SpatialReference() spatial_ref.ImportFromProj4(ds_3857.crs.to_string()) return spatial_ref
def test_get_tiled_extents_partial_spanning(self): dataset = Dataset(inputfile=self.spanningfile) mercator = SpatialReference.FromEPSG(EPSG_WEB_MERCATOR) major_circumference = mercator.GetMajorCircumference() minor_circumference = mercator.GetMinorCircumference() # Native resolution, source projection which is Mercator, spanning # tiles. This should be the south-western quadrant. ll, ur = dataset.GetTiledExtents() self.assertAlmostEqual(ll.x, -major_circumference / 2, places=0) self.assertAlmostEqual(ll.y, -minor_circumference / 2, places=0) self.assertAlmostEqual(ur.x, 0.0, places=0) self.assertAlmostEqual(ur.y, 0.0, places=0) # Resolution 1, source projection which is Mercator, spanning tiles. # This should be the south-western quadrant. ll, ur = dataset.GetTiledExtents(resolution=1) self.assertAlmostEqual(ll.x, -major_circumference / 2, places=0) self.assertAlmostEqual(ll.y, -minor_circumference / 2, places=0) self.assertAlmostEqual(ur.x, 0.0, places=0) self.assertAlmostEqual(ur.y, 0.0, places=0) # Resolution 5, source projection which is Mercator, spanning tiles. # This should be the south-western quadrant with a border of 32 pixels, # because the border of the dataset is 50 pixels. pixel_size = mercator.GetPixelDimensions( resolution=dataset.GetNativeResolution()) border = 32 * pixel_size.x ll, ur = dataset.GetTiledExtents(resolution=5) self.assertAlmostEqual(ll.x, -major_circumference / 2 + border, places=0) self.assertAlmostEqual(ll.y, -minor_circumference / 2 + border, places=0) self.assertAlmostEqual(ur.x, 0.0 - border, places=0) self.assertAlmostEqual(ur.y, 0.0 - border, places=0) # Resolution 0, WGS 84 projection, spanning tiles. This should be # the western hemisphere. ll, ur = dataset.GetTiledExtents( transform=dataset.GetCoordinateTransformation( dst_ref=SpatialReference(osr.SRS_WKT_WGS84)), resolution=0) self.assertAlmostEqual(ll.x, -180.0, places=0) self.assertAlmostEqual(ll.y, -90.0, places=0) self.assertAlmostEqual(ur.x, 0.0, places=0) self.assertAlmostEqual(ur.y, 90.0, places=0)
def test_spatial_ref(self): root = warp(self.inputfile).get_root() self.assertTrue('"EPSG","3857"' in root.find('.//TargetSRS').text) root = warp(self.inputfile, spatial_ref=SpatialReference.FromEPSG(4326)).get_root() self.assertTrue('WGS 84' in root.find('.//TargetSRS').text)
def epsg_3857_from_epsg(): """ Return a gdal spatial reference object with 3857 crs using the FromEPSG method. """ spatial_ref = SpatialReference.FromEPSG(EPSG_WEB_MERCATOR) return spatial_ref
def test_get_extents_wgs84(self): dataset = Dataset(inputfile=self.inputfile) transform = dataset.GetCoordinateTransformation( dst_ref=SpatialReference(osr.SRS_WKT_WGS84)) ll, ur = dataset.GetExtents(transform=transform) self.assertAlmostEqual(ll.x, -180.0, places=0) self.assertAlmostEqual(ll.y, -85.0, places=0) self.assertAlmostEqual(ur.x, 180.0, places=0) self.assertAlmostEqual(ur.y, 85.0, places=0)
def test_get_minor_circumerference(self): # Degrees self.assertAlmostEqual(self.wgs84.GetMinorCircumference(), 360.0) # Meters mercator = SpatialReference.FromEPSG(EPSG_WEB_MERCATOR) self.assertAlmostEqual(mercator.GetMinorCircumference(), 40075016.6856, places=4)
def test_get_world_tms_extents_wgs84(self): dataset = Dataset(self.wgs84file) # Resolution 0, WGS 84 projection, there are two tiles, one for # longitudinal hemisphere transform = dataset.GetCoordinateTransformation( dst_ref=SpatialReference(osr.SRS_WKT_WGS84)) self.assertExtentsEqual( dataset.GetWorldTmsExtents(transform=transform), dataset.GetTmsExtents(transform=transform))
def test_get_tiled_extents(self): dataset = Dataset(inputfile=self.inputfile) mercator = SpatialReference.FromEPSG(EPSG_WEB_MERCATOR) major_half_circumference = mercator.GetMajorCircumference() / 2 minor_half_circumference = mercator.GetMinorCircumference() / 2 # Native resolution, source projection which is Mercator, already # aligned. ll, ur = dataset.GetTiledExtents() self.assertAlmostEqual(ll.x, -major_half_circumference, places=0) self.assertAlmostEqual(ll.y, -minor_half_circumference, places=0) self.assertAlmostEqual(ur.x, major_half_circumference, places=0) self.assertAlmostEqual(ur.y, minor_half_circumference, places=0) # Resolution 0, source projection which is Mercator, already # aligned. This is the same as above, because the dataset covers the # whole world. ll, ur = dataset.GetTiledExtents(resolution=0) self.assertAlmostEqual(ll.x, -major_half_circumference, places=0) self.assertAlmostEqual(ll.y, -minor_half_circumference, places=0) self.assertAlmostEqual(ur.x, major_half_circumference, places=0) self.assertAlmostEqual(ur.y, minor_half_circumference, places=0) # Native resolution, WGS 84 projection, already aligned ll, ur = dataset.GetTiledExtents( transform=dataset.GetCoordinateTransformation( dst_ref=SpatialReference(osr.SRS_WKT_WGS84))) self.assertAlmostEqual(ll.x, -180.0, places=0) self.assertAlmostEqual(ll.y, -90.0, places=0) self.assertAlmostEqual(ur.x, 180.0, places=0) self.assertAlmostEqual(ur.y, 90.0, places=0) # Resolution 0, WGS 84 projection, already aligned. This is the # same as above, because the dataset covers the whole world. ll, ur = dataset.GetTiledExtents( transform=dataset.GetCoordinateTransformation( dst_ref=SpatialReference(osr.SRS_WKT_WGS84)), resolution=0) self.assertAlmostEqual(ll.x, -180.0, places=0) self.assertAlmostEqual(ll.y, -90.0, places=0) self.assertAlmostEqual(ur.x, 180.0, places=0) self.assertAlmostEqual(ur.y, 90.0, places=0)
def test_get_tiled_extents_partial_aligned(self): dataset = Dataset(inputfile=self.alignedfile) mercator = SpatialReference.FromEPSG(EPSG_WEB_MERCATOR) major_circumference = mercator.GetMajorCircumference() minor_circumference = mercator.GetMinorCircumference() # Native resolution, source projection which is Mercator, already # aligned. ll, ur = dataset.GetTiledExtents() self.assertAlmostEqual(ll.x, -major_circumference / 4, places=0) self.assertAlmostEqual(ll.y, -minor_circumference / 4, places=0) self.assertAlmostEqual(ur.x, 0.0, places=0) self.assertAlmostEqual(ur.y, 0.0, places=0) # Resolution 1, source projection which is Mercator, already # aligned. This should be the south-western quadrant, because the tile # is the north-eastern section of that quadrant. ll, ur = dataset.GetTiledExtents(resolution=1) self.assertAlmostEqual(ll.x, -major_circumference / 2, places=0) self.assertAlmostEqual(ll.y, -minor_circumference / 2, places=0) self.assertAlmostEqual(ur.x, 0.0, places=0) self.assertAlmostEqual(ur.y, 0.0, places=0) # Native resolution, WGS 84 projection, already aligned ll, ur = dataset.GetTiledExtents( transform=dataset.GetCoordinateTransformation( dst_ref=SpatialReference(osr.SRS_WKT_WGS84))) self.assertAlmostEqual(ll.x, -90.0, places=0) self.assertAlmostEqual(ll.y, -90.0, places=0) self.assertAlmostEqual(ur.x, 0.0, places=0) self.assertAlmostEqual(ur.y, 0.0, places=0) # Resolution 0, WGS 84 projection, already aligned. This should be # the western hemisphere. ll, ur = dataset.GetTiledExtents( transform=dataset.GetCoordinateTransformation( dst_ref=SpatialReference(osr.SRS_WKT_WGS84)), resolution=0) self.assertAlmostEqual(ll.x, -180.0, places=0) self.assertAlmostEqual(ll.y, -90.0, places=0) self.assertAlmostEqual(ur.x, 0.0, places=0) self.assertAlmostEqual(ur.y, 90.0, places=0)
def test_spatial_ref(self): root = warp(self.inputfile).get_root() # self.assertTrue('"EPSG","3857"' in root.find('.//TargetSRS').text) # Already in EPSG 3857 so no TargetSRS or SourceSRS in output (GDAL 2?) self.assertIsNone(root.find('.//TargetSRS')) self.assertTrue('"EPSG","3857"' in root.find('.//SRS').text) root = warp(self.inputfile, spatial_ref=SpatialReference.FromEPSG(4326)).get_root() self.assertTrue('WGS 84' in root.find('.//TargetSRS').text)
def test_get_extents_partial_mercator(self): mercator = SpatialReference.FromEPSG(EPSG_WEB_MERCATOR) major_circumference = mercator.GetMajorCircumference() minor_circumference = mercator.GetMinorCircumference() dataset = Dataset(inputfile=self.alignedfile) ll, ur = dataset.GetExtents() self.assertAlmostEqual(ll.x, -major_circumference / 4, places=0) self.assertAlmostEqual(ll.y, -minor_circumference / 4, places=0) self.assertAlmostEqual(ur.x, 0, places=0) self.assertAlmostEqual(ur.y, 0, places=0)
def test_get_extents_partial_wgs84(self): dataset = Dataset(inputfile=self.alignedfile) transform = dataset.GetCoordinateTransformation( dst_ref=SpatialReference(osr.SRS_WKT_WGS84)) ll, ur = dataset.GetExtents(transform=transform) # 66.5°S is due to the fact that the original file is in Mercator and # the southern latitudes take up more pixels in Mercator than in # WGS84. self.assertAlmostEqual(ll.x, -90.0, places=0) self.assertAlmostEqual(ll.y, -66.5, places=0) self.assertAlmostEqual(ur.x, 0.0, places=0) self.assertAlmostEqual(ur.y, 0.0, places=0)
def test_get_extents_mercator(self): mercator = SpatialReference.FromEPSG(EPSG_WEB_MERCATOR) major_half_circumference = mercator.GetMajorCircumference() / 2 minor_half_circumference = mercator.GetMinorCircumference() / 2 dataset = Dataset(inputfile=self.inputfile) transform = dataset.GetCoordinateTransformation(dst_ref=mercator) ll, ur = dataset.GetExtents(transform=transform) self.assertAlmostEqual(ll.x, -major_half_circumference, places=0) self.assertAlmostEqual(ll.y, -minor_half_circumference, places=0) self.assertAlmostEqual(ur.x, major_half_circumference, places=0) self.assertAlmostEqual(ur.y, minor_half_circumference, places=0)
def test_get_world_extents(self): # Degrees self.assertExtentsEqual( self.wgs84.GetWorldExtents(), Extents(lower_left=XY(-180.0, -90.0), upper_right=XY(180.0, 90.0))) # Meters mercator = SpatialReference.FromEPSG(EPSG_WEB_MERCATOR) self.assertExtentsEqual( mercator.GetWorldExtents(), Extents(lower_left=XY(-20037508.3428, -20037508.3428), upper_right=XY(20037508.3428, 20037508.3428)))
def test_get_tile_dimensions_mercator(self): mercator = SpatialReference.FromEPSG(EPSG_WEB_MERCATOR) major_circumference = mercator.GetMajorCircumference() minor_circumference = mercator.GetMinorCircumference() # Resolution 0 covers the whole world tile_size = mercator.GetTileDimensions(resolution=0) self.assertAlmostEqual(tile_size.x, major_circumference) self.assertAlmostEqual(tile_size.y, minor_circumference) # Resolution 1 should be half of the above tile_size = mercator.GetTileDimensions(resolution=1) self.assertAlmostEqual(tile_size.x, major_circumference / 2) self.assertAlmostEqual(tile_size.y, minor_circumference / 2)
def test_pixel_dimensions_mercator(self): mercator = SpatialReference.FromEPSG(EPSG_WEB_MERCATOR) major_circumference = mercator.GetMajorCircumference() minor_circumference = mercator.GetMinorCircumference() # Resolution 0 covers the whole world pixel_size = mercator.GetPixelDimensions(resolution=0) self.assertAlmostEqual(pixel_size.x, major_circumference / TILE_SIDE) self.assertAlmostEqual(pixel_size.y, minor_circumference / TILE_SIDE) # Resolution 1 should be half of the above pixel_size = mercator.GetPixelDimensions(resolution=1) self.assertAlmostEqual(pixel_size.x, major_circumference / TILE_SIDE / 2) self.assertAlmostEqual(pixel_size.y, minor_circumference / TILE_SIDE / 2)
def test_tiles_count_mercator(self): mercator = SpatialReference.FromEPSG(EPSG_WEB_MERCATOR) major_half_circumference = mercator.GetMajorCircumference() / 2 minor_half_circumference = mercator.GetMinorCircumference() / 2 world = Extents(lower_left=XY(-major_half_circumference, -minor_half_circumference), upper_right=XY(major_half_circumference, minor_half_circumference)) # Resolution 0 is 1×1 for the whole world self.assertEqual(mercator.GetTilesCount(extents=world, resolution=0), XY(1, 1)) # Resolution 1 is 2×2 for the whole world self.assertEqual(mercator.GetTilesCount(extents=world, resolution=1), XY(2, 2))
def test_get_native_resolution(self): dataset = Dataset(inputfile=self.inputfile) # bluemarble.tif is a 1024×1024 image of the whole world self.assertEqual(dataset.GetNativeResolution(), 2) # Maximum self.assertEqual(dataset.GetNativeResolution(maximum=1), 1) self.assertEqual(dataset.GetNativeResolution(maximum=10), 2) # Transform into US survey feet sr = SpatialReference.FromEPSG(EPSG_WEB_MERCATOR) sr.ImportFromWkt(sr.ExportToWkt().replace( 'UNIT["metre",1,AUTHORITY["EPSG","9001"]]', 'UNIT["US survey foot",0.3048006096012192,AUTHORITY["EPSG","9003"]]' )) transform = dataset.GetCoordinateTransformation(dst_ref=sr) self.assertEqual(dataset.GetNativeResolution(transform=transform), 2 + int(round(log(3.28, 2)))) # 3.28 ft/m
class TestSpatialReference(TestCase): def setUp(self): self.wgs84 = SpatialReference(osr.SRS_WKT_WGS84) def test_from_epsg(self): self.assertEqual(SpatialReference.FromEPSG(4326), self.wgs84) # Web Mercator is not the same as WGS 84. self.assertNotEqual(SpatialReference.FromEPSG(3857), self.wgs84) def test_get_epsg_code(self): self.assertEqual(self.wgs84.GetEPSGCode(), 4326) def test_get_epsg_string(self): self.assertEqual(self.wgs84.GetEPSGString(), 'EPSG:4326') def test_get_major_circumerference(self): # Degrees self.assertAlmostEqual(self.wgs84.GetMajorCircumference(), 360.0) # Meters mercator = SpatialReference.FromEPSG(EPSG_WEB_MERCATOR) self.assertAlmostEqual(mercator.GetMajorCircumference(), 40075016.6856, places=4) def test_get_minor_circumerference(self): # Degrees self.assertAlmostEqual(self.wgs84.GetMinorCircumference(), 360.0) # Meters mercator = SpatialReference.FromEPSG(EPSG_WEB_MERCATOR) self.assertAlmostEqual(mercator.GetMinorCircumference(), 40075016.6856, places=4) def test_get_world_extents(self): # Degrees self.assertExtentsEqual( self.wgs84.GetWorldExtents(), Extents(lower_left=XY(-180.0, -90.0), upper_right=XY(180.0, 90.0))) # Meters mercator = SpatialReference.FromEPSG(EPSG_WEB_MERCATOR) self.assertExtentsEqual( mercator.GetWorldExtents(), Extents(lower_left=XY(-20037508.3428, -20037508.3428), upper_right=XY(20037508.3428, 20037508.3428))) def test_pixel_dimensions_wgs84(self): # Resolution 0 covers a longitudinal hemisphere. pixel_size = self.wgs84.GetPixelDimensions(resolution=0) self.assertAlmostEqual(pixel_size.x, 360.0 / TILE_SIDE / 2) self.assertAlmostEqual(pixel_size.y, 360.0 / TILE_SIDE / 2) # Resolution 1 should be half of the above pixel_size = self.wgs84.GetPixelDimensions(resolution=1) self.assertAlmostEqual(pixel_size.x, 360.0 / TILE_SIDE / 4) self.assertAlmostEqual(pixel_size.y, 360.0 / TILE_SIDE / 4) def test_pixel_dimensions_mercator(self): mercator = SpatialReference.FromEPSG(EPSG_WEB_MERCATOR) major_circumference = mercator.GetMajorCircumference() minor_circumference = mercator.GetMinorCircumference() # Resolution 0 covers the whole world pixel_size = mercator.GetPixelDimensions(resolution=0) self.assertAlmostEqual(pixel_size.x, major_circumference / TILE_SIDE) self.assertAlmostEqual(pixel_size.y, minor_circumference / TILE_SIDE) # Resolution 1 should be half of the above pixel_size = mercator.GetPixelDimensions(resolution=1) self.assertAlmostEqual(pixel_size.x, major_circumference / TILE_SIDE / 2) self.assertAlmostEqual(pixel_size.y, minor_circumference / TILE_SIDE / 2) def test_get_tile_dimensions_wgs84(self): # Resolution 0 covers a longitudinal hemisphere. tile_size = self.wgs84.GetTileDimensions(resolution=0) self.assertAlmostEqual(tile_size.x, 360.0 / 2) self.assertAlmostEqual(tile_size.y, 360.0 / 2) # Resolution 1 should be half of the above tile_size = self.wgs84.GetTileDimensions(resolution=1) self.assertAlmostEqual(tile_size.x, 360.0 / 4) self.assertAlmostEqual(tile_size.y, 360.0 / 4) def test_get_tile_dimensions_mercator(self): mercator = SpatialReference.FromEPSG(EPSG_WEB_MERCATOR) major_circumference = mercator.GetMajorCircumference() minor_circumference = mercator.GetMinorCircumference() # Resolution 0 covers the whole world tile_size = mercator.GetTileDimensions(resolution=0) self.assertAlmostEqual(tile_size.x, major_circumference) self.assertAlmostEqual(tile_size.y, minor_circumference) # Resolution 1 should be half of the above tile_size = mercator.GetTileDimensions(resolution=1) self.assertAlmostEqual(tile_size.x, major_circumference / 2) self.assertAlmostEqual(tile_size.y, minor_circumference / 2) def test_tiles_count_wgs84(self): world = Extents(lower_left=XY(-180, -90), upper_right=XY(180, 90)) # Resolution 0 is 2×1 for the whole world self.assertEqual(self.wgs84.GetTilesCount(extents=world, resolution=0), XY(2, 1)) # Resolution 1 is 4×2 for the whole world self.assertEqual(self.wgs84.GetTilesCount(extents=world, resolution=1), XY(4, 2)) def test_tiles_count_mercator(self): mercator = SpatialReference.FromEPSG(EPSG_WEB_MERCATOR) major_half_circumference = mercator.GetMajorCircumference() / 2 minor_half_circumference = mercator.GetMinorCircumference() / 2 world = Extents(lower_left=XY(-major_half_circumference, -minor_half_circumference), upper_right=XY(major_half_circumference, minor_half_circumference)) # Resolution 0 is 1×1 for the whole world self.assertEqual(mercator.GetTilesCount(extents=world, resolution=0), XY(1, 1)) # Resolution 1 is 2×2 for the whole world self.assertEqual(mercator.GetTilesCount(extents=world, resolution=1), XY(2, 2))
def test_get_spatial_reference(self): self.assertEqual( Dataset(inputfile=self.inputfile).GetSpatialReference(), SpatialReference.FromEPSG(EPSG_WEB_MERCATOR))
def setUp(self): self.wgs84 = SpatialReference(osr.SRS_WKT_WGS84)
def test_get_coordinate_transformation(self): dataset = Dataset(inputfile=self.inputfile) wgs84 = SpatialReference(osr.SRS_WKT_WGS84) transform = dataset.GetCoordinateTransformation(dst_ref=wgs84) self.assertEqual(transform.src_ref, dataset.GetSpatialReference()) self.assertEqual(transform.dst_ref, wgs84)
def test_from_epsg(self): self.assertEqual(SpatialReference.FromEPSG(4326), self.wgs84) # Web Mercator is not the same as WGS 84. self.assertNotEqual(SpatialReference.FromEPSG(3857), self.wgs84)