Python Ctypes Examples
See GRASS and Python for more information. See also raster, vector sample scripts.
Raster
Working with (geographic) coordinates for each raster cell and the computational region
The ctypes interfaces are thin wrappers around the corresponding C functions. Any script which uses them should have essentially the same structure as a module written in C. Structures can be allocated by using the structure name as a function, and passed by reference using ctypes' byref() function.
The second argument to G_col_to_easting() and G_row_to_northing() is a "const struct Cell_head *". The information can be obtained from G_get_window(), e.g.:
import sys
import grass.lib.gis as gis
from ctypes import *
gis.G_gisinit(sys.argv[0])
region = gis.Cell_head()
G_get_window(byref(region))
coor_col = gis.G_col_to_easting((thecolumn + 0.5), byref(region))
coor_row = gis.G_row_to_northing((therow + 0.5), byref(region))
Vector
Accessing feature geometry
This script switches X, Y coordinates and multiple them by -1.
#!/usr/bin/python
import sys
from grass.lib.vector import *
if len(sys.argv) < 2:
sys.exit("Usage: %s: vector" % sys.argv[0])
name = sys.argv[1]
map_info = pointer(Map_info())
points = Vect_new_line_struct()
cats = Vect_new_cats_struct()
c_points = points.contents
level = Vect_open_update(map_info, name, "")
if level < 2:
sys.exit("Topology not available")
nlines = Vect_get_num_lines(map_info)
for line in range(1, nlines + 1):
ltype = Vect_read_line(map_info, points, cats, line)
if line % 100 == 0:
sys.stderr.write("\r%d" % line)
for i in range(c_points.n_points):
x = c_points.x[i]
c_points.x[i] = -1 * c_points.y[i]
c_points.y[i] = -1 * x
Vect_rewrite_line(map_info, line, ltype,
points, cats)
line += 1
sys.stderr.write("\r")
Vect_destroy_line_struct(points)
Vect_destroy_cats_struct(cats)
Vect_build_partial(map_info, GV_BUILD_NONE)
Vect_build(map_info)
Vect_close(map_info)