Python Ctypes Examples: Difference between revisions

From GRASS-Wiki
Jump to navigation Jump to search
(+raster example from Glynn)
Line 2: Line 2:
__TOC__
__TOC__
== Raster ==
== 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
[http://docs.python.org/library/ctypes.html 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.:
<source lang="python">
      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))
</source>


== Vector ==
== Vector ==
Line 55: Line 81:
Vect_close(map_info)
Vect_close(map_info)
</source>
</source>
== See also ==
* http://docs.python.org/library/ctypes.html


{{Python}}
{{Python}}

Revision as of 18:37, 31 March 2012

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)

See also