GRASS SoC Ideas 2012/High level map interaction/Vector

From GRASS-Wiki
Jump to navigation Jump to search
The printable version is no longer supported and may have rendering errors. Please update your browser bookmarks and please use the default browser print function instead.

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
960.5
>>> line0.bbox # return the bbox>>> for segment in line.nseg
2
(pnt0, pnt1)
>>> line0.number # return the number line
>>> for segment in line.nseg # return the number of segments
2

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
True
>>> lineX in line0


Boundary

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

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

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

Area

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

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:

http://docs.python.org/library/sets.html#set-objects

and/or use some methods like shapely:

http://toblerity.github.com/shapely/manual.html#binary-predicates

and

http://toblerity.github.com/shapely/manual.html#spatial-analysis-methods

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')
>>> roads.name
'roads'

As for raster object should have an history object:

>>> road.hist.creator
'pietro'


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

>>> roads.open(topology = True)

Layer

Topology

Categories

Attributes table

The attributes table should be inherit from Structured Array class

http://docs.scipy.org/doc/numpy/user/basics.rec.html#structured-arrays

Vector should have a connection attribute:

>>> roads.connect
Connection (db='postgresql', user='pietro', etc.)
>>> roads.exist()
False
>>> 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")