[GRASS-SVN] r72714 - grass/trunk/vector/v.select
svn_grass at osgeo.org
svn_grass at osgeo.org
Wed May 16 12:42:14 PDT 2018
Author: mmetz
Date: 2018-05-16 12:42:14 -0700 (Wed, 16 May 2018)
New Revision: 72714
Modified:
grass/trunk/vector/v.select/select.c
Log:
v.select: improve processing speed
Modified: grass/trunk/vector/v.select/select.c
===================================================================
--- grass/trunk/vector/v.select/select.c 2018-05-16 08:07:57 UTC (rev 72713)
+++ grass/trunk/vector/v.select/select.c 2018-05-16 19:42:14 UTC (rev 72714)
@@ -52,8 +52,13 @@
struct bound_box bbox;
G_debug(3, "bline = %d", bline);
- G_percent(bline, nblines, 2); /* must be before any continue */
+ 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(bIn, bline, bfield) < 0) {
nskipped[1]++;
@@ -60,22 +65,8 @@
continue;
}
- /* Read line and check type */
- if (operator != OP_OVERLAP) {
-#ifdef HAVE_GEOS
- BGeom = Vect_read_line_geos(bIn, bline, <ype);
-#endif
- if (!BGeom)
- G_fatal_error(_("Unable to read line id %d from vector map <%s>"),
- bline, Vect_get_full_name(bIn));
- }
- else {
- ltype = Vect_read_line(bIn, BPoints, NULL, bline);
- }
-
- if (!(ltype & btype))
- continue;
-
+ Vect_reset_line(BPoints);
+
Vect_get_line_box(bIn, bline, &bbox);
/* Check if this line overlaps any feature in A */
@@ -92,7 +83,12 @@
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(aIn, aline, afield) < 0) {
@@ -102,6 +98,12 @@
if (operator != OP_OVERLAP) {
#ifdef HAVE_GEOS
+ 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 (line_relate_geos(aIn, BGeom, aline,
operator, relate)) {
ALines[aline] = 1;
@@ -110,6 +112,8 @@
#endif
}
else {
+ if (BPoints->n_points == 0)
+ Vect_read_line(bIn, BPoints, NULL, bline);
Vect_read_line(aIn, APoints, NULL, aline);
if (Vect_line_check_intersection2(BPoints, APoints, 0)) {
@@ -144,6 +148,12 @@
if (operator != OP_OVERLAP) {
#ifdef HAVE_GEOS
+ 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);
@@ -152,6 +162,8 @@
#endif
}
else {
+ 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) {
@@ -173,7 +185,7 @@
}
}
#ifdef HAVE_GEOS
- if (operator != OP_OVERLAP) {
+ if (BGeom != NULL) {
GEOSGeom_destroy(BGeom);
BGeom = NULL;
}
@@ -189,11 +201,11 @@
nbareas = Vect_get_num_areas(bIn);
- G_percent(0, nbareas, 2);
+ G_percent(0, nbareas, 1);
for (barea = 1; barea <= nbareas; barea++) {
struct bound_box bbox;
- G_percent(barea, nbareas, 1);
+ G_percent(barea, nbareas, 2);
if ((bcentroid = Vect_get_area_centroid(bIn, barea)) < 1)
continue;
@@ -204,35 +216,12 @@
continue;
}
- Vect_read_line(bIn, BPoints, NULL, bcentroid);
+ Vect_reset_line(BPoints);
Vect_get_area_box(bIn, barea, &bbox);
bbox.T = PORT_DOUBLE_MAX;
bbox.B = -PORT_DOUBLE_MAX;
- if (operator != OP_OVERLAP) {
-#ifdef HAVE_GEOS
- BGeom = Vect_read_area_geos(bIn, barea);
-#endif
- if (!BGeom)
- G_fatal_error(_("Unable to read area id %d from vector map <%s>"),
- barea, Vect_get_full_name(bIn));
- }
- else {
- 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]);
- }
- }
-
/* x Lines in A */
if (atype & (GV_POINTS | GV_LINES)) {
Vect_select_lines_by_box(aIn, &bbox, atype, List);
@@ -244,6 +233,11 @@
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(aIn, aline, afield) < 0) {
nskipped[0]++;
@@ -252,6 +246,11 @@
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 (line_relate_geos(aIn, BGeom, aline,
operator, relate)) {
ALines[aline] = 1;
@@ -260,6 +259,22 @@
#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_read_line(aIn, APoints, NULL, aline);
if (line_overlap_area(APoints, OPoints, IPoints, nisles)) {
@@ -297,6 +312,11 @@
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;
@@ -304,6 +324,22 @@
#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]);
+ }
+ }
+
/* A inside B ? */
Vect_read_line(aIn, APoints, NULL, acentroid);
if (line_overlap_area(APoints, OPoints, IPoints, nisles)) {
@@ -364,7 +400,7 @@
}
}
#ifdef HAVE_GEOS
- if (operator != OP_OVERLAP) {
+ if (BGeom != NULL) {
GEOSGeom_destroy(BGeom);
BGeom = NULL;
}
More information about the grass-commit
mailing list