예제 #1
0
Handle<Value> StrTree::Insert(const Arguments& args) {
    HandleScope scope;
    if(args.Length() == 0) {
        return ThrowException(String::New("nothing to insert."));
    }

    Local<Object> o = args[1]->ToObject();
    StrTree* strTree = ObjectWrap::Unwrap<StrTree>(args.This());
    //TODO check if input is geometry object
    Geometry *geom = ObjectWrap::Unwrap<Geometry>(args[0]->ToObject());
    GEOSGeometry *g = geom->GetGEOSGeometry();
    //TODO handle userdata
    bucket *b = new bucket();
    b->o = o;
    GEOSSTRtree_insert(strTree->geos_strTree_, g, b);

    return Undefined(); //return nothing and close scope?

}
예제 #2
0
/*
extern void GEOS_DLL GEOSSTRtree_insert(GEOSSTRtree *tree,
                                        const GEOSGeometry *g,
                                        void *item);

GeosSTRtree = lgeo_geos_index:strtree_create(),
Element = {element, 1},
Geom = lgeo_geos_index:to_geom({'LineString', [[4,4], [4.5, 4.5], [10,10]]}),
lgeo_geos_index:strtree_insert(GeosSTRtree, Geom, Element).
ok
*/
static ERL_NIF_TERM
strtree_insert(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);
    }
    ERL_NIF_TERM copy = enif_make_copy((**tree).env, argv[2]);
    GEOSSTRtree_insert((**tree).tree, GEOSEnvelope(*geom), (void *)copy);
    return enif_make_atom(env, "ok");
}