Exemple #1
0
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;
}
Exemple #2
0
/*
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;
}