# GRASS SoC Ideas 2012/High level map interaction/Vector

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:

and/or use some methods like shapely:

and

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
'pietro'
```

```>>> roads.exist()
True
False
...     # do something
...
```

### 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.)
False
>>> roads.attributes # return a OrderedDict
OrderedDict([('cat', int),('name', str),('geo', geometry)])
```

we can add a new column with

```>>> roads.attributes['length'] = float
```>>> roads.sql("SELECT * FROM roads WHERE length <= 1000 ORDER BY length LIMIT 100")