[GRASS-SVN] r62091 - grass/trunk/vector/v.select
svn_grass at osgeo.org
svn_grass at osgeo.org
Fri Sep 26 05:52:24 PDT 2014
Author: mmetz
Date: 2014-09-26 05:52:24 -0700 (Fri, 26 Sep 2014)
New Revision: 62091
Modified:
grass/trunk/vector/v.select/overlap.c
grass/trunk/vector/v.select/proto.h
grass/trunk/vector/v.select/select.c
Log:
v.select: speed up OP_OVERLAP
Modified: grass/trunk/vector/v.select/overlap.c
===================================================================
--- grass/trunk/vector/v.select/overlap.c 2014-09-26 12:47:11 UTC (rev 62090)
+++ grass/trunk/vector/v.select/overlap.c 2014-09-26 12:52:24 UTC (rev 62091)
@@ -38,28 +38,55 @@
/* Returns 1 if line1 from Map1 overlaps area2 from Map2,
* 0 otherwise */
-int line_overlap_area(struct Map_info *LMap, int line, struct Map_info *AMap,
- int area, struct bound_box box)
+int line_overlap_area(struct line_pnts *LPoints, struct Map_info *AMap,
+ int area)
{
int i, nisles, isle;
- static struct line_pnts *LPoints = NULL;
static struct line_pnts *APoints = NULL;
+ static struct line_pnts **IPoints = NULL;
+ static int isles_alloc = 0;
- G_debug(4, "line_overlap_area line = %d area = %d", line, area);
+ G_debug(4, "line_overlap_area area = %d", area);
- if (!LPoints) {
- LPoints = Vect_new_line_struct();
+ 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();
}
- /* Read line coordinates */
- Vect_read_line(LMap, LPoints, NULL, line);
+ 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_area(LPoints->x[i], LPoints->y[i], AMap, area, &box)) {
- G_debug(4, " -> line vertex inside area");
- return 1;
+
+ if (Vect_point_in_poly(LPoints->x[i], LPoints->y[i], APoints)) {
+ int inside = 1;
+
+ for (isle = 0; isle < nisles; isle++) {
+ if (Vect_point_in_poly(LPoints->x[i], LPoints->y[i], IPoints[isle])) {
+ inside = 0;
+ break;
+ }
+ }
+ if (inside) {
+ G_debug(4, " -> line vertex inside area");
+ return 1;
+ }
}
}
@@ -69,20 +96,15 @@
/* Try intersections of line with area/isles boundary */
/* Outer boundary */
- Vect_get_area_points(AMap, area, APoints);
- if (Vect_line_check_intersection(LPoints, APoints, 0)) {
+ if (Vect_line_check_intersection2(LPoints, APoints, 0)) {
G_debug(4, " -> line intersects outer area boundary");
return 1;
}
- nisles = Vect_get_area_num_isles(AMap, area);
-
for (i = 0; i < nisles; i++) {
- isle = Vect_get_area_isle(AMap, area, i);
- Vect_get_isle_points(AMap, isle, APoints);
- if (Vect_line_check_intersection(LPoints, APoints, 0)) {
+ if (Vect_line_check_intersection2(LPoints, IPoints[i], 0)) {
G_debug(4, " -> line intersects area island boundary");
return 1;
}
Modified: grass/trunk/vector/v.select/proto.h
===================================================================
--- grass/trunk/vector/v.select/proto.h 2014-09-26 12:47:11 UTC (rev 62090)
+++ grass/trunk/vector/v.select/proto.h 2014-09-26 12:52:24 UTC (rev 62091)
@@ -42,7 +42,7 @@
/* overlap.c */
void add_aarea(struct Map_info *, int, int *);
-int line_overlap_area(struct Map_info *, int, struct Map_info *, int, struct bound_box);
+int line_overlap_area(struct line_pnts *, struct Map_info *, int);
/* write.c */
void write_lines(struct Map_info *, struct field_info *, int *,
Modified: grass/trunk/vector/v.select/select.c
===================================================================
--- grass/trunk/vector/v.select/select.c 2014-09-26 12:47:11 UTC (rev 62090)
+++ grass/trunk/vector/v.select/select.c 2014-09-26 12:52:24 UTC (rev 62091)
@@ -34,15 +34,12 @@
LList = Vect_new_list();
nalines = Vect_get_num_lines(aIn);
- if (operator == OP_OVERLAP)
- G_message("Using GRASS GIS operator...");
- else
- G_message("Using GEOS operator...");
/* Lines in A. Go through all lines and mark those that meets condition */
if (atype & (GV_POINTS | GV_LINES)) {
G_message(_("Processing features..."));
+ G_percent(0, nalines, 2);
for (aline = 1; aline <= nalines; aline++) {
struct bound_box abox;
@@ -109,7 +106,7 @@
else {
Vect_read_line(bIn, BPoints, NULL, bline);
- if (Vect_line_check_intersection(APoints, BPoints, 0)) {
+ if (Vect_line_check_intersection2(APoints, BPoints, 0)) {
found = 1;
break;
}
@@ -147,7 +144,7 @@
#endif
}
else {
- if (line_overlap_area(aIn, aline, bIn, barea, List->box[i])) {
+ if (line_overlap_area(APoints, bIn, barea)) {
ALines[aline] = 1;
break;
}
@@ -171,10 +168,11 @@
naareas = Vect_get_num_areas(aIn);
+ G_percent(0, naareas, 2);
for (aarea = 1; aarea <= naareas; aarea++) {
struct bound_box abox;
- G_percent(aarea, naareas, 2); /* must be before any continue */
+ G_percent(aarea, naareas, 1);
if (Vect_get_area_cat(aIn, aarea, afield) < 0) {
nskipped++;
@@ -219,7 +217,9 @@
#endif
}
else {
- if (line_overlap_area(bIn, bline, aIn, aarea, abox)) {
+ Vect_read_line(bIn, BPoints, NULL, bline);
+
+ if (line_overlap_area(BPoints, aIn, aarea)) {
add_aarea(aIn, aarea, ALines);
continue;
}
@@ -261,6 +261,7 @@
int j;
aline = abs(LList->value[i]);
+ Vect_read_line(aIn, APoints, NULL, aline);
for (j = 0; j < TmpList->n_values; j++) {
int barea, bcentroid;
@@ -302,8 +303,7 @@
}
/* Check intersectin of lines from List with area B */
- if (line_overlap_area(aIn, aline,
- bIn, barea, TmpList->box[j])) {
+ if (line_overlap_area(APoints, bIn, barea)) {
found = 1;
break;
}
More information about the grass-commit
mailing list