QGIS python - 获取栅格的单位
QGIS python - get units of the raster
在带有 pyQgis 的 QGIS 中,我想确定输入栅格的单位是度还是米。
Here 我了解到我可以使用 GDAL 从栅格中获取投影:
inRaster = gdal.Open(rasterInPath,GA_ReadOnly)
projRef = inRaster.GetProjection()
print(projRef)
什么是 EPSG 4326 光栅字符串:
GEOGCS["WGS 84",DATUM["WGS_1984",SPHEROID["WGS 84",6378137,298.257223563,AUTHORITY["EPSG","7030"]],AUTHORITY["EPSG","6326"]],PRIMEM["Greenwich",0],UNIT["degree",0.0174532925199433],AUTHORITY["EPSG","4326"]]
对于 EPSG 3857 光栅:
PROJCS["WGS 84 / Pseudo-Mercator",GEOGCS["WGS 84",DATUM["WGS_1984",SPHEROID["WGS 84",6378137,298.257223563,AUTHORITY["EPSG","7030"]],AUTHORITY["EPSG","6326"]],PRIMEM["Greenwich",0,AUTHORITY["EPSG","8901"]],UNIT["degree",0.0174532925199433,AUTHORITY["EPSG","9122"]],AUTHORITY["EPSG","4326"]],PROJECTION["Mercator_1SP"],PARAMETER["central_meridian",0],PARAMETER["scale_factor",1],PARAMETER["false_easting",0],PARAMETER["false_northing",0],UNIT["metre",1,AUTHORITY["EPSG","9001"]],AXIS["X",EAST],AXIS["Y",NORTH],EXTENSION["PROJ4","+proj=merc +a=6378137 +b=6378137 +lat_ts=0.0 +lon_0=0.0 +x_0=0.0 +y_0=0 +k=1.0 +units=m +nadgrids=@null +wktext +no_defs"],AUTHORITY["EPSG","3857"]]
我想我能做到:
isInMetres = "PROJCS" in projRef
但是还有其他解决办法吗?我认为这不是非常可读,并且不确定我是否可以通过这种方式涵盖所有极端情况(例如缺少 projRef)。不需要使用 GDAL。
使用 PyQgis API 您可以使用 QgsCoordinateReferenceSystem
对象的 mapUnits
方法。它 returns 一个 QgsUnitTypes.DistanceUnit
值,因此您可以像这样使用它,例如:
# lyr is a QgsRasterLayer
crs = lyr.crs()
# crs is a QgsCoordinateReferenceSystem
unit = crs.mapUnits()
print('Unit is {}'.format(QgsUnitTypes.toString(unit)))
# 'Unit is mètres' (i'm using french language)
重用你的代码,你可以这样写:
isInMetres = crs.mapUnits() == 0
在带有 pyQgis 的 QGIS 中,我想确定输入栅格的单位是度还是米。 Here 我了解到我可以使用 GDAL 从栅格中获取投影:
inRaster = gdal.Open(rasterInPath,GA_ReadOnly)
projRef = inRaster.GetProjection()
print(projRef)
什么是 EPSG 4326 光栅字符串:
GEOGCS["WGS 84",DATUM["WGS_1984",SPHEROID["WGS 84",6378137,298.257223563,AUTHORITY["EPSG","7030"]],AUTHORITY["EPSG","6326"]],PRIMEM["Greenwich",0],UNIT["degree",0.0174532925199433],AUTHORITY["EPSG","4326"]]
对于 EPSG 3857 光栅:
PROJCS["WGS 84 / Pseudo-Mercator",GEOGCS["WGS 84",DATUM["WGS_1984",SPHEROID["WGS 84",6378137,298.257223563,AUTHORITY["EPSG","7030"]],AUTHORITY["EPSG","6326"]],PRIMEM["Greenwich",0,AUTHORITY["EPSG","8901"]],UNIT["degree",0.0174532925199433,AUTHORITY["EPSG","9122"]],AUTHORITY["EPSG","4326"]],PROJECTION["Mercator_1SP"],PARAMETER["central_meridian",0],PARAMETER["scale_factor",1],PARAMETER["false_easting",0],PARAMETER["false_northing",0],UNIT["metre",1,AUTHORITY["EPSG","9001"]],AXIS["X",EAST],AXIS["Y",NORTH],EXTENSION["PROJ4","+proj=merc +a=6378137 +b=6378137 +lat_ts=0.0 +lon_0=0.0 +x_0=0.0 +y_0=0 +k=1.0 +units=m +nadgrids=@null +wktext +no_defs"],AUTHORITY["EPSG","3857"]]
我想我能做到:
isInMetres = "PROJCS" in projRef
但是还有其他解决办法吗?我认为这不是非常可读,并且不确定我是否可以通过这种方式涵盖所有极端情况(例如缺少 projRef)。不需要使用 GDAL。
使用 PyQgis API 您可以使用 QgsCoordinateReferenceSystem
对象的 mapUnits
方法。它 returns 一个 QgsUnitTypes.DistanceUnit
值,因此您可以像这样使用它,例如:
# lyr is a QgsRasterLayer
crs = lyr.crs()
# crs is a QgsCoordinateReferenceSystem
unit = crs.mapUnits()
print('Unit is {}'.format(QgsUnitTypes.toString(unit)))
# 'Unit is mètres' (i'm using french language)
重用你的代码,你可以这样写:
isInMetres = crs.mapUnits() == 0