geos.c 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124
  1. #include <grass/gis.h>
  2. #include <grass/dbmi.h>
  3. #include <grass/vector.h>
  4. #include <grass/glocale.h>
  5. #include "proto.h"
  6. #ifdef HAVE_GEOS
  7. static int relate_geos(struct Map_info *, const GEOSGeometry *,
  8. int, int, const char *, int);
  9. int line_relate_geos(struct Map_info *AIn, const GEOSGeometry *BGeom,
  10. int aline, int operator, const char *relate)
  11. {
  12. return relate_geos(AIn, BGeom, aline, operator, relate, 0);
  13. }
  14. int area_relate_geos(struct Map_info *AIn, const GEOSGeometry *BGeom,
  15. int aarea, int operator, const char *relate)
  16. {
  17. return relate_geos(AIn, BGeom, aarea, operator, relate, 1);
  18. }
  19. int relate_geos(struct Map_info *AIn, const GEOSGeometry *BGeom,
  20. int afid, int operator, const char *relate, int area)
  21. {
  22. GEOSGeometry *AGeom = NULL;
  23. int found;
  24. found = 0;
  25. if (area)
  26. AGeom = Vect_read_area_geos(AIn, afid);
  27. else
  28. AGeom = Vect_read_line_geos(AIn, afid, NULL);
  29. if (!AGeom)
  30. return 0;
  31. /*
  32. if (!BGeom) {
  33. if (area)
  34. G_fatal_error(_("Unable to read area id %d from vector map <%s>"),
  35. bfid, Vect_get_full_name(BIn));
  36. else
  37. G_fatal_error(_("Unable to read line id %d from vector map <%s>"),
  38. bfid, Vect_get_full_name(BIn));
  39. }
  40. */
  41. switch (operator) {
  42. case OP_EQUALS:{
  43. if (GEOSEquals(AGeom, BGeom)) {
  44. found = 1;
  45. break;
  46. }
  47. break;
  48. }
  49. case OP_DISJOINT:{
  50. if (GEOSDisjoint(AGeom, BGeom)) {
  51. found = 1;
  52. break;
  53. }
  54. break;
  55. }
  56. case OP_INTERSECTS:{
  57. if (GEOSIntersects(AGeom, BGeom)) {
  58. found = 1;
  59. break;
  60. }
  61. break;
  62. }
  63. case OP_TOUCHES:{
  64. if (GEOSTouches(AGeom, BGeom)) {
  65. found = 1;
  66. break;
  67. }
  68. break;
  69. }
  70. case OP_CROSSES:{
  71. if (GEOSCrosses(AGeom, BGeom)) {
  72. found = 1;
  73. break;
  74. }
  75. break;
  76. }
  77. case OP_WITHIN:{
  78. if (GEOSWithin(AGeom, BGeom)) {
  79. found = 1;
  80. break;
  81. }
  82. break;
  83. }
  84. case OP_CONTAINS:{
  85. if (GEOSContains(AGeom, BGeom)) {
  86. found = 1;
  87. break;
  88. }
  89. break;
  90. }
  91. case OP_OVERLAPS:{
  92. if (GEOSOverlaps(AGeom, BGeom)) {
  93. found = 1;
  94. break;
  95. }
  96. break;
  97. }
  98. case OP_RELATE:{
  99. if (GEOSRelatePattern(AGeom, BGeom, relate)) {
  100. found = 1;
  101. break;
  102. }
  103. break;
  104. }
  105. default:
  106. break;
  107. }
  108. if (AGeom)
  109. GEOSGeom_destroy(AGeom);
  110. return found;
  111. }
  112. #endif /* HAVE_GEOS */