GRASS SoC Ideas 2012/High level map interaction/Vector
See major page GRASS SoC Ideas 2012/High level map interaction
I would like to implement different Geometry classes:
>>> 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
>>> bound0.perimeter() 1023.8 >>> 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() 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:
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
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)
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() 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")