GRASS Programmer's Manual  6.4.2(2012)
spindex.c
Go to the documentation of this file.
00001 
00017 #include <stdlib.h>
00018 #include <string.h>
00019 #include <grass/gis.h>
00020 #include <grass/Vect.h>
00021 #include <grass/glocale.h>
00022 
00031 int dig_spidx_init(struct Plus_head *Plus)
00032 {
00033 
00034     G_debug(1, "dig_spidx_init()");
00035 
00036     Plus->Node_spidx = RTreeNewIndex();
00037     Plus->Line_spidx = RTreeNewIndex();
00038     Plus->Area_spidx = RTreeNewIndex();
00039     Plus->Isle_spidx = RTreeNewIndex();
00040 
00041     Plus->Node_spidx_offset = 0L;
00042     Plus->Edge_spidx_offset = 0L;
00043     Plus->Line_spidx_offset = 0L;
00044     Plus->Area_spidx_offset = 0L;
00045     Plus->Isle_spidx_offset = 0L;
00046     Plus->Volume_spidx_offset = 0L;
00047     Plus->Hole_spidx_offset = 0L;
00048 
00049     return 1;
00050 }
00051 
00057 void dig_spidx_free_nodes(struct Plus_head *Plus)
00058 {
00059     RTreeDestroyNode(Plus->Node_spidx);
00060     Plus->Node_spidx = RTreeNewIndex();
00061 }
00062 
00068 void dig_spidx_free_lines(struct Plus_head *Plus)
00069 {
00070     RTreeDestroyNode(Plus->Line_spidx);
00071     Plus->Line_spidx = RTreeNewIndex();
00072 }
00073 
00079 void dig_spidx_free_areas(struct Plus_head *Plus)
00080 {
00081     RTreeDestroyNode(Plus->Area_spidx);
00082     Plus->Area_spidx = RTreeNewIndex();
00083 }
00084 
00090 void dig_spidx_free_isles(struct Plus_head *Plus)
00091 {
00092     RTreeDestroyNode(Plus->Isle_spidx);
00093     Plus->Isle_spidx = RTreeNewIndex();
00094 }
00095 
00101 void dig_spidx_free(struct Plus_head *Plus)
00102 {
00103     dig_spidx_free_nodes(Plus);
00104     dig_spidx_free_lines(Plus);
00105     dig_spidx_free_areas(Plus);
00106     dig_spidx_free_isles(Plus);
00107 }
00108 
00119 int
00120 dig_spidx_add_node(struct Plus_head *Plus, int node,
00121                    double x, double y, double z)
00122 {
00123     struct Rect rect;
00124 
00125     G_debug(3, "dig_spidx_add_node(): node = %d, x,y,z = %f, %f, %f", node, x,
00126             y, z);
00127 
00128     rect.boundary[0] = x;
00129     rect.boundary[1] = y;
00130     rect.boundary[2] = z;
00131     rect.boundary[3] = x;
00132     rect.boundary[4] = y;
00133     rect.boundary[5] = z;
00134     RTreeInsertRect(&rect, node, &(Plus->Node_spidx), 0);
00135 
00136     return 1;
00137 }
00138 
00148 int dig_spidx_add_line(struct Plus_head *Plus, int line, BOUND_BOX * box)
00149 {
00150     struct Rect rect;
00151 
00152     G_debug(3, "dig_spidx_add_line(): line = %d", line);
00153 
00154     rect.boundary[0] = box->W;
00155     rect.boundary[1] = box->S;
00156     rect.boundary[2] = box->B;
00157     rect.boundary[3] = box->E;
00158     rect.boundary[4] = box->N;
00159     rect.boundary[5] = box->T;
00160     RTreeInsertRect(&rect, line, &(Plus->Line_spidx), 0);
00161 
00162     return 0;
00163 }
00164 
00174 int dig_spidx_add_area(struct Plus_head *Plus, int area, BOUND_BOX * box)
00175 {
00176     struct Rect rect;
00177 
00178     G_debug(3, "dig_spidx_add_area(): area = %d", area);
00179 
00180     rect.boundary[0] = box->W;
00181     rect.boundary[1] = box->S;
00182     rect.boundary[2] = box->B;
00183     rect.boundary[3] = box->E;
00184     rect.boundary[4] = box->N;
00185     rect.boundary[5] = box->T;
00186     RTreeInsertRect(&rect, area, &(Plus->Area_spidx), 0);
00187 
00188     return 0;
00189 }
00190 
00201 int dig_spidx_add_isle(struct Plus_head *Plus, int isle, BOUND_BOX * box)
00202 {
00203     struct Rect rect;
00204 
00205     G_debug(3, "dig_spidx_add_isle(): isle = %d", isle);
00206 
00207     rect.boundary[0] = box->W;
00208     rect.boundary[1] = box->S;
00209     rect.boundary[2] = box->B;
00210     rect.boundary[3] = box->E;
00211     rect.boundary[4] = box->N;
00212     rect.boundary[5] = box->T;
00213     RTreeInsertRect(&rect, isle, &(Plus->Isle_spidx), 0);
00214 
00215     return 0;
00216 }
00217 
00228 int dig_spidx_del_node(struct Plus_head *Plus, int node)
00229 {
00230     int ret;
00231     P_NODE *Node;
00232     struct Rect rect;
00233 
00234     G_debug(3, "dig_spidx_del_node(): node = %d", node);
00235 
00236     Node = Plus->Node[node];
00237 
00238     rect.boundary[0] = Node->x;
00239     rect.boundary[1] = Node->y;
00240     rect.boundary[2] = Node->z;
00241     rect.boundary[3] = Node->x;
00242     rect.boundary[4] = Node->y;
00243     rect.boundary[5] = Node->z;
00244 
00245     ret = RTreeDeleteRect(&rect, node, &(Plus->Node_spidx));
00246 
00247     if (ret)
00248         G_fatal_error(_("Unable to delete node %d from spatial index"), node);
00249 
00250     return 0;
00251 }
00252 
00263 int dig_spidx_del_line(struct Plus_head *Plus, int line)
00264 {
00265     P_LINE *Line;
00266     struct Rect rect;
00267     int ret;
00268 
00269     G_debug(3, "dig_spidx_del_line(): line = %d", line);
00270 
00271     Line = Plus->Line[line];
00272 
00273     G_debug(3, "  box(x1,y1,z1,x2,y2,z2): %f %f %f %f %f %f", Line->W,
00274             Line->S, Line->B, Line->E, Line->N, Line->T);
00275 
00276     rect.boundary[0] = Line->W;
00277     rect.boundary[1] = Line->S;
00278     rect.boundary[2] = Line->B;
00279     rect.boundary[3] = Line->E;
00280     rect.boundary[4] = Line->N;
00281     rect.boundary[5] = Line->T;
00282 
00283     ret = RTreeDeleteRect(&rect, line, &(Plus->Line_spidx));
00284 
00285     G_debug(3, "  ret = %d", ret);
00286 
00287     if (ret)
00288         G_fatal_error(_("Unable to delete line %d from spatial index"), line);
00289 
00290     return 0;
00291 }
00292 
00303 int dig_spidx_del_area(struct Plus_head *Plus, int area)
00304 {
00305     int ret;
00306     P_AREA *Area;
00307     struct Rect rect;
00308 
00309     G_debug(3, "dig_spidx_del_area(): area = %d", area);
00310 
00311     Area = Plus->Area[area];
00312 
00313     if (Area == NULL) {
00314         G_fatal_error(_("Attempt to delete sidx for dead area"));
00315     }
00316 
00317     rect.boundary[0] = Area->W;
00318     rect.boundary[1] = Area->S;
00319     rect.boundary[2] = Area->B;
00320     rect.boundary[3] = Area->E;
00321     rect.boundary[4] = Area->N;
00322     rect.boundary[5] = Area->T;
00323 
00324     ret = RTreeDeleteRect(&rect, area, &(Plus->Area_spidx));
00325 
00326     if (ret)
00327         G_fatal_error(_("Unable to delete area %d from spatial index"), area);
00328 
00329     return 0;
00330 }
00331 
00342 int dig_spidx_del_isle(struct Plus_head *Plus, int isle)
00343 {
00344     int ret;
00345     P_ISLE *Isle;
00346     struct Rect rect;
00347 
00348     G_debug(3, "dig_spidx_del_isle(): isle = %d", isle);
00349 
00350     Isle = Plus->Isle[isle];
00351 
00352     rect.boundary[0] = Isle->W;
00353     rect.boundary[1] = Isle->S;
00354     rect.boundary[2] = Isle->B;
00355     rect.boundary[3] = Isle->E;
00356     rect.boundary[4] = Isle->N;
00357     rect.boundary[5] = Isle->T;
00358 
00359     ret = RTreeDeleteRect(&rect, isle, &(Plus->Isle_spidx));
00360 
00361     if (ret)
00362         G_fatal_error(_("Unable to delete isle %d from spatial index"), isle);
00363 
00364     return 0;
00365 }
00366 
00367 /* This function is called by  RTreeSearch() to add selected node/line/area/isle to thelist */
00368 static int _add_item(int id, struct ilist *list)
00369 {
00370     dig_list_add(list, id);
00371     return 1;
00372 }
00373 
00384 int
00385 dig_select_nodes(struct Plus_head *Plus, BOUND_BOX * box, struct ilist *list)
00386 {
00387     struct Rect rect;
00388 
00389     G_debug(3, "dig_select_nodes()");
00390 
00391     list->n_values = 0;
00392 
00393     rect.boundary[0] = box->W;
00394     rect.boundary[1] = box->S;
00395     rect.boundary[2] = box->B;
00396     rect.boundary[3] = box->E;
00397     rect.boundary[4] = box->N;
00398     rect.boundary[5] = box->T;
00399     RTreeSearch(Plus->Node_spidx, &rect, (void *)_add_item, list);
00400 
00401     return (list->n_values);
00402 }
00403 
00404 /* This function is called by  RTreeSearch() for nodes to add selected node to list */
00405 static int _add_node(int id, int *node)
00406 {
00407     *node = id;
00408     return 0;
00409 }
00410 
00420 int dig_find_node(struct Plus_head *Plus, double x, double y, double z)
00421 {
00422     struct Rect rect;
00423     struct ilist list;
00424     int node;
00425 
00426     G_debug(3, "dig_find_node()");
00427 
00428     dig_init_list(&list);
00429 
00430     rect.boundary[0] = x;
00431     rect.boundary[1] = y;
00432     rect.boundary[2] = z;
00433     rect.boundary[3] = x;
00434     rect.boundary[4] = y;
00435     rect.boundary[5] = z;
00436 
00437     node = 0;
00438     RTreeSearch(Plus->Node_spidx, &rect, (void *)_add_node, &node);
00439 
00440     return node;
00441 }
00442 
00452 int
00453 dig_select_lines(struct Plus_head *Plus, BOUND_BOX * box, struct ilist *list)
00454 {
00455     struct Rect rect;
00456 
00457     G_debug(3, "dig_select_lines()");
00458 
00459     list->n_values = 0;
00460 
00461     rect.boundary[0] = box->W;
00462     rect.boundary[1] = box->S;
00463     rect.boundary[2] = box->B;
00464     rect.boundary[3] = box->E;
00465     rect.boundary[4] = box->N;
00466     rect.boundary[5] = box->T;
00467     RTreeSearch(Plus->Line_spidx, &rect, (void *)_add_item, list);
00468 
00469     return (list->n_values);
00470 }
00471 
00481 int
00482 dig_select_areas(struct Plus_head *Plus, BOUND_BOX * box, struct ilist *list)
00483 {
00484     struct Rect rect;
00485 
00486     G_debug(3, "dig_select_areas()");
00487 
00488     list->n_values = 0;
00489 
00490     rect.boundary[0] = box->W;
00491     rect.boundary[1] = box->S;
00492     rect.boundary[2] = box->B;
00493     rect.boundary[3] = box->E;
00494     rect.boundary[4] = box->N;
00495     rect.boundary[5] = box->T;
00496     RTreeSearch(Plus->Area_spidx, &rect, (void *)_add_item, list);
00497 
00498     return (list->n_values);
00499 }
00500 
00510 int
00511 dig_select_isles(struct Plus_head *Plus, BOUND_BOX * box, struct ilist *list)
00512 {
00513     struct Rect rect;
00514 
00515     G_debug(3, "dig_select_isles()");
00516 
00517     list->n_values = 0;
00518 
00519     rect.boundary[0] = box->W;
00520     rect.boundary[1] = box->S;
00521     rect.boundary[2] = box->B;
00522     rect.boundary[3] = box->E;
00523     rect.boundary[4] = box->N;
00524     rect.boundary[5] = box->T;
00525     RTreeSearch(Plus->Isle_spidx, &rect, (void *)_add_item, list);
00526 
00527     return (list->n_values);
00528 }
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines