|
@@ -1,101 +1,72 @@
|
|
|
#!/usr/bin/python
|
|
|
|
|
|
-# run within GRASS Spearfish session
|
|
|
-# run this before starting python to append module search path:
|
|
|
-# export PYTHONPATH=$PYTHONPATH:/usr/local/grass-7.0.svn/etc/python
|
|
|
-# check with "import sys; sys.path"
|
|
|
-# or:
|
|
|
-# sys.path.append("/usr/local/grass-7.0.svn/etc/python")
|
|
|
-
|
|
|
-"""
|
|
|
- **** FIXME: needs to be ported from SWIG to Ctypes! ****
|
|
|
"""
|
|
|
+Sample Python script to access vector dada using GRASS Ctypes interface
|
|
|
|
|
|
+Run this before starting python to append module search path:
|
|
|
+ export PYTHONPATH=$PYTHONPATH:/usr/local/grass-7.0.svn/etc/python
|
|
|
+check with "import sys; sys.path"
|
|
|
+
|
|
|
+or
|
|
|
+ sys.path.append("/usr/local/grass-7.0.svn/etc/python")
|
|
|
+"""
|
|
|
|
|
|
import os, sys
|
|
|
-from grass.lib import grass
|
|
|
-from grass.lib import vector as grassvect
|
|
|
-import grass.script as grassscript
|
|
|
+
|
|
|
+from grass.lib.grass import *
|
|
|
+from grass.lib.vector import *
|
|
|
|
|
|
if not os.environ.has_key("GISBASE"):
|
|
|
- print "You must be in GRASS GIS to run this program."
|
|
|
- sys.exit(1)
|
|
|
+ sys.exit("You must be in GRASS GIS to run this program.")
|
|
|
|
|
|
-if len(sys.argv)==2:
|
|
|
+if len(sys.argv) == 2:
|
|
|
input = sys.argv[1]
|
|
|
else:
|
|
|
input = raw_input("Vector Map Name? ")
|
|
|
|
|
|
-# initialize
|
|
|
-grass.G_gisinit('')
|
|
|
+# initialize GRASS library
|
|
|
+G_gisinit('')
|
|
|
|
|
|
-# find map in search path
|
|
|
-mapset = grass.G_find_vector2(input,'')
|
|
|
+# find vector map in the search path
|
|
|
+mapset = G_find_vector2(input, '')
|
|
|
+if mapset:
|
|
|
+ print "Vector map found in mapset <%s>" % mapset
|
|
|
+else:
|
|
|
+ sys.exit("Vector map <%s> not found" % input)
|
|
|
|
|
|
# define map structure
|
|
|
-map = grassvect.Map_info()
|
|
|
+map = Map_info()
|
|
|
|
|
|
# define open level (level 2: topology)
|
|
|
-grassvect.Vect_set_open_level (2)
|
|
|
+Vect_set_open_level(2)
|
|
|
|
|
|
-# open existing map
|
|
|
-grassvect.Vect_open_old(map, input, mapset)
|
|
|
+# open existing vector map
|
|
|
+Vect_open_old(map, input, mapset)
|
|
|
|
|
|
# query
|
|
|
-print 'Vect map: ', input
|
|
|
-print 'Vect is 3D: ', grassvect.Vect_is_3d (map)
|
|
|
-print 'Vect DB links: ', grassvect.Vect_get_num_dblinks(map)
|
|
|
-print 'Map Scale: 1:', grassvect.Vect_get_scale(map)
|
|
|
+print 'Vect map: ', input
|
|
|
+print 'Vect is 3D: ', Vect_is_3d(map)
|
|
|
+print 'Vect DB links: ', Vect_get_num_dblinks(map)
|
|
|
+print 'Map Scale: 1:', Vect_get_scale(map)
|
|
|
|
|
|
# vector box tests
|
|
|
-box = grassvect.bound_box()
|
|
|
-c_easting1 = 599505.0
|
|
|
-c_northing = 4921010.0
|
|
|
-c_easting2 = 4599505.0
|
|
|
-
|
|
|
-grassvect.Vect_get_map_box(map, box)
|
|
|
-print 'Position 1 in box? ', grassvect.Vect_point_in_box(c_easting1, c_northing, 0, box)
|
|
|
-print 'Position 2 in box? ', grassvect.Vect_point_in_box(c_easting2, c_northing, 0, box)
|
|
|
-print 'Vector line 2 in box? ', grassvect.Vect_get_line_box(map, 2, box)
|
|
|
-# misleading:
|
|
|
-# print 'Number of lines:', grassvect.Vect_get_num_lines(map)
|
|
|
+box = bound_box()
|
|
|
+c_easting1 = 599505.0
|
|
|
+c_northing = 4921010.0
|
|
|
+c_easting2 = 4599505.0
|
|
|
+
|
|
|
+Vect_get_map_box(map, box)
|
|
|
+print 'Position 1 in box? ', Vect_point_in_box(c_easting1, c_northing, 0, box)
|
|
|
+print 'Position 2 in box? ', Vect_point_in_box(c_easting2, c_northing, 0, box)
|
|
|
+print 'Feature id 2 in box? ', Vect_get_line_box(map, 2, box)
|
|
|
+
|
|
|
+print 'Number of features:', Vect_get_num_lines(map)
|
|
|
# how to access GV_POINT?
|
|
|
# print 'Number of points: ', grassvect.Vect_get_num_primitives(map,GV_POINT)
|
|
|
# confusing:
|
|
|
#print 'Number of lines: ', grassvect.Vect_get_num_primitives(map,GV_LINE)
|
|
|
#print 'Number of areas:', grassvect.Vect_get_num_primitives(map,GV_AREA)
|
|
|
-print 'Number of areas:', grassvect.Vect_get_num_areas(map)
|
|
|
-
|
|
|
-layer = 1
|
|
|
-tmp = grassscript.tempfile()
|
|
|
-tmpf = file(tmp, 'w')
|
|
|
-
|
|
|
-try:
|
|
|
- f = grassscript.vector_db(input)[int(layer)]
|
|
|
-except KeyError:
|
|
|
- grassscript.fatal("There is no table connected to this map. Run v.db.connect or v.db.addtable first.")
|
|
|
-table = f['table']
|
|
|
-database = f['database']
|
|
|
-driver = f['driver']
|
|
|
-
|
|
|
-# call GRASS command
|
|
|
-grassscript.run_command('v.db.select', flags = 'c', map = input,
|
|
|
- stdout = tmpf)
|
|
|
-tmpf.close()
|
|
|
-
|
|
|
-# check if result is empty
|
|
|
-tmpf = file(tmp)
|
|
|
-if tmpf.read(1) == '':
|
|
|
- grassscript.fatal("Table <%s> contains no data.", table)
|
|
|
-
|
|
|
-# print table to stdout
|
|
|
-for line in tmpf:
|
|
|
- print line
|
|
|
-
|
|
|
-tmpf.close()
|
|
|
-os.remove(tmp)
|
|
|
+print 'Number of areas:', Vect_get_num_areas(map)
|
|
|
|
|
|
# close map
|
|
|
-grassvect.Vect_close(map)
|
|
|
-## end of the python script
|
|
|
-
|
|
|
+Vect_close(map)
|