def test_osr_ct_OGR_CT_PREFER_OFFICIAL_SRS_DEF(): # Not sure about the minimal version, but works as expected with 7.2.1 if osr.GetPROJVersionMajor() * 100 + osr.GetPROJVersionMinor() < 702: pytest.skip('requires PROJ 7.2 or later') wkt = "PROJCS[\"OSGB 1936 / British National Grid\",GEOGCS[\"OSGB 1936\",DATUM[\"OSGB_1936\",SPHEROID[\"Airy 1830\",6377563.396,299.3249646,AUTHORITY[\"EPSG\",\"7001\"]],TOWGS84[446.448,-125.157,542.06,0.15,0.247,0.842,-20.489],AUTHORITY[\"EPSG\",\"6277\"]],PRIMEM[\"Greenwich\",0,AUTHORITY[\"EPSG\",\"8901\"]],UNIT[\"degree\",0.0174532925199433,AUTHORITY[\"EPSG\",\"9122\"]],AUTHORITY[\"EPSG\",\"4277\"]],PROJECTION[\"Transverse_Mercator\"],PARAMETER[\"latitude_of_origin\",49],PARAMETER[\"central_meridian\",-2],PARAMETER[\"scale_factor\",0.9996012717],PARAMETER[\"false_easting\",400000],PARAMETER[\"false_northing\",-100000],UNIT[\"metre\",1,AUTHORITY[\"EPSG\",\"9001\"]],AXIS[\"Easting\",EAST],AXIS[\"Northing\",NORTH],AUTHORITY[\"EPSG\",\"27700\"]]" s = osr.SpatialReference() s.SetFromUserInput(wkt) t = osr.SpatialReference() t.SetAxisMappingStrategy(osr.OAMS_TRADITIONAL_GIS_ORDER) t.ImportFromEPSG(4258) # ETRS 89 # No datum shift ct = osr.CoordinateTransformation(s, t) x, y, _ = ct.TransformPoint(826158.063, 2405844.125, 0) assert abs(x - 9.873) < 0.001, x assert abs(y - 71.127) < 0.001, y # Datum shift implied by the TOWGS4 clause with gdaltest.config_option('OGR_CT_PREFER_OFFICIAL_SRS_DEF', 'NO'): ct = osr.CoordinateTransformation(s, t) x, y, _ = ct.TransformPoint(826158.063, 2405844.125, 0) assert abs(x - 9.867) < 0.001, x assert abs(y - 71.125) < 0.001, y
def test_tiff_srs_write_vertical_perspective(): if osr.GetPROJVersionMajor() * 100 + osr.GetPROJVersionMinor() < 700: pytest.skip('requires PROJ 7 or later') ds = gdal.GetDriverByName('GTiff').Create('/vsimem/src.tif', 1, 1) sr = osr.SpatialReference() sr.SetGeogCS("GEOG_NAME", "D_DATUM_NAME", "", 3000000, 0) sr.SetVerticalPerspective(1, 2, 0, 1000, 0, 0) gdal.ErrorReset() ds.SetSpatialRef(sr) assert gdal.GetLastErrorMsg() == '' ds = None src_ds = gdal.Open('/vsimem/src.tif') # First is PROJ 7 assert src_ds.GetSpatialRef().ExportToProj4() in ( '+proj=nsper +lat_0=1 +lon_0=2 +h=1000 +x_0=0 +y_0=0 +R=3000000 +units=m +no_defs', '+proj=nsper +R=3000000 +lat_0=1 +lon_0=2 +h=1000 +x_0=0 +y_0=0 +wktext +no_defs' ) gdal.ErrorReset() gdal.GetDriverByName('GTiff').CreateCopy('/vsimem/dst.tif', src_ds) assert gdal.GetLastErrorMsg() == '' ds = gdal.Open('/vsimem/dst.tif') assert ds.GetSpatialRef().ExportToProj4() == src_ds.GetSpatialRef( ).ExportToProj4() src_ds = None ds = None gdal.GetDriverByName('GTiff').Delete('/vsimem/src.tif') gdal.GetDriverByName('GTiff').Delete('/vsimem/dst.tif')
def test_osr_unknown_member_id_in_datum_ensemble(): if not(osr.GetPROJVersionMajor() > 6 or osr.GetPROJVersionMinor() >= 2): pytest.skip() # Test workaround fix for https://github.com/OSGeo/PROJ/pull/3221 projjson = '{"$schema":"https://proj.org/schemas/v0.4/projjson.schema.json","type":"GeographicCRS","name":"WGS 84","datum_ensemble":{"name":"World Geodetic System 1984 ensemble","members":[{"name":"World Geodetic System 1984 (Transit)","id":{"authority":"EPSG","code":1166}},{"name":"World Geodetic System 1984 (G730)","id":{"authority":"EPSG","code":1152}},{"name":"World Geodetic System 1984 (G873)","id":{"authority":"EPSG","code":1153}},{"name":"World Geodetic System 1984 (G1150)","id":{"authority":"EPSG","code":1154}},{"name":"World Geodetic System 1984 (G1674)","id":{"authority":"EPSG","code":1155}},{"name":"World Geodetic System 1984 (G1762)","id":{"authority":"EPSG","code":1156}},{"name":"World Geodetic System 1984 (G2139)","id":{"authority":"EPSG","code":1309}},{"name":"unknown datum","id":{"authority":"UNKNOW?","code":1234}}],"ellipsoid":{"name":"WGS 84","semi_major_axis":6378137,"inverse_flattening":298.257223563},"accuracy":"2.0","id":{"authority":"EPSG","code":6326}},"coordinate_system":{"subtype":"ellipsoidal","axis":[{"name":"Geodetic latitude","abbreviation":"Lat","direction":"north","unit":"degree"},{"name":"Geodetic longitude","abbreviation":"Lon","direction":"east","unit":"degree"}]},"scope":"Horizontal component of 3D system.","area":"World.","bbox":{"south_latitude":-90,"west_longitude":-180,"north_latitude":90,"east_longitude":180},"id":{"authority":"EPSG","code":4326}}' sr = osr.SpatialReference() assert sr.SetFromUserInput(projjson) == 0
def test_osr_compd_vert_datum_2002(): if osr.GetPROJVersionMajor() * 10000 + osr.GetPROJVersionMinor() * 100 < 70100: # Not supported before PROJ 7.1 pytest.skip() sr = osr.SpatialReference() sr.SetFromUserInput('COMPD_CS["NAD83 / Alabama West + Ellipsoidal height",PROJCS["NAD83 / Alabama West",GEOGCS["NAD83",DATUM["North_American_Datum_1983",SPHEROID["GRS 1980",6378137,298.257222101,AUTHORITY["EPSG","7019"]],TOWGS84[0,0,0,0,0,0,0],AUTHORITY["EPSG","6269"]],PRIMEM["Greenwich",0,AUTHORITY["EPSG","8901"]],UNIT["degree",0.0174532925199433,AUTHORITY["EPSG","9122"]],AUTHORITY["EPSG","4269"]],PROJECTION["Transverse_Mercator"],PARAMETER["latitude_of_origin",30],PARAMETER["central_meridian",-87.5],PARAMETER["scale_factor",0.999933333],PARAMETER["false_easting",600000],PARAMETER["false_northing",0],UNIT["metre",1,AUTHORITY["EPSG","9001"]],AXIS["X",EAST],AXIS["Y",NORTH],AUTHORITY["EPSG","26930"]],VERT_CS["Ellipsoidal height",VERT_DATUM["Ellipsoid",2002],UNIT["metre",1.0,AUTHORITY["EPSG","9001"]],AXIS["Up",UP]]]') assert sr.IsProjected() assert sr.GetAuthorityCode('PROJCS') == '26930' assert sr.GetAuthorityName('PROJCS') == 'EPSG' assert sr.GetAuthorityCode(None) is None assert sr.GetAuthorityName(None) is None
def test_osr_ct_lon_wrap(): if osr.GetPROJVersionMajor() * 10000 + osr.GetPROJVersionMinor( ) * 100 + osr.GetPROJVersionMicro() < 70001: # Issue before PROJ 7.0.1 pytest.skip() s = osr.SpatialReference() s.SetFromUserInput("+proj=longlat +ellps=GRS80") t = osr.SpatialReference() t.SetFromUserInput("+proj=longlat +ellps=GRS80 +lon_wrap=180") ct = osr.CoordinateTransformation(s, t) assert ct x, y, _ = ct.TransformPoint(-25, 60, 0) assert x == pytest.approx(-25 + 360, abs=1e-12) assert y == pytest.approx(60, abs=1e-12)
def test_osr_ct_take_into_account_srs_coordinate_epoch(): if osr.GetPROJVersionMajor() * 100 + osr.GetPROJVersionMinor() < 702: pytest.skip('requires PROJ 7.2 or later') s = osr.SpatialReference() s.SetFromUserInput("EPSG:7844") # GDA2020 s.SetAxisMappingStrategy(osr.OAMS_AUTHORITY_COMPLIANT) t_2020 = osr.SpatialReference() t_2020.SetAxisMappingStrategy(osr.OAMS_AUTHORITY_COMPLIANT) t_2020.SetFromUserInput("EPSG:9000") # ITRF2014 t_2020.SetCoordinateEpoch(2020) # 2020 is the central epoch of the transformation, so no coordinate # change is expected ct = osr.CoordinateTransformation(s, t_2020) x, y, _ = ct.TransformPoint(-30, 150, 0) assert x == pytest.approx(-30, abs=1e-10) assert y == pytest.approx(150, abs=1e-10) t_2030 = osr.SpatialReference() t_2030.SetAxisMappingStrategy(osr.OAMS_AUTHORITY_COMPLIANT) t_2030.SetFromUserInput("EPSG:9000") # ITRF2014 t_2030.SetCoordinateEpoch(2030) ct = osr.CoordinateTransformation(s, t_2030) x, y, _ = ct.TransformPoint(-30, 150, 0) assert x == pytest.approx(-29.9999950478, abs=1e-10) assert y == pytest.approx(150.0000022212, abs=1e-10) ct = osr.CoordinateTransformation(t_2030, s) x, y, _ = ct.TransformPoint(-29.9999950478, 150.0000022212, 0) assert x == pytest.approx(-30, abs=1e-10) assert y == pytest.approx(150, abs=1e-10) # Not properly supported currently gdal.ErrorReset() with gdaltest.error_handler(): ct = osr.CoordinateTransformation(t_2020, t_2030) assert gdal.GetLastErrorMsg() != ''
def test_ogr2ogr_t_coord_epoch(): if osr.GetPROJVersionMajor() * 100 + osr.GetPROJVersionMinor() < 702: pytest.skip('requires PROJ 7.2 or later') src_ds = gdal.GetDriverByName('Memory').Create('', 0, 0, 0, gdal.GDT_Unknown) src_lyr = src_ds.CreateLayer('layer') f = ogr.Feature(src_lyr.GetLayerDefn()) f.SetGeometry(ogr.CreateGeometryFromWkt('POINT(120 -40)')) src_lyr.CreateFeature(f) # GDA2020 to ITRF2014 ds = gdal.VectorTranslate( '', src_ds, options= '-f Memory -t_srs EPSG:9000 -t_coord_epoch 2030 -s_srs EPSG:7844') lyr = ds.GetLayer(0) f = lyr.GetNextFeature() g = f.GetGeometryRef() assert g.GetX(0) != 120 and abs(g.GetX(0) - 120) < 1e-5 assert g.GetY(0) != -40 and abs(g.GetY(0) - -40) < 1e-5
def proj_version() -> Tuple[int, int]: """Returns PROJ library version """ major: int = osr.GetPROJVersionMajor() minor: int = osr.GetPROJVersionMinor() return major, minor
def test_proj(src_srs, src_xyz, src_error, dst_srs, dst_xyz, dst_error, unit_name, options, grid_req, proj_version_req): if grid_req is not None: grid_name = grid_req assert grid_name in map_old_grid_name_to_tif_ones search_paths = osr.GetPROJSearchPaths() found = False if search_paths: for path in search_paths: if os.path.exists(os.path.join(path, grid_name)) or \ os.path.exists(os.path.join(path, map_old_grid_name_to_tif_ones[grid_name])): found = True break if not found: pytest.skip(f'Did not find GRID:{grid_name}') if proj_version_req is not None: major, minor, micro = proj_version_req.split('.') major, minor, micro = int(major), int(minor), int(micro) if osr.GetPROJVersionMajor( ) * 10000 + osr.GetPROJVersionMinor() * 100 + osr.GetPROJVersionMicro( ) <= major * 10000 + minor * 100 + micro: pytest.skip(f'PROJ version < {proj_version_req}') src = osr.SpatialReference() src.SetAxisMappingStrategy(osr.OAMS_AUTHORITY_COMPLIANT) assert src.SetFromUserInput(src_srs) == 0, \ ('SetFromUserInput(%s) failed.' % src_srs) dst = osr.SpatialReference() dst.SetAxisMappingStrategy(osr.OAMS_AUTHORITY_COMPLIANT) assert dst.SetFromUserInput(dst_srs) == 0, \ ('SetFromUserInput(%s) failed.' % dst_srs) has_built_ct = False if options and '=' in options: tokens = options.split('=') if len(tokens) == 2: key = tokens[0] value = tokens[1] with gdaltest.config_option(key, value): has_built_ct = True ct = osr.CoordinateTransformation(src, dst) if not has_built_ct: ct = osr.CoordinateTransformation(src, dst) ###################################################################### # Transform source point to destination SRS. result = ct.TransformPoint(src_xyz[0], src_xyz[1], src_xyz[2]) error = abs(result[0] - dst_xyz[0]) \ + abs(result[1] - dst_xyz[1]) \ + abs(result[2] - dst_xyz[2]) assert error <= dst_error, \ ('Dest error is %g, got (%.15g,%.15g,%.15g)' % (error, result[0], result[1], result[2])) ###################################################################### # Now transform back. has_built_ct = False if options and '=' in options: tokens = options.split('=') if len(tokens) == 2: key = tokens[0] value = tokens[1] with gdaltest.config_option(key, value): has_built_ct = True ct = osr.CoordinateTransformation(dst, src) if not has_built_ct: ct = osr.CoordinateTransformation(dst, src) result = ct.TransformPoint(result[0], result[1], result[2]) error = abs(result[0] - src_xyz[0]) \ + abs(result[1] - src_xyz[1]) \ + abs(result[2] - src_xyz[2]) assert error <= src_error, \ ('Back to source error is %g got (%.15g,%.15g,%.15g)' % (error, result[0], result[1], result[2]))
def test_proj(src_srs, src_xyz, src_error, dst_srs, dst_xyz, dst_error, unit_name, options, requirements): if requirements is not None and requirements[:5] == 'GRID:': grid_name = requirements[5:] if grid_name == 'egm96_15.gtx' and \ osr.GetPROJVersionMajor() * 10000 + osr.GetPROJVersionMinor() * 100 + osr.GetPROJVersionMicro() < 60201: # Issues before PROJ 6.2.1 pytest.skip() search_paths = osr.GetPROJSearchPaths() found = False for path in search_paths: if os.path.exists(os.path.join(path, grid_name)): found = True break if not found: #print( 'Did not find GRID:%s' % grid_name ) pytest.skip() src = osr.SpatialReference() assert src.SetFromUserInput(src_srs) == 0, \ ('SetFromUserInput(%s) failed.' % src_srs) dst = osr.SpatialReference() assert dst.SetFromUserInput(dst_srs) == 0, \ ('SetFromUserInput(%s) failed.' % dst_srs) if requirements is not None and requirements[0] != 'G': additionnal_error_str = ' Check that proj version is >= %s ' % requirements else: additionnal_error_str = '' has_built_ct = False if options and '=' in options: tokens = options.split('=') if len(tokens) == 2: key = tokens[0] value = tokens[1] with gdaltest.config_option(key, value): has_built_ct = True ct = osr.CoordinateTransformation(src, dst) if not has_built_ct: ct = osr.CoordinateTransformation(src, dst) ###################################################################### # Transform source point to destination SRS. result = ct.TransformPoint(src_xyz[0], src_xyz[1], src_xyz[2]) error = abs(result[0] - dst_xyz[0]) \ + abs(result[1] - dst_xyz[1]) \ + abs(result[2] - dst_xyz[2]) assert error <= dst_error, \ ('Dest error is %g, got (%.15g,%.15g,%.15g)%s' % (error, result[0], result[1], result[2], additionnal_error_str)) ###################################################################### # Now transform back. has_built_ct = False if options and '=' in options: tokens = options.split('=') if len(tokens) == 2: key = tokens[0] value = tokens[1] with gdaltest.config_option(key, value): has_built_ct = True ct = osr.CoordinateTransformation(dst, src) if not has_built_ct: ct = osr.CoordinateTransformation(dst, src) result = ct.TransformPoint(result[0], result[1], result[2]) error = abs(result[0] - src_xyz[0]) \ + abs(result[1] - src_xyz[1]) \ + abs(result[2] - src_xyz[2]) assert error <= src_error, \ ('Back to source error is %g got (%.15g,%.15g,%.15g)%s' % (error, result[0], result[1], result[2], additionnal_error_str))