[GRASS-dev] [GRASS-SVN] r72715 - grass/branches/releasebranch_7_4/vector/v.select
Martin Landa
landa.martin at gmail.com
Wed May 16 12:59:07 PDT 2018
Hi,
2018-05-16 21:49 GMT+02:00 <svn_grass at osgeo.org>:
> Log:
> v.select: backport trunk r73705, r72714
first of all, great job!
Just a small note, please be more informative in log messages also
about backporting. It will help going through svn log when collecting
news for release. Thanks, Martin
> - return relate_geos(BIn, AGeom, bline, operator, relate, 0);
> + return relate_geos(AIn, BGeom, aline, operator, relate, 0);
> }
>
> -int area_relate_geos(struct Map_info *BIn, const GEOSGeometry * AGeom,
> - int barea, int operator, const char *relate)
> +int area_relate_geos(struct Map_info *AIn, const GEOSGeometry *BGeom,
> + int aarea, int operator, const char *relate)
> {
> - return relate_geos(BIn, AGeom, barea, operator, relate, 1);
> + return relate_geos(AIn, BGeom, aarea, operator, relate, 1);
> }
>
> -int relate_geos(struct Map_info *BIn, const GEOSGeometry * AGeom,
> - int bfid, int operator, const char *relate, int area)
> +int relate_geos(struct Map_info *AIn, const GEOSGeometry *BGeom,
> + int afid, int operator, const char *relate, int area)
> {
> - GEOSGeometry *BGeom = NULL;
> + GEOSGeometry *AGeom = NULL;
> int found;
>
> found = 0;
> if (area)
> - BGeom = Vect_read_area_geos(BIn, bfid);
> + AGeom = Vect_read_area_geos(AIn, afid);
> else
> - BGeom = Vect_read_line_geos(BIn, bfid, NULL);
> + AGeom = Vect_read_line_geos(AIn, afid, NULL);
>
> - if (!BGeom)
> + if (!AGeom)
> return 0;
>
> /*
> @@ -115,8 +115,8 @@
> break;
> }
>
> - if (BGeom)
> - GEOSGeom_destroy(BGeom);
> + if (AGeom)
> + GEOSGeom_destroy(AGeom);
>
> return found;
> }
>
> Modified: grass/branches/releasebranch_7_4/vector/v.select/main.c
> ===================================================================
> --- grass/branches/releasebranch_7_4/vector/v.select/main.c 2018-05-16 19:42:14 UTC (rev 72714)
> +++ grass/branches/releasebranch_7_4/vector/v.select/main.c 2018-05-16 19:49:20 UTC (rev 72715)
> @@ -113,9 +113,7 @@
>
> /* Alloc space for input lines array */
> ALines = (int *)G_calloc(Vect_get_num_lines(&(In[0])) + 1, sizeof(int));
> - AAreas = NULL;
> - if (flag.reverse->answer)
> - AAreas = (int *)G_calloc(Vect_get_num_areas(&(In[0])) + 1, sizeof(int));
> + AAreas = (int *)G_calloc(Vect_get_num_areas(&(In[0])) + 1, sizeof(int));
>
> /* Read field info */
> IFi = Vect_get_field(&(In[0]), ifield[0]);
> @@ -150,47 +148,56 @@
> finishGEOS();
> #endif
>
> + if (!flag.reverse->answer) {
> + G_free(AAreas);
> + AAreas = NULL;
> + }
> +
> +
> if (nfound != 0) {
>
> - native = Vect_maptype(&Out) == GV_FORMAT_NATIVE;
> + native = Vect_maptype(&Out) == GV_FORMAT_NATIVE;
>
> - nfields = Vect_cidx_get_num_fields(&(In[0]));
> - cats = (int **)G_malloc(nfields * sizeof(int *));
> - ncats = (int *)G_malloc(nfields * sizeof(int));
> - fields = (int *)G_malloc(nfields * sizeof(int));
> + nfields = Vect_cidx_get_num_fields(&(In[0]));
> + cats = (int **)G_malloc(nfields * sizeof(int *));
> + ncats = (int *)G_malloc(nfields * sizeof(int));
> + fields = (int *)G_malloc(nfields * sizeof(int));
>
> - /* Write lines */
> - if (!flag.table->answer && !native) {
> - /* Copy attributes for OGR output */
> - Vect_copy_map_dblinks(&(In[0]), &Out, TRUE);
> - }
> -
> - write_lines(&(In[0]), IFi, ALines, AAreas,
> - &Out, flag.table->answer ? 1 : 0, flag.reverse->answer ? 1 : 0,
> - nfields, fields, ncats, cats);
> + /* Write lines */
> + if (!flag.table->answer && !native) {
> + /* Copy attributes for OGR output */
> + Vect_copy_map_dblinks(&(In[0]), &Out, TRUE);
> + }
> +
> + write_lines(&(In[0]), IFi, ALines, AAreas,
> + &Out, flag.table->answer ? 1 : 0, flag.reverse->answer ? 1 : 0,
> + nfields, fields, ncats, cats);
>
> - /* Copy tables */
> - if (!flag.table->answer && native) {
> - copy_tabs(&(In[0]), &Out,
> - nfields, fields, ncats, cats);
> - }
> + /* Copy tables */
> + if (!flag.table->answer && native) {
> + copy_tabs(&(In[0]), &Out,
> + nfields, fields, ncats, cats);
> + }
>
> - /* print info about skipped features & close input maps */
> - for (iopt = 0; iopt < 2; iopt++) {
> - if (nskipped[iopt] > 0) {
> - G_warning(_("%d features from <%s> without category skipped"),
> - nskipped[iopt], Vect_get_full_name(&(In[iopt])));
> - }
> - Vect_close(&(In[iopt]));
> - }
> + /* print info about skipped features & close input maps */
> + for (iopt = 0; iopt < 2; iopt++) {
> + if (nskipped[iopt] > 0) {
> + G_warning(_("%d features from <%s> without category skipped"),
> + nskipped[iopt], Vect_get_full_name(&(In[iopt])));
> + }
> + Vect_close(&(In[iopt]));
> + }
>
> - Vect_build(&Out);
> - Vect_close(&Out);
> + Vect_build(&Out);
> + Vect_close(&Out);
>
> - G_done_msg(_("%d features written to output."), Vect_get_num_lines(&Out));
> - } else {
> - G_done_msg(_("No features found !"));
> + G_done_msg(_("%d features written to output."), Vect_get_num_lines(&Out));
> }
> + else {
> + Vect_close(&In[0]);
> + Vect_close(&In[1]);
> + G_done_msg(_("No features found !"));
> + }
>
> exit(EXIT_SUCCESS);
> }
>
> Modified: grass/branches/releasebranch_7_4/vector/v.select/overlap.c
> ===================================================================
> --- grass/branches/releasebranch_7_4/vector/v.select/overlap.c 2018-05-16 19:42:14 UTC (rev 72714)
> +++ grass/branches/releasebranch_7_4/vector/v.select/overlap.c 2018-05-16 19:49:20 UTC (rev 72715)
> @@ -40,43 +40,17 @@
>
> /* Returns 1 if line1 from Map1 overlaps area2 from Map2,
> * 0 otherwise */
> -int line_overlap_area(struct line_pnts *LPoints, struct Map_info *AMap,
> - int area)
> +int line_overlap_area(struct line_pnts *LPoints, struct line_pnts *OPoints,
> + struct line_pnts **IPoints, int nisles)
> {
> - int i, nisles, isle;
> - static struct line_pnts *APoints = NULL;
> - static struct line_pnts **IPoints = NULL;
> - static int isles_alloc = 0;
> + int i, isle;
>
> - G_debug(4, "line_overlap_area area = %d", area);
> + G_debug(4, "line_overlap_area area");
>
> - if (!APoints) {
> - APoints = Vect_new_line_struct();
> - isles_alloc = 10;
> - IPoints = G_malloc(isles_alloc * sizeof(struct line_pnts *));
> - for (i = 0; i < isles_alloc; i++)
> - IPoints[i] = Vect_new_line_struct();
> - }
> -
> - Vect_get_area_points(AMap, area, APoints);
> - nisles = Vect_get_area_num_isles(AMap, area);
> -
> - if (nisles >= isles_alloc) {
> - IPoints = G_realloc(IPoints, (nisles + 10) * sizeof(struct line_pnts *));
> - for (i = isles_alloc; i < nisles + 10; i++)
> - IPoints[i] = Vect_new_line_struct();
> - isles_alloc = nisles + 10;
> - }
> -
> - for (i = 0; i < nisles; i++) {
> - isle = Vect_get_area_isle(AMap, area, i);
> - Vect_get_isle_points(AMap, isle, IPoints[i]);
> - }
> -
> /* Try if any of line vertices is within area */
> for (i = 0; i < LPoints->n_points; i++) {
>
> - if (Vect_point_in_poly(LPoints->x[i], LPoints->y[i], APoints)) {
> + if (Vect_point_in_poly(LPoints->x[i], LPoints->y[i], OPoints)) {
> int inside = 1;
>
> for (isle = 0; isle < nisles; isle++) {
> @@ -99,13 +73,12 @@
> /* Try intersections of line with area/isles boundary */
> /* Outer boundary */
>
> - if (Vect_line_check_intersection2(LPoints, APoints, 0)) {
> + if (Vect_line_check_intersection2(LPoints, OPoints, 0)) {
> G_debug(4, " -> line intersects outer area boundary");
> return 1;
> }
>
> for (i = 0; i < nisles; i++) {
> -
> if (Vect_line_check_intersection2(LPoints, IPoints[i], 0)) {
> G_debug(4, " -> line intersects area island boundary");
> return 1;
>
> Modified: grass/branches/releasebranch_7_4/vector/v.select/proto.h
> ===================================================================
> --- grass/branches/releasebranch_7_4/vector/v.select/proto.h 2018-05-16 19:42:14 UTC (rev 72714)
> +++ grass/branches/releasebranch_7_4/vector/v.select/proto.h 2018-05-16 19:49:20 UTC (rev 72715)
> @@ -42,7 +42,8 @@
>
> /* overlap.c */
> void add_aarea(struct Map_info *, int, int *, int *);
> -int line_overlap_area(struct line_pnts *, struct Map_info *, int);
> +int line_overlap_area(struct line_pnts *, struct line_pnts *,
> + struct line_pnts **, int);
>
> /* write.c */
> void write_lines(struct Map_info *, struct field_info *, int *, int *,
>
> Modified: grass/branches/releasebranch_7_4/vector/v.select/select.c
> ===================================================================
> --- grass/branches/releasebranch_7_4/vector/v.select/select.c 2018-05-16 19:42:14 UTC (rev 72714)
> +++ grass/branches/releasebranch_7_4/vector/v.select/select.c 2018-05-16 19:49:20 UTC (rev 72715)
> @@ -7,327 +7,404 @@
> #include "proto.h"
>
> int select_lines(struct Map_info *aIn, int atype, int afield,
> - struct Map_info *bIn, int btype, int bfield,
> - int cat_flag, int operator, const char *relate,
> - int *ALines, int *AAreas, int* nskipped)
> + struct Map_info *bIn, int btype, int bfield,
> + int cat_flag, int operator, const char *relate,
> + int *ALines, int *AAreas, int* nskipped)
> {
> - int i;
> - int nalines, aline, ltype;
> + int i, ai;
> + int nblines, bline, ltype;
> int nfound = 0;
>
> struct line_pnts *APoints, *BPoints;
> - struct ilist *BoundList, *LList;
> - struct boxlist *List, *TmpList;
> + struct line_pnts *OPoints, **IPoints;
> + int isle, nisles, isles_alloc;
> + struct ilist *BoundList;
> + struct boxlist *List;
>
> #ifdef HAVE_GEOS
> initGEOS(G_message, G_fatal_error);
> - GEOSGeometry *AGeom = NULL;
> + GEOSGeometry *BGeom = NULL;
> #else
> - void *AGeom = NULL;
> + void *BGeom = NULL;
> #endif
>
> nskipped[0] = nskipped[1] = 0;
> APoints = Vect_new_line_struct();
> BPoints = Vect_new_line_struct();
> + OPoints = Vect_new_line_struct();
> + isles_alloc = 10;
> + IPoints = G_malloc(isles_alloc * sizeof(struct line_pnts *));
> + for (i = 0; i < isles_alloc; i++)
> + IPoints[i] = Vect_new_line_struct();
> + nisles = 0;
> +
> List = Vect_new_boxlist(1);
> - TmpList = Vect_new_boxlist(1);
> BoundList = Vect_new_list();
> - LList = Vect_new_list();
>
> - nalines = Vect_get_num_lines(aIn);
> + nblines = Vect_get_num_lines(bIn);
>
> - /* Lines in A. Go through all lines and mark those that meets condition */
> - if (atype & (GV_POINTS | GV_LINES)) {
> + /* Lines in B */
> + if (btype & (GV_POINTS | GV_LINES)) {
> G_message(_("Processing features..."));
>
> - G_percent(0, nalines, 2);
> - for (aline = 1; aline <= nalines; aline++) {
> - struct bound_box abox;
> + G_percent(0, nblines, 2);
> + for (bline = 1; bline <= nblines; bline++) {
> + struct bound_box bbox;
>
> - G_debug(3, "aline = %d", aline);
> - G_percent(aline, nalines, 2); /* must be before any continue */
> + G_debug(3, "bline = %d", bline);
> + G_percent(bline, nblines, 1); /* must be before any continue */
>
> + /* Check type */
> + ltype = Vect_get_line_type(bIn, bline);
> + if (!(ltype & btype))
> + continue;
> +
> /* Check category */
> - if (!cat_flag && Vect_get_line_cat(aIn, aline, afield) < 0) {
> - nskipped[0]++;
> + if (!cat_flag && Vect_get_line_cat(bIn, bline, bfield) < 0) {
> + nskipped[1]++;
> continue;
> }
>
> - /* Read line and check type */
> - if (operator != OP_OVERLAP) {
> -#ifdef HAVE_GEOS
> - AGeom = Vect_read_line_geos(aIn, aline, <ype);
> -#endif
> - if (!(ltype & (GV_POINT | GV_LINE)))
> - continue;
> + Vect_reset_line(BPoints);
>
> - if (!AGeom)
> - G_fatal_error(_("Unable to read line id %d from vector map <%s>"),
> - aline, Vect_get_full_name(aIn));
> - }
> - else {
> - ltype = Vect_read_line(aIn, APoints, NULL, aline);
> - }
> -
> - if (!(ltype & atype))
> - continue;
> -
> - Vect_get_line_box(aIn, aline, &abox);
> + Vect_get_line_box(bIn, bline, &bbox);
>
> - /* Check if this line overlaps any feature in B */
> - /* x Lines in B */
> - if (btype & (GV_POINTS | GV_LINES)) {
> - int found = 0;
> + /* Check if this line overlaps any feature in A */
> + /* x Lines in A */
> + if (atype & (GV_POINTS | GV_LINES)) {
>
> /* Lines */
> - Vect_select_lines_by_box(bIn, &abox, btype, List);
> - for (i = 0; i < List->n_values; i++) {
> - int bline;
> + Vect_select_lines_by_box(aIn, &bbox, atype, List);
> + for (ai = 0; ai < List->n_values; ai++) {
> + int aline;
>
> - bline = List->id[i];
> - G_debug(3, " bline = %d", bline);
> -
> + aline = List->id[ai];
> + G_debug(3, " aline = %d", aline);
> +
> + if (ALines[aline] == 1)
> + continue;
> +
> + /* Check type */
> + ltype = Vect_get_line_type(aIn, aline);
> + if (!(ltype & atype))
> + continue;
> +
> /* Check category */
> if (!cat_flag &&
> - Vect_get_line_cat(bIn, bline, bfield) < 0) {
> - nskipped[1]++;
> + Vect_get_line_cat(aIn, aline, afield) < 0) {
> + nskipped[0]++;
> continue;
> }
>
> if (operator != OP_OVERLAP) {
> #ifdef HAVE_GEOS
> - if(line_relate_geos(bIn, AGeom,
> - bline, operator, relate)) {
> + if (!BGeom)
> + BGeom = Vect_read_line_geos(bIn, bline, <ype);
> + if (!BGeom)
> + G_fatal_error(_("Unable to read line id %d from vector map <%s>"),
> + bline, Vect_get_full_name(bIn));
>
> - found = 1;
> - break;
> + if (line_relate_geos(aIn, BGeom, aline,
> + operator, relate)) {
> + ALines[aline] = 1;
> + nfound += 1;
> }
> #endif
> }
> else {
> - Vect_read_line(bIn, BPoints, NULL, bline);
> + if (BPoints->n_points == 0)
> + Vect_read_line(bIn, BPoints, NULL, bline);
> + Vect_read_line(aIn, APoints, NULL, aline);
>
> - if (Vect_line_check_intersection2(APoints, BPoints, 0)) {
> - found = 1;
> - break;
> + if (Vect_line_check_intersection2(BPoints, APoints, 0)) {
> + ALines[aline] = 1;
> + nfound += 1;
> }
> }
> }
> -
> - if (found) {
> - ALines[aline] = 1;
> - nfound += 1;
> - continue; /* Go to next A line */
> - }
> }
>
> - /* x Areas in B. */
> - if (btype & GV_AREA) {
> + /* x Areas in A. */
> + if (atype & GV_AREA) {
>
> - Vect_select_areas_by_box(bIn, &abox, List);
> - for (i = 0; i < List->n_values; i++) {
> - int barea;
> + Vect_select_areas_by_box(aIn, &bbox, List);
> + for (ai = 0; ai < List->n_values; ai++) {
> + int aarea;
>
> - barea = List->id[i];
> - G_debug(3, " barea = %d", barea);
> + aarea = List->id[ai];
> + G_debug(3, " aarea = %d", aarea);
>
> - if (Vect_get_area_cat(bIn, barea, bfield) < 0) {
> - nskipped[1]++;
> + if (AAreas[aarea] == 1)
> continue;
> +
> + if (Vect_get_area_centroid(aIn, aarea) < 1)
> + continue;
> +
> + if (!cat_flag &&
> + Vect_get_area_cat(aIn, aarea, afield) < 0) {
> + nskipped[0]++;
> + continue;
> }
>
> if (operator != OP_OVERLAP) {
> #ifdef HAVE_GEOS
> - if(area_relate_geos(bIn, AGeom,
> - barea, operator, relate)) {
> - ALines[aline] = 1;
> + if (!BGeom)
> + BGeom = Vect_read_line_geos(bIn, bline, <ype);
> + if (!BGeom)
> + G_fatal_error(_("Unable to read line id %d from vector map <%s>"),
> + bline, Vect_get_full_name(bIn));
> +
> + if (area_relate_geos(aIn, BGeom, aarea,
> + operator, relate)) {
> + add_aarea(aIn, aarea, ALines, AAreas);
> nfound += 1;
> - break;
> }
> #endif
> }
> else {
> - if (line_overlap_area(APoints, bIn, barea)) {
> - ALines[aline] = 1;
> + if (BPoints->n_points == 0)
> + Vect_read_line(bIn, BPoints, NULL, bline);
> + Vect_get_area_points(aIn, aarea, OPoints);
> + nisles = Vect_get_area_num_isles(aIn, aarea);
> + if (nisles >= isles_alloc) {
> + IPoints = G_realloc(IPoints, (nisles + 10) * sizeof(struct line_pnts *));
> + for (i = isles_alloc; i < nisles + 10; i++)
> + IPoints[i] = Vect_new_line_struct();
> + isles_alloc = nisles + 10;
> + }
> + for (i = 0; i < nisles; i++) {
> + isle = Vect_get_area_isle(aIn, aarea, i);
> + Vect_get_isle_points(aIn, isle, IPoints[i]);
> + }
> +
> + if (line_overlap_area(BPoints, OPoints, IPoints, nisles)) {
> + add_aarea(aIn, aarea, ALines, AAreas);
> nfound += 1;
> - break;
> }
> }
> }
> }
> - if (operator != OP_OVERLAP) {
> #ifdef HAVE_GEOS
> - GEOSGeom_destroy(AGeom);
> + if (BGeom != NULL) {
> + GEOSGeom_destroy(BGeom);
> + BGeom = NULL;
> + }
> #endif
> - AGeom = NULL;
> - }
> }
> }
>
> - /* Areas in A. */
> - if (atype & GV_AREA) {
> - int aarea, naareas;
> + /* Areas in B. */
> + if (btype & GV_AREA) {
> + int barea, nbareas, bcentroid;
>
> G_message(_("Processing areas..."));
>
> - naareas = Vect_get_num_areas(aIn);
> + nbareas = Vect_get_num_areas(bIn);
>
> - G_percent(0, naareas, 2);
> - for (aarea = 1; aarea <= naareas; aarea++) {
> - struct bound_box abox;
> + G_percent(0, nbareas, 1);
> + for (barea = 1; barea <= nbareas; barea++) {
> + struct bound_box bbox;
>
> - G_percent(aarea, naareas, 1);
> + G_percent(barea, nbareas, 2);
>
> - if (Vect_get_area_cat(aIn, aarea, afield) < 0) {
> - nskipped[0]++;
> + if ((bcentroid = Vect_get_area_centroid(bIn, barea)) < 1)
> continue;
> - }
> -
> - Vect_get_area_box(aIn, aarea, &abox);
> - abox.T = PORT_DOUBLE_MAX;
> - abox.B = -PORT_DOUBLE_MAX;
>
> - if (operator != OP_OVERLAP) {
> -#ifdef HAVE_GEOS
> - AGeom = Vect_read_area_geos(aIn, aarea);
> -#endif
> - if (!AGeom)
> - G_fatal_error(_("Unable to read area id %d from vector map <%s>"),
> - aarea, Vect_get_full_name(aIn));
> + if (!cat_flag &&
> + Vect_get_area_cat(bIn, barea, bfield) < 0) {
> + nskipped[1]++;
> + continue;
> }
>
> - /* x Lines in B */
> - if (btype & (GV_POINTS | GV_LINES)) {
> - Vect_select_lines_by_box(bIn, &abox, btype, List);
> + Vect_reset_line(BPoints);
>
> - for (i = 0; i < List->n_values; i++) {
> - int bline;
> + Vect_get_area_box(bIn, barea, &bbox);
> + bbox.T = PORT_DOUBLE_MAX;
> + bbox.B = -PORT_DOUBLE_MAX;
>
> - bline = List->id[i];
> + /* x Lines in A */
> + if (atype & (GV_POINTS | GV_LINES)) {
> + Vect_select_lines_by_box(aIn, &bbox, atype, List);
>
> + for (ai = 0; ai < List->n_values; ai++) {
> + int aline;
> +
> + aline = List->id[ai];
> + if (ALines[aline] == 1)
> + continue;
> +
> + /* Check type */
> + ltype = Vect_get_line_type(aIn, aline);
> + if (!(ltype & atype))
> + continue;
> +
> if (!cat_flag &&
> - Vect_get_line_cat(bIn, bline, bfield) < 0) {
> - nskipped[1]++;
> + Vect_get_line_cat(aIn, aline, afield) < 0) {
> + nskipped[0]++;
> continue;
> }
>
> if (operator != OP_OVERLAP) {
> #ifdef HAVE_GEOS
> - if(line_relate_geos(bIn, AGeom,
> - bline, operator, relate)) {
> - add_aarea(aIn, aarea, ALines, AAreas);
> + if (!BGeom)
> + BGeom = Vect_read_area_geos(bIn, barea);
> + if (!BGeom)
> + G_fatal_error(_("Unable to read area id %d from vector map <%s>"),
> + barea, Vect_get_full_name(bIn));
> + if (line_relate_geos(aIn, BGeom, aline,
> + operator, relate)) {
> + ALines[aline] = 1;
> nfound += 1;
> - break;
> }
> #endif
> }
> else {
> - Vect_read_line(bIn, BPoints, NULL, bline);
> + if (BPoints->n_points == 0) {
> + Vect_read_line(bIn, BPoints, NULL, bcentroid);
> + Vect_get_area_points(bIn, barea, OPoints);
> + nisles = Vect_get_area_num_isles(bIn, barea);
> + if (nisles >= isles_alloc) {
> + IPoints = G_realloc(IPoints, (nisles + 10) * sizeof(struct line_pnts *));
> + for (i = isles_alloc; i < nisles + 10; i++)
> + IPoints[i] = Vect_new_line_struct();
> + isles_alloc = nisles + 10;
> + }
> + for (i = 0; i < nisles; i++) {
> + isle = Vect_get_area_isle(bIn, barea, i);
> + Vect_get_isle_points(bIn, isle, IPoints[i]);
> + }
> + }
>
> - if (line_overlap_area(BPoints, aIn, aarea)) {
> - add_aarea(aIn, aarea, ALines, AAreas);
> + Vect_read_line(aIn, APoints, NULL, aline);
> +
> + if (line_overlap_area(APoints, OPoints, IPoints, nisles)) {
> + ALines[aline] = 1;
> nfound += 1;
> - continue;
> }
> }
> }
> }
>
> - /* x Areas in B */
> - if (btype & GV_AREA) {
> - int naisles;
> - int found = 0;
> + /* x Areas in A */
> + if (atype & GV_AREA) {
>
> - /* List of areas B */
> + /* List of areas A */
> + Vect_select_areas_by_box(aIn, &bbox, List);
>
> - /* Make a list of features forming area A */
> - Vect_reset_list(LList);
> + for (ai = 0; ai < List->n_values; ai++) {
> + int found = 0;
> + int aarea, acentroid;
>
> - Vect_get_area_boundaries(aIn, aarea, BoundList);
> - for (i = 0; i < BoundList->n_values; i++) {
> - Vect_list_append(LList, abs(BoundList->value[i]));
> - }
> + aarea = List->id[ai];
> + G_debug(3, " aarea = %d", aarea);
> +
> + if (AAreas[aarea] == 1)
> + continue;
>
> - naisles = Vect_get_area_num_isles(aIn, aarea);
> + if ((acentroid = Vect_get_area_centroid(aIn, aarea)) < 1)
> + continue;
>
> - for (i = 0; i < naisles; i++) {
> - int j, aisle;
> + if (!cat_flag &&
> + Vect_get_area_cat(aIn, aarea, afield) < 0) {
> + nskipped[0]++;
> + continue;
> + }
>
> - aisle = Vect_get_area_isle(aIn, aarea, i);
> -
> - Vect_get_isle_boundaries(aIn, aisle, BoundList);
> - for (j = 0; j < BoundList->n_values; j++) {
> - Vect_list_append(LList, BoundList->value[j]);
> + if (operator != OP_OVERLAP) {
> +#ifdef HAVE_GEOS
> + if (!BGeom)
> + BGeom = Vect_read_area_geos(bIn, barea);
> + if (!BGeom)
> + G_fatal_error(_("Unable to read area id %d from vector map <%s>"),
> + barea, Vect_get_full_name(bIn));
> + if (area_relate_geos(aIn, BGeom, aarea,
> + operator, relate)) {
> + found = 1;
> + }
> +#endif
> }
> - }
> + else {
> + if (BPoints->n_points == 0) {
> + Vect_read_line(bIn, BPoints, NULL, bcentroid);
> + Vect_get_area_points(bIn, barea, OPoints);
> + nisles = Vect_get_area_num_isles(bIn, barea);
> + if (nisles >= isles_alloc) {
> + IPoints = G_realloc(IPoints, (nisles + 10) * sizeof(struct line_pnts *));
> + for (i = isles_alloc; i < nisles + 10; i++)
> + IPoints[i] = Vect_new_line_struct();
> + isles_alloc = nisles + 10;
> + }
> + for (i = 0; i < nisles; i++) {
> + isle = Vect_get_area_isle(bIn, barea, i);
> + Vect_get_isle_points(bIn, isle, IPoints[i]);
> + }
> + }
>
> - Vect_select_areas_by_box(bIn, &abox, TmpList);
> + /* A inside B ? */
> + Vect_read_line(aIn, APoints, NULL, acentroid);
> + if (line_overlap_area(APoints, OPoints, IPoints, nisles)) {
> + found = 1;
> + }
>
> - for (i = 0; i < LList->n_values; i++) {
> - int j;
> + /* B inside A ? */
> + if (!found) {
> + struct bound_box abox;
>
> - aline = abs(LList->value[i]);
> - Vect_read_line(aIn, APoints, NULL, aline);
> + Vect_get_area_box(aIn, aarea, &abox);
> + abox.T = PORT_DOUBLE_MAX;
> + abox.B = -PORT_DOUBLE_MAX;
>
> - for (j = 0; j < TmpList->n_values; j++) {
> - int barea, bcentroid;
> + if (Vect_point_in_area(BPoints->x[0], BPoints->y[0], aIn,
> + aarea, &abox)) {
> + found = 1;
> + }
> + }
>
> - barea = TmpList->id[j];
> - G_debug(3, " barea = %d", barea);
> -
> - if (Vect_get_area_cat(bIn, barea, bfield) < 0) {
> - nskipped[1]++;
> - continue;
> + /* A overlaps B ? */
> + if (!found) {
> + Vect_get_area_boundaries(aIn, aarea, BoundList);
> + for (i = 0; i < BoundList->n_values; i++) {
> + Vect_read_line(aIn, APoints, NULL, abs(BoundList->value[i]));
> + if (line_overlap_area(APoints, OPoints, IPoints, nisles)) {
> + found = 1;
> + break;
> + }
> + }
> }
>
> - /* Check if any centroid of area B is in area A.
> - * This test is important in if area B is completely within area A */
> - if ((bcentroid = Vect_get_area_centroid(bIn, barea)) > 0)
> - Vect_read_line(bIn, BPoints, NULL, bcentroid);
> - else {
> - double x, y;
> + if (!found) {
> + int j, naisles;
>
> - Vect_get_point_in_area(bIn, barea, &x, &y);
> - Vect_reset_line(BPoints);
> - Vect_append_point(BPoints, x, y, 0.0);
> - }
> + naisles = Vect_get_area_num_isles(aIn, aarea);
> + for (j = 0; j < naisles; j++) {
>
> - if (operator != OP_OVERLAP) {
> -#ifdef HAVE_GEOS
> - if(area_relate_geos(bIn, AGeom,
> - barea, operator, relate)) {
> - found = 1;
> - break;
> + isle = Vect_get_area_isle(aIn, aarea, j);
> +
> + Vect_get_isle_boundaries(aIn, isle, BoundList);
> + for (i = 0; i < BoundList->n_values; i++) {
> + Vect_read_line(aIn, APoints, NULL, abs(BoundList->value[i]));
> + if (line_overlap_area(APoints, OPoints, IPoints, nisles)) {
> + found = 1;
> + break;
> + }
> + }
> + if (found)
> + break;
> }
> -#endif
> }
> - else {
> - if (Vect_point_in_area(BPoints->x[0], BPoints->y[0], aIn,
> - aarea, &abox)) {
> - found = 1;
> - break;
> - }
> -
> - /* Check intersectin of lines from List with area B */
> - if (line_overlap_area(APoints, bIn, barea)) {
> - found = 1;
> - break;
> - }
> - }
> }
> if (found) {
> add_aarea(aIn, aarea, ALines, AAreas);
> - nfound += 1;
> - break;
> + nfound += 1;
> }
> }
> }
> - if (operator != OP_OVERLAP) {
> #ifdef HAVE_GEOS
> - GEOSGeom_destroy(AGeom);
> + if (BGeom != NULL) {
> + GEOSGeom_destroy(BGeom);
> + BGeom = NULL;
> + }
> #endif
> - AGeom = NULL;
> - }
> }
> }
>
> @@ -334,9 +411,7 @@
> Vect_destroy_line_struct(APoints);
> Vect_destroy_line_struct(BPoints);
> Vect_destroy_list(BoundList);
> - Vect_destroy_list(LList);
> Vect_destroy_boxlist(List);
> - Vect_destroy_boxlist(TmpList);
>
> return nfound;
> }
>
> Modified: grass/branches/releasebranch_7_4/vector/v.select/write.c
> ===================================================================
> --- grass/branches/releasebranch_7_4/vector/v.select/write.c 2018-05-16 19:42:14 UTC (rev 72714)
> +++ grass/branches/releasebranch_7_4/vector/v.select/write.c 2018-05-16 19:49:20 UTC (rev 72715)
> @@ -6,7 +6,7 @@
> struct Map_info *Out, int table_flag, int reverse_flag,
> int nfields, int *fields, int *ncats, int **cats)
> {
> - int i, f, j, aline, nalines;
> + int i, f, j, aline, nalines;
> int atype;
>
> struct line_pnts *APoints;
> @@ -59,6 +59,7 @@
>
> if (!table_flag && (IFi != NULL)) {
> for (i = 0; i < ACats->n_cats; i++) {
> + f = -1;
> for (j = 0; j < nfields; j++) { /* find field */
> if (fields[j] == ACats->field[i]) {
> f = j;
> @@ -65,8 +66,10 @@
> break;
> }
> }
> - cats[f][ncats[f]] = ACats->cat[i];
> - ncats[f]++;
> + if (f >= 0) {
> + cats[f][ncats[f]] = ACats->cat[i];
> + ncats[f]++;
> + }
> }
> }
> }
>
> _______________________________________________
> grass-commit mailing list
> grass-commit at lists.osgeo.org
> https://lists.osgeo.org/mailman/listinfo/grass-commit
--
Martin Landa
http://geo.fsv.cvut.cz/gwiki/Landa
http://gismentors.cz/mentors/landa
More information about the grass-dev
mailing list