functions.py 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190
  1. # -*- coding: utf-8 -*-
  2. """
  3. Created on Tue Jun 26 12:38:48 2012
  4. @author: pietro
  5. """
  6. import fnmatch
  7. import grass.lib.gis as libgis
  8. import grass.lib.raster as libraster
  9. from grass.script import core as grasscore
  10. from grass.pygrass.errors import GrassError
  11. from grass.pygrass.gis.region import Region
  12. def looking(obj, filter_string):
  13. """
  14. >>> import grass.lib.vector as libvect
  15. >>> sorted(looking(libvect, '*by_box*')) # doctest: +NORMALIZE_WHITESPACE
  16. ['Vect_select_areas_by_box', 'Vect_select_isles_by_box',
  17. 'Vect_select_lines_by_box', 'Vect_select_nodes_by_box']
  18. """
  19. word_list = dir(obj)
  20. word_list.sort()
  21. return fnmatch.filter(word_list, filter_string)
  22. def remove(oldname, maptype):
  23. """Remove a map"""
  24. grasscore.run_command('g.remove', **{maptype: '{old}'.format(old=oldname)})
  25. def rename(oldname, newname, maptype):
  26. """Rename a map"""
  27. grasscore.run_command('g.rename',
  28. **{maptype: '{old},{new}'.format(old=oldname,
  29. new=newname), })
  30. def copy(existingmap, newmap, maptype):
  31. """Copy a map
  32. >>> copy('census', 'mycensus', 'vect')
  33. >>> rename('mycensus', 'mynewcensus', 'vect')
  34. >>> remove('mynewcensus', 'vect')
  35. """
  36. grasscore.run_command('g.copy',
  37. **{maptype: '{old},{new}'.format(old=existingmap,
  38. new=newmap), })
  39. def getenv(env):
  40. """Return the current grass environment variables ::
  41. >>> getenv("MAPSET")
  42. 'user1'
  43. """
  44. return libgis.G__getenv(env)
  45. def get_mapset_raster(mapname, mapset=''):
  46. """Return the mapset of the raster map ::
  47. >>> get_mapset_raster('elevation')
  48. 'PERMANENT'
  49. """
  50. return libgis.G_find_raster(mapname, '')
  51. def get_mapset_vector(mapname, mapset=''):
  52. """Return the mapset of the vector map ::
  53. >>> get_mapset_vector('census')
  54. 'PERMANENT'
  55. """
  56. return libgis.G_find_vector(mapname, '')
  57. def is_clean_name(name):
  58. """Return if the name is valid ::
  59. >>> is_clean_name('census')
  60. True
  61. >>> is_clean_name('0census')
  62. False
  63. >>> is_clean_name('census&')
  64. False
  65. """
  66. if name[0].isdigit():
  67. return False
  68. for char in ' @#^?°,;%&/':
  69. if name.find(char) != -1:
  70. return False
  71. return True
  72. def coor2pixel((east, north), region):
  73. """Convert coordinates into a pixel row and col ::
  74. >>> reg = Region()
  75. >>> coor2pixel((reg.west, reg.north), reg)
  76. (0.0, 0.0)
  77. >>> coor2pixel((reg.east, reg.south), reg) == (reg.rows, reg.cols)
  78. True
  79. """
  80. return (libraster.Rast_northing_to_row(north, region.c_region),
  81. libraster.Rast_easting_to_col(east, region.c_region))
  82. def pixel2coor((col, row), region):
  83. """Convert row and col of a pixel into a coordinates ::
  84. >>> reg = Region()
  85. >>> pixel2coor((0, 0), reg) == (reg.north, reg.west)
  86. True
  87. >>> pixel2coor((reg.cols, reg.rows), reg) == (reg.south, reg.east)
  88. True
  89. """
  90. return (libraster.Rast_row_to_northing(row, region.c_region),
  91. libraster.Rast_col_to_easting(col, region.c_region))
  92. def get_raster_for_points(poi_vector, raster, column=None):
  93. """Query a raster map for each point feature of a vector
  94. Example ::
  95. >>> from grass.pygrass.vector import VectorTopo
  96. >>> from grass.pygrass.raster import RasterRow
  97. >>> ele = RasterRow('elevation')
  98. >>> copy('schools','myschools','vect')
  99. >>> sch = VectorTopo('myschools')
  100. >>> get_raster_for_points(sch, ele) # doctest: +ELLIPSIS
  101. [(1, 633649.2856743174, 221412.94434781274, 145.06602)...
  102. >>> sch.table.columns.add('elevation','double precision')
  103. >>> 'elevation' in sch.table.columns
  104. True
  105. >>> get_raster_for_points(sch, ele, 'elevation')
  106. True
  107. >>> sch.table.filters.select('NAMESHORT','elevation')
  108. Filters('SELECT NAMESHORT, elevation FROM myschools;')
  109. >>> cur = sch.table.execute()
  110. >>> cur.fetchall() # doctest: +ELLIPSIS
  111. [(u'SWIFT CREEK', 145.06602), ... (u'9TH GRADE CTR', None)]
  112. >>> remove('myschools','vect')
  113. Parameters
  114. -------------
  115. point: point vector object
  116. raster: raster object
  117. column: column name to update
  118. """
  119. from math import isnan
  120. if not column:
  121. result = []
  122. reg = Region()
  123. if not poi_vector.is_open():
  124. poi_vector.open()
  125. if not raster.is_open():
  126. raster.open()
  127. if poi_vector.num_primitive_of('point') == 0:
  128. raise GrassError(_("Vector doesn't contain points"))
  129. for poi in poi_vector.viter('points'):
  130. val = raster.get_value(poi, reg)
  131. if column:
  132. if val is not None and not isnan(val):
  133. poi.attrs[column] = val
  134. else:
  135. if val is not None and not isnan(val):
  136. result.append((poi.id, poi.x, poi.y, val))
  137. else:
  138. result.append((poi.id, poi.x, poi.y, None))
  139. if not column:
  140. return result
  141. else:
  142. poi.attrs.commit()
  143. return True