wms_gdal_drv.py 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139
  1. import os
  2. try:
  3. from osgeo import gdal
  4. from osgeo import gdalconst
  5. except:
  6. grass.fatal(_("Unable to load GDAL Python bindings"))
  7. import xml.etree.ElementTree as etree
  8. import grass.script as grass
  9. from wms_base import WMSBase
  10. class NullDevice():
  11. def write(self, s):
  12. pass
  13. class WMSGdalDrv(WMSBase):
  14. def _createXML(self):
  15. """!Create XML for GDAL WMS driver
  16. @return path to XML file
  17. """
  18. self._debug("_createXML", "started")
  19. gdal_wms = etree.Element("GDAL_WMS")
  20. service = etree.SubElement(gdal_wms, "Service")
  21. name = etree.Element("name")
  22. service.set("name","WMS")
  23. version = etree.SubElement(service, "Version")
  24. version.text =self.o_wms_version
  25. server_url = etree.SubElement(service, "ServerUrl")
  26. server_url.text =self.o_mapserver_url
  27. srs = etree.SubElement(service, self.projection_name)
  28. srs.text = 'EPSG:' + str(self.o_srs)
  29. image_format = etree.SubElement(service, "ImageFormat")
  30. image_format.text = self.mime_format
  31. image_format = etree.SubElement(service, "Transparent")
  32. image_format.text = self.transparent
  33. layers = etree.SubElement(service, "Layers")
  34. layers.text = self.o_layers
  35. styles = etree.SubElement(service, "Styles")
  36. styles.text = self.o_styles
  37. data_window = etree.SubElement(gdal_wms, "DataWindow")
  38. upper_left_x = etree.SubElement(data_window, "UpperLeftX")
  39. upper_left_x.text = str(self.bbox['minx'])
  40. upper_left_y = etree.SubElement(data_window, "UpperLeftY")
  41. upper_left_y.text = str(self.bbox['maxy'])
  42. lower_right_x = etree.SubElement(data_window, "LowerRightX")
  43. lower_right_x.text = str(self.bbox['maxx'])
  44. lower_right_y = etree.SubElement(data_window, "LowerRightY")
  45. lower_right_y.text = str(self.bbox['miny'])
  46. size_x = etree.SubElement(data_window, "SizeX")
  47. size_x.text = str(self.region['cols'])
  48. size_y = etree.SubElement(data_window, "SizeY")
  49. size_y.text = str(self.region['rows'])
  50. # RGB + alpha
  51. self.temp_map_bands_num = 4
  52. block_size_x = etree.SubElement(gdal_wms, "BandsCount")
  53. block_size_x.text = str(self.temp_map_bands_num)
  54. block_size_x = etree.SubElement(gdal_wms, "BlockSizeX")
  55. block_size_x.text = str(self.tile_cols)
  56. block_size_y = etree.SubElement(gdal_wms, "BlockSizeY")
  57. block_size_y.text = str(self.tile_rows)
  58. xml_file = self._tempfile()
  59. etree.ElementTree(gdal_wms).write(xml_file)
  60. self._debug("_createXML", "finished -> %s" % xml_file)
  61. return xml_file
  62. def _download(self):
  63. """!Downloads data from WMS server using GDAL WMS driver
  64. @return temp_map with stored downloaded data
  65. """
  66. grass.message("Downloading data from WMS server...")
  67. # GDAL WMS driver does not flip geographic coordinates
  68. # according to WMS standard 1.3.0.
  69. if self.flip_coords and self.o_wms_version == "1.3.0":
  70. grass.warning(_("If module will not be able to fetch the data in this\
  71. geographic projection, \n try flag -d or use WMS version 1.1.1."))
  72. self._debug("_download", "started")
  73. temp_map = self._tempfile()
  74. xml_file = self._createXML()
  75. wms_dataset = gdal.Open(xml_file, gdal.GA_ReadOnly)
  76. grass.try_remove(xml_file)
  77. if wms_dataset is None:
  78. grass.fatal(_("Unable to open GDAL WMS driver"))
  79. self._debug("_download", "GDAL dataset created")
  80. driver = gdal.GetDriverByName(self.gdal_drv_format)
  81. if driver is None:
  82. grass.fatal(_("Unable to find %s driver" % format))
  83. metadata = driver.GetMetadata()
  84. if not metadata.has_key(gdal.DCAP_CREATECOPY) or \
  85. metadata[gdal.DCAP_CREATECOPY] == 'NO':
  86. grass.fatal(_('Driver %s supports CreateCopy() method.') % self.gdal_drv_name)
  87. self._debug("_download", "calling GDAL CreateCopy...")
  88. temp_map_dataset = driver.CreateCopy(temp_map, wms_dataset, 0)
  89. if temp_map_dataset is None:
  90. grass.fatal(_("Incorrect WMS query"))
  91. temp_map_dataset = None
  92. wms_dataset = None
  93. self._debug("_download", "finished")
  94. return temp_map