wms_gdal.py 4.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  1. ############################################################################
  2. #
  3. # MODULE: r.in.wms / wms_gdal
  4. #
  5. # AUTHOR(S): Martin Landa <landa.martin gmail.com>
  6. #
  7. # PURPOSE: To import data from web mapping servers
  8. #
  9. # COPYRIGHT: (C) 2009 Martin Landa, and GRASS development team
  10. #
  11. # This program is free software under the GNU General
  12. # Public License (>=v2). Read the file COPYING that
  13. # comes with GRASS for details.
  14. #
  15. #############################################################################
  16. import os
  17. import subprocess
  18. def checkGdalWms():
  19. """Check if GDAL WMS driver is available"""
  20. ps = subprocess.Popen(['gdalinfo',
  21. '--formats'], stdout = subprocess.PIPE)
  22. for line in ps.communicate()[0].splitlines():
  23. driver, desc = line.split(':')
  24. if 'WMS' in driver:
  25. return True
  26. return False
  27. class GdalWms:
  28. def __init__(self, options, request):
  29. self.options = options
  30. # service description XML file path
  31. self.descFile = None
  32. self.__createDescFile(request)
  33. def __createDescFile(self, request):
  34. """Create local service description XML file"""
  35. # first create directory where to store XML file
  36. dir = os.path.join(self.options['folder'], self.options['output'])
  37. if not os.path.exists(self.options['folder']):
  38. os.mkdir(self.options['folder'])
  39. if not os.path.exists(dir):
  40. os.mkdir(dir)
  41. self.descFile = os.path.join(dir, self.options['output'] + '.xml')
  42. file = open(self.descFile, 'w')
  43. try:
  44. indent = 0
  45. file.write('<GDAL_WMS>\n')
  46. indent += 4
  47. file.write('%s<Service name="WMS">\n' % (' ' * indent))
  48. indent += 4
  49. if self.options['wmsquery'] and 'version=' in self.options['wmsquery']:
  50. for item in self.options['wmsquery'].split(';'):
  51. key, value = item.split('=')
  52. if key == 'version':
  53. file.write('%s<Version>%s</Version>\n' % (' ' * indent, value))
  54. break
  55. else:
  56. file.write('%s<Version>1.1.1</Version>\n' % (' ' * indent)) # -> default 1.1.1
  57. file.write('%s<ServerURL>%s?</ServerURL>\n' % (' ' * indent, self.options['mapserver']))
  58. file.write('%s<SRS>%s</SRS>\n' % (' ' * indent, self.options['srs']))
  59. file.write('%s<ImageFormat>image/%s</ImageFormat>\n' % (' ' * indent, self.options['format']))
  60. file.write('%s<Layers>%s</Layers>\n' % (' ' * indent, self.options['layers']))
  61. file.write('%s<Styles>%s</Styles>\n' % (' ' * indent, self.options['styles']))
  62. indent -= 4
  63. file.write('%s</Service>\n' % (' ' * indent))
  64. file.write('%s<DataWindow>\n' % (' ' * indent))
  65. indent += 4
  66. file.write('%s<UpperLeftX>%s</UpperLeftX>\n' % (' ' * indent, request.Get('w')))
  67. file.write('%s<UpperLeftY>%s</UpperLeftY>\n' % (' ' * indent, request.Get('n')))
  68. file.write('%s<LowerRightX>%s</LowerRightX>\n' % (' ' * indent, request.Get('e')))
  69. file.write('%s<LowerRightY>%s</LowerRightY>\n' % (' ' * indent, request.Get('s')))
  70. file.write('%s<SizeX>%s</SizeX>\n' % (' ' * indent, request.Get('width'))) #
  71. file.write('%s<SizeY>%s</SizeY>\n' % (' ' * indent, request.Get('height'))) #
  72. indent -= 4
  73. file.write('%s</DataWindow>\n' % (' ' * indent))
  74. file.write('%s<Projection>%s</Projection>\n' % (' ' * indent, self.options['srs']))
  75. file.write('%s<BandsCount>3</BandsCount>\n' % (' ' * indent))
  76. file.write('%s<BlockSizeX>%s</BlockSizeX>\n' % (' ' * indent, self.options['maxcols']))
  77. file.write('%s<BlockSizeY>%s</BlockSizeY>\n' % (' ' * indent, self.options['maxrows']))
  78. file.write('</GDAL_WMS>\n')
  79. finally:
  80. file.close()
  81. def GetFile(self):
  82. """Get path of service description XML file"""
  83. return self.descFile