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? }
/* 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"); }