/*! \brief Reads next unread line each time called. Use Vect_rewind to reset. This function implements sequential access on level 2. \param Map vector map layer \param[out] line_p container used to store line points within \param[out] line_c container used to store line categories within \return line type ( > 0 ) \return 0 dead line \return -1 out of memory \return -2 end of file */ int V2_read_next_line_nat(struct Map_info *Map, struct line_pnts *line_p, struct line_cats *line_c) { register int line, ret; register struct P_line *Line; struct bound_box lbox, mbox; G_debug(3, "V2_read_next_line_nat()"); if (Map->Constraint_region_flag) Vect_get_constraint_box(Map, &mbox); while (1) { line = Map->next_line; if (line > Map->plus.n_lines) return (-2); Line = Map->plus.Line[line]; if (Line == NULL) { /* Dead line */ Map->next_line++; continue; } if ((Map->Constraint_type_flag && !(Line->type & Map->Constraint_type))) { Map->next_line++; continue; } ret = V2_read_line_nat(Map, line_p, line_c, Map->next_line++); if (Map->Constraint_region_flag) { Vect_line_box(line_p, &lbox); if (!Vect_box_overlap(&lbox, &mbox)) { continue; } } return ret; } /* NOTREACHED */ }
/*! \brief Read next line from coor file. This function implements sequential access on level 1. \param Map vector map layer \param[out] line_p container used to store line points within \param[out] line_c container used to store line categories within \return line type \return 0 dead line \return -2 end of table (last row) \return -1 out of memory */ int V1_read_next_line_nat(struct Map_info *Map, struct line_pnts *line_p, struct line_cats *line_c) { int itype; off_t offset; struct bound_box lbox, mbox; G_debug(3, "V1_read_next_line_nat()"); if (Map->Constraint_region_flag) Vect_get_constraint_box(Map, &mbox); while (1) { offset = dig_ftell(&(Map->dig_fp)); itype = read_line_nat(Map, line_p, line_c, offset); if (itype < 0) return (itype); if (itype == 0) /* is it DEAD? */ continue; /* Constraint on Type of line * Default is all of Point, Line, Area and whatever else comes along */ if (Map->Constraint_type_flag) { if (!(itype & Map->Constraint_type)) continue; } /* Constraint on specified region */ if (Map->Constraint_region_flag) { Vect_line_box(line_p, &lbox); if (!Vect_box_overlap(&lbox, &mbox)) continue; } return (itype); } /* NOTREACHED */ }
int display_label(struct Map_info *Map, int type, struct cat_list *Clist, LATTR *lattr, int chcat) { int ltype; struct line_pnts *Points; struct line_cats *Cats; int ogr_centroids; const struct Format_info *finfo; Points = Vect_new_line_struct(); Cats = Vect_new_cats_struct(); Vect_rewind(Map); ogr_centroids = FALSE; finfo = Vect_get_finfo(Map); if (Vect_maptype(Map) == GV_FORMAT_OGR || (Vect_maptype(Map) == GV_FORMAT_POSTGIS && finfo->pg.toposchema_name == NULL)) { if (Vect_level(Map) < 2) G_warning(_("Topology level required for drawing centroids " "for OGR layers")); else if (Vect_get_num_primitives(Map, GV_CENTROID) > 0 && type & GV_CENTROID) /* label centroids from topo, don't label boundaries */ ogr_centroids = TRUE; } while (TRUE) { ltype = Vect_read_next_line(Map, Points, Cats); if (ltype == -1) G_fatal_error(_("Unable to read vector map")); else if (ltype == -2) /* EOF */ break; if (!(type & ltype) && !((type & GV_AREA) && (ltype & GV_CENTROID))) continue; /* used for both lines and labels */ if (ogr_centroids && ltype == GV_BOUNDARY) /* do not label boundaries */ continue; process_line(ltype, Points, Cats, lattr, chcat, Clist); } if (ogr_centroids) { /* show label for centroids stored in topo (for OGR layers only) */ int line, nlines; struct bound_box box; struct boxlist *list; list = Vect_new_boxlist(FALSE); /* bboxes not needed */ Vect_get_constraint_box(Map, &box); nlines = Vect_select_lines_by_box(Map, &box, GV_CENTROID, list); G_debug(3, "ncentroids (ogr) = %d", nlines); for (line = 0; line < nlines; line++) { ltype = Vect_read_line(Map, Points, Cats, list->id[line]); process_line(ltype, Points, Cats, lattr, chcat, Clist); } Vect_destroy_boxlist(list); } Vect_destroy_line_struct(Points); Vect_destroy_cats_struct(Cats); return 0; }
/*! \brief Read next feature from OGR layer. Skip empty features (level 1) This function implements sequential access. The action of this routine can be modified by: - Vect_read_constraint_region() - Vect_read_constraint_type() - Vect_remove_constraints() \param Map pointer to Map_info structure \param[out] line_p container used to store line points within \param[out] line_c container used to store line categories within \return feature type \return -2 no more features (EOF) \return -1 out of memory */ int V1_read_next_line_ogr(struct Map_info *Map, struct line_pnts *line_p, struct line_cats *line_c) { int itype; struct bound_box lbox, mbox; OGRFeatureH hFeature; OGRGeometryH hGeom; G_debug(3, "V1_read_next_line_ogr()"); if (line_p != NULL) Vect_reset_line(line_p); if (line_c != NULL) Vect_reset_cats(line_c); if (Map->Constraint_region_flag) Vect_get_constraint_box(Map, &mbox); while (TRUE) { /* Read feature to cache if necessary */ while (Map->fInfo.ogr.lines_next == Map->fInfo.ogr.lines_num) { hFeature = OGR_L_GetNextFeature(Map->fInfo.ogr.layer); if (hFeature == NULL) { return -2; } /* no more features */ hGeom = OGR_F_GetGeometryRef(hFeature); if (hGeom == NULL) { /* feature without geometry */ OGR_F_Destroy(hFeature); continue; } Map->fInfo.ogr.feature_cache_id = (int)OGR_F_GetFID(hFeature); if (Map->fInfo.ogr.feature_cache_id == OGRNullFID) { G_warning(_("OGR feature without ID")); } /* Cache the feature */ Map->fInfo.ogr.lines_num = 0; cache_feature(Map, hGeom, -1); G_debug(4, "%d lines read to cache", Map->fInfo.ogr.lines_num); OGR_F_Destroy(hFeature); Map->fInfo.ogr.lines_next = 0; /* next to be read from cache */ } /* Read next part of the feature */ G_debug(4, "read next cached line %d", Map->fInfo.ogr.lines_next); itype = Map->fInfo.ogr.lines_types[Map->fInfo.ogr.lines_next]; /* Constraint on Type of line * Default is all of Point, Line, Area and whatever else comes along */ if (Map->Constraint_type_flag) { if (!(itype & Map->Constraint_type)) { Map->fInfo.ogr.lines_next++; continue; } } /* Constraint on specified region */ if (Map->Constraint_region_flag) { Vect_line_box(Map->fInfo.ogr.lines[Map->fInfo.ogr.lines_next], &lbox); if (!Vect_box_overlap(&lbox, &mbox)) { Map->fInfo.ogr.lines_next++; continue; } } if (line_p != NULL) Vect_append_points(line_p, Map->fInfo.ogr.lines[Map->fInfo.ogr. lines_next], GV_FORWARD); if (line_c != NULL && Map->fInfo.ogr.feature_cache_id != OGRNullFID) Vect_cat_set(line_c, 1, Map->fInfo.ogr.feature_cache_id); Map->fInfo.ogr.lines_next++; G_debug(4, "next line read, type = %d", itype); return itype; } return -2; /* not reached */ }