GRASS Programmer's Manual
6.4.1(2011)
|
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 }