GRASS SoC Ideas 2012/High level map interaction/Vector

From GRASS-Wiki
Jump to navigation Jump to search

See major page GRASS SoC Ideas 2012/High level map interaction

Vector Maps

Vector Geometries

I would like to implement different Geometry classes:

  • point
  • (segment)
  • line
  • boundary
  • centroid
  • area
>>> pnt0 = Point(x0, y0)
>>> pnt1 = Point(x1, y1)
>>> pnt2 = Point(x2, y2)
>>> line0 = Line([pnt0, pnt1, pnt2])
>>> bound0 = Boundary([pnt0, pnt1, pnt2])
>>> area = Area(bount0, Centroid(x3, y3))

Line attributes and methods

Line should have attributes, like:

>>> line0.length # return the length
>>> line0.bbox # return the bbox>>> for segment in line.nseg
(pnt0, pnt1)
>>> line0.number # return the number line
>>> for segment in line.nseg # return the number of segments

Line is iterable and return a point object.

>>> for point in line0:
...     # do somenthing

Line should have a method to return a Segments.

>>> for segment in line.segs(): 
...     # return a list of tuple [(pnt0, pnt1), (pnt1, pnt2),]
...     # do somethig

>>> pnt0 in line0 # check if line contain point
>>> lineX in line0


>>> bound0.perimeter()
>>> bound.nseg # return the number of segments

>>> for point in bound0:
...     # do something

>>> for seg in bound0.segs():
...     # do something


>>> area0.boundary # return a boundary object
>>> area0.centroid #return a point object
>>> area0.area() 

All the geometries object should have methods like the python sets (may be not all):

Operation Equivalent Result len(s) return the number of points x in s test x for membership in s x not in s test x for non-membership in s s.issubset(t) s <= t test whether every element in s is in t s.issuperset(t) s >= t test whether every element in t is in s s.union(t) s | t new set with elements from both s and t s.intersection(t) s & t new set with elements common to s and t s.difference(t) s - t new set with elements in s but not in t s.symmetric_difference(t) s ^ t new set with elements in either s or t but not both s.copy() new set with a shallow copy of s

more details on python sets here:

and/or use some methods like shapely:


another possibility could be to include shapely to add a native support to grass and topology.

And point, line, boundary and Area should have a:

  • buffer method, that return an Area object.
  • distance method, that return the minimal distance between objcts
  • wkt, return a well know text
  • wkb, return well know binary

Vector obj

Vect obj should have attributes like:

>>> roads = Vect('roads')

As for raster object should have an history object:

>>> road.hist.creator

>>> roads.exist()
>>> roads.isopen()
>>> for row in roads:
...     # do something

>>> = True)




Attributes table

The attributes table should be inherit from Structured Array class

Vector should have a connection attribute:

>>> roads.connect
Connection (db='postgresql', user='pietro', etc.)
>>> roads.exist()
>>> roads.attributes # return a OrderedDict
OrderedDict([('cat', int),('name', str),('geo', geometry)])

we can add a new column with

>>> roads.attributes['length'] = float
>>> for road in roads:
...     road['length'] = road.length

#as for numpy array:
>>> (roads['length'] <= 1000).nonzero() # return the index of all the roads that respect this conditions

allow SQL query:

>>> roads.sql("SELECT * FROM roads WHERE length <= 1000 ORDER BY length LIMIT 100")