def write(self, geo_obj): """:: >>> mun = Vector('boundary_municp_sqlite') #doctest: +SKIP >>> mun.open(mode='rw') #doctest: +SKIP >>> feature1 = mun.read(1) #doctest: +SKIP >>> feature1 #doctest: +SKIP Boundary(v_id=1) >>> feature1[:3] #doctest: +SKIP +NORMALIZE_WHITESPACE [Point(463718.874987, 310970.844494), Point(463707.405987, 310989.499494), Point(463714.593986, 311084.281494)] >>> from geometry import Point #doctest: +SKIP >>> feature1.insert(1, Point(463713.000000, 310980.000000)) ... #doctest: +SKIP >>> feature1[:4] #doctest: +SKIP +NORMALIZE_WHITESPACE [Point(463718.874987, 310970.844494), Point(463713.000000, 310980.000000), Point(463707.405987, 310989.499494), Point(463714.593986, 311084.281494)] >>> mun.write(feature1) #doctest: +SKIP >>> feature1 #doctest: +SKIP Boundary(v_id=8708) >>> mun.close() #doctest: +SKIP .. """ result = libvect.Vect_write_line(self.c_mapinfo, geo_obj.gtype, geo_obj.c_points, geo_obj.c_cats) if result == -1: raise GrassError("Not able to write the vector feature.") if self._topo_level == 2: # return new feature id (on level 2) geo_obj.id = result else: # return offset into file where the feature starts (on level 1) geo_obj.offset = result
def write(self, geo_obj, cat=None, attrs=None): """Write geometry features and attributes. :param geo_obj: a geometry grass object define in grass.pygrass.vector.geometry :type geo_obj: geometry GRASS object :param attrs: a list with the values that will be insert in the attribute table. :type attrs: list :param cat: The category of the geometry feature, otherwise the c_cats attribute of the geometry object will be used. :type cat: integer Open a new vector map :: >>> new = VectorTopo('newvect') >>> new.exist() False define the new columns of the attribute table :: >>> cols = [(u'cat', 'INTEGER PRIMARY KEY'), ... (u'name', 'TEXT')] open the vector map in write mode >>> new.open('w', tab_name='newvect', tab_cols=cols) import a geometry feature :: >>> from grass.pygrass.vector.geometry import Point create two points :: >>> point0 = Point(0, 0) >>> point1 = Point(1, 1) then write the two points on the map, with :: >>> new.write(point0, cat=1, attrs=('pub',)) >>> new.write(point1, cat=2, attrs=('resturant',)) commit the db changes :: >>> new.table.conn.commit() >>> new.table.execute().fetchall() [(1, u'pub'), (2, u'resturant')] close the vector map :: >>> new.close() >>> new.exist() True then play with the map :: >>> new.open(mode='r') >>> new.read(1) Point(0.000000, 0.000000) >>> new.read(2) Point(1.000000, 1.000000) >>> new.read(1).attrs['name'] u'pub' >>> new.read(2).attrs['name'] u'resturant' >>> new.close() >>> new.remove() """ self.n_lines += 1 if not isinstance(cat, int) and not isinstance(cat, str): # likely the case of using 7.0 API import warnings warnings.warn("Vector.write(geo_obj, attrs=(...)) is" " depreciated, specify cat explicitly", DeprecationWarning) # try to accommodate attrs = cat cat = None if attrs and cat is None: # TODO: this does not work as expected when there are # already features in the map when we opened it cat = (self._cats[-1] if self._cats else 0) + 1 if cat is not None and cat not in self._cats: self._cats.append(cat) if self.table is not None and attrs is not None: attr = [cat, ] attr.extend(attrs) cur = self.table.conn.cursor() cur.execute(self.table.columns.insert_str, attr) cur.close() if cat is not None: cats = Cats(geo_obj.c_cats) cats.reset() cats.set(cat, self.layer) if geo_obj.gtype == _Area.gtype: result = self._write_area(geo_obj) result = libvect.Vect_write_line(self.c_mapinfo, geo_obj.gtype, geo_obj.c_points, geo_obj.c_cats) if result == -1: raise GrassError("Not able to write the vector feature.") if self._topo_level == 2: # return new feature id (on level 2) geo_obj.id = result else: # return offset into file where the feature starts (on level 1) geo_obj.offset = result
def write(self): """Write the centroid to the Map.""" libvect.Vect_write_line(self.c_mapinfo, libvect.GV_CENTROID, self.c_points, self.c_cats)
def write(self, geo_obj, attrs=None, set_cats=True): """Write geometry features and attributes. :param geo_obj: a geometry grass object define in grass.pygrass.vector.geometry :type geo_obj: geometry GRASS object :param attrs: a list with the values that will be insert in the attribute table. :type attrs: list :param set_cats: if True, the category of the geometry feature is set using the default layer of the vector map and a progressive category value (default), otherwise the c_cats attribute of the geometry object will be used. :type set_cats: bool Open a new vector map :: >>> new = VectorTopo('newvect') >>> new.exist() False define the new columns of the attribute table :: >>> cols = [(u'cat', 'INTEGER PRIMARY KEY'), ... (u'name', 'TEXT')] open the vector map in write mode >>> new.open('w', tab_name='newvect', tab_cols=cols) import a geometry feature :: >>> from grass.pygrass.vector.geometry import Point create two points :: >>> point0 = Point(636981.336043, 256517.602235) >>> point1 = Point(637209.083058, 257970.129540) then write the two points on the map, with :: >>> new.write(point0, ('pub', )) >>> new.write(point1, ('resturnat', )) commit the db changes :: >>> new.table.conn.commit() >>> new.table.execute().fetchall() [(1, u'pub'), (2, u'resturnat')] close the vector map :: >>> new.close() >>> new.exist() True then play with the map :: >>> new.open(mode='r') >>> new.read(1) Point(636981.336043, 256517.602235) >>> new.read(2) Point(637209.083058, 257970.129540) >>> new.read(1).attrs['name'] u'pub' >>> new.read(2).attrs['name'] u'resturnat' >>> new.close() >>> new.remove() """ self.n_lines += 1 if self.table is not None and attrs: attr = [self.n_lines, ] attr.extend(attrs) cur = self.table.conn.cursor() cur.execute(self.table.columns.insert_str, attr) cur.close() if set_cats: cats = Cats(geo_obj.c_cats) cats.reset() cats.set(self.n_lines, self.layer) if geo_obj.gtype == _Area.gtype: result = self._write_area(geo_obj) result = libvect.Vect_write_line(self.c_mapinfo, geo_obj.gtype, geo_obj.c_points, geo_obj.c_cats) if result == -1: raise GrassError("Not able to write the vector feature.") if self._topo_level == 2: # return new feature id (on level 2) geo_obj.id = result else: # return offset into file where the feature starts (on level 1) geo_obj.offset = result