functions.py 5.2 KB

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