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
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
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 }