static ERL_NIF_TERM to_geom(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[]) { ERL_NIF_TERM eterm; GEOSGeometry **geom = enif_alloc_resource(GEOSGEOM_RESOURCE, sizeof(GEOSGeometry*)); *geom = eterm_to_geom(env, argv); eterm = enif_make_resource(env, geom); enif_release_resource(geom); return eterm; }
/* extern void GEOS_DLL GEOSSTRtree_query(GEOSSTRtree *tree, const GEOSGeometry *g, GEOSQueryCallback callback, void *userdata); GeosSTRtree = lgeo_geos_index:strtree_create(), Element1 = {'LineString', [[4.0,4.0], [4.5, 4.5], [10.0,10.0]]}, Element2 = 17.0, Element3 = ["hola"], Geom = lgeo_geos_index:to_geom(Element1), lgeo_geos_index:strtree_insert(GeosSTRtree, Geom, Element1), lgeo_geos_index:strtree_insert(GeosSTRtree, Geom, Element2), lgeo_geos_index:strtree_insert(GeosSTRtree, Geom, Element3), lgeo_geos_index:strtree_query(GeosSTRtree, Geom). [Element1, Element2, Element3] */ static ERL_NIF_TERM strtree_query(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[]) { GeosSTRtree_t **tree; GEOSGeometry **geom; ERL_NIF_TERM eterm; if (argc != 2) { return enif_make_badarg(env); } if(!enif_get_resource(env, argv[0], GEOSSTRTREE_RESOURCE, (void**)&tree)) { return enif_make_badarg(env); } if(!enif_get_resource(env, argv[1], GEOSGEOM_RESOURCE, (void**)&geom)) { return enif_make_badarg(env); } int size = 128; ERL_NIF_TERM *arr = (ERL_NIF_TERM *) enif_alloc(sizeof(ERL_NIF_TERM)*size); GeosSTRtree_acc_t acc = {.count=0, .size=size, .elements=arr}; GEOSSTRtree_query((**tree).tree, *geom, geosstrtree_cb, &acc); eterm = enif_make_list_from_array(env, acc.elements, acc.count); enif_free(arr); return eterm; } /* extern void GEOS_DLL GEOSSTRtree_iterate(GEOSSTRtree *tree, GEOSQueryCallback callback, void *userdata); */ static ERL_NIF_TERM strtree_iterate(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[]) { GeosSTRtree_t **tree; ERL_NIF_TERM eterm; if (argc != 1) { return enif_make_badarg(env); } if(!enif_get_resource(env, argv[0], GEOSSTRTREE_RESOURCE, (void**)&tree)) { return enif_make_badarg(env); } int size = 128; ERL_NIF_TERM *arr = (ERL_NIF_TERM *) enif_alloc(sizeof(ERL_NIF_TERM)*size); GeosSTRtree_acc_t acc = {.count=0, .size=size, .elements=arr}; GEOSSTRtree_iterate((**tree).tree, geosstrtree_cb, &acc); eterm = enif_make_list_from_array(env, acc.elements, acc.count); enif_free(arr); return eterm; } /* //Removed until know how to compare two terms from diferent environments if possible //insert saves a copy and remove needs that copy to work extern char GEOS_DLL GEOSSTRtree_remove(GEOSSTRtree *tree, const GEOSGeometry *g, void *item); //GeosSTRtree = lgeo_geos_index:strtree_create(), //Ls1 = {'LineString', [[3.0,3.0],[6.0,6.0]]}, //Geom1 = lgeo_geos_index:to_geom(Ls1), //lgeo_geos_index:strtree_insert(GeosSTRtree, Geom1, Ls1), //lgeo_geos_index:strtree_remove(GeosSTRtree, Geom1, Ls1), //Geoms = lgeo_geos_index:strtree_query(GeosSTRtree, Geom1). //[] static ERL_NIF_TERM strtree_remove(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[]) { GeosSTRtree_t **tree; GEOSGeometry **geom; if (argc != 3) { return enif_make_badarg(env); } if(!enif_get_resource(env, argv[0], GEOSSTRTREE_RESOURCE, (void**)&tree)) { return enif_make_badarg(env); } if(!enif_get_resource(env, argv[1], GEOSGEOM_RESOURCE, (void**)&geom)) { return enif_make_badarg(env); } char remove = \ GEOSSTRtree_remove((**tree).tree, GEOSEnvelope(*geom), (void*)argv[2]); //printf("Rtree remove: %d.\n", remove); if (remove == 0) { return enif_make_tuple2(env, enif_make_atom(env, "ok"), enif_make_atom(env, "false")); } else if (remove == 1) { return enif_make_tuple2(env, enif_make_atom(env, "ok"), enif_make_atom(env, "true")); } else { return enif_make_tuple2(env, enif_make_atom(env, "error"), enif_make_atom(env, "undefined")); } } */ /************************************************************************ * * Erlang-GEOS Translation * ***********************************************************************/ static ERL_NIF_TERM to_geom(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[]) { ERL_NIF_TERM eterm; GEOSGeometry **geom = \ enif_alloc_resource(GEOSGEOM_RESOURCE, sizeof(GEOSGeometry*)); *geom = eterm_to_geom(env, argv); eterm = enif_make_resource(env, geom); enif_release_resource(geom); return eterm; }