long long msudf_disjoint(UDF_INIT *initid,UDF_ARGS *args,char *is_null, char *error) { GEOSGeom geom1,geom2; long long result; DEBUG("msudf_disjoint"); geom1 = msudf_getGeometry((unsigned char *)args->args[0],args->lengths[0]); if (geom1 == NULL) { strcpy(error,"Invalid geometry."); *is_null = 1; return 0; } geom2 = msudf_getGeometry((unsigned char *)args->args[1],args->lengths[1]); if (geom2 == NULL) { strcpy(error,"Invalid geometry."); *is_null = 1; return 0; } result = GEOSDisjoint(geom1,geom2); if (geom1 != NULL) GEOSGeom_destroy(geom1); if (geom2 != NULL) GEOSGeom_destroy(geom2); if (result >1) { *is_null = 1; return 0; } else { return result; } }
/* ** Are shape1 and shape2 disjoint, returns MS_TRUE/MS_FALSE or -1 for an error. */ int msGEOSDisjoint(shapeObj *shape1, shapeObj *shape2) { #ifdef USE_GEOS GEOSGeom g1, g2; int result; if(!shape1 || !shape2) return -1; if(!shape1->geometry) /* if no geometry for shape1 then build one */ shape1->geometry = (GEOSGeom) msGEOSShape2Geometry(shape1); g1 = (GEOSGeom) shape1->geometry; if(!g1) return -1; if(!shape2->geometry) /* if no geometry for shape2 then build one */ shape2->geometry = (GEOSGeom) msGEOSShape2Geometry(shape2); g2 = (GEOSGeom) shape2->geometry; if(!g2) return -1; result = GEOSDisjoint(g1, g2); return ((result==2) ? -1 : result); #else msSetError(MS_GEOSERR, "GEOS support is not available.", "msGEOSDisjoint()"); return -1; #endif }
static ERL_NIF_TERM disjoint(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[]) { GEOSGeometry **geom1; GEOSGeometry **geom2; if(!enif_get_resource(env, argv[0], GEOSGEOM_RESOURCE, (void**)&geom1)) { return 0; } if(!enif_get_resource(env, argv[1], GEOSGEOM_RESOURCE, (void**)&geom2)) { return 0; } if (GEOSDisjoint(*geom1, *geom2)) { return enif_make_atom(env, "true"); } else { return enif_make_atom(env, "false"); } }