Handle<Value> LayerFields::remove(const Arguments& args) { HandleScope scope; Handle<Object> parent = args.This()->GetHiddenValue(String::NewSymbol("parent_"))->ToObject(); Layer *layer = ObjectWrap::Unwrap<Layer>(parent); if (!layer->get()) { return NODE_THROW("Layer object already destroyed"); } if (args.Length() < 1) { return NODE_THROW("Field index or name must be given"); } OGRFeatureDefn *def = layer->get()->GetLayerDefn(); if (!def) { return NODE_THROW("Layer has no layer definition set"); } int field_index; ARG_FIELD_ID(0, def, field_index); int err = layer->get()->DeleteField(field_index); if (err) { return NODE_THROW_OGRERR(err); } return Undefined(); }
Handle<Value> Geometry::createFromWkb(const Arguments &args) { HandleScope scope; std::string wkb_string; SpatialReference *srs = NULL; Handle<Object> wkb_obj; NODE_ARG_OBJECT(0, "wkb", wkb_obj); NODE_ARG_WRAPPED_OPT(1, "srs", SpatialReference, srs); std::string obj_type = TOSTR(wkb_obj->GetConstructorName()); if(obj_type != "Buffer"){ return NODE_THROW("Argument must be a buffer object"); } unsigned char* data = (unsigned char *) Buffer::Data(wkb_obj); size_t length = Buffer::Length(wkb_obj); OGRGeometry *geom = NULL; OGRSpatialReference *ogr_srs = NULL; if (srs) { ogr_srs = srs->get(); } OGRErr err = OGRGeometryFactory::createFromWkb(data, ogr_srs, &geom, length); if (err) { return NODE_THROW_OGRERR(err); } return scope.Close(Geometry::New(geom, true)); }
Handle<Value> LayerFields::add(const Arguments& args) { HandleScope scope; Handle<Object> parent = args.This()->GetHiddenValue(String::NewSymbol("parent_"))->ToObject(); Layer *layer = ObjectWrap::Unwrap<Layer>(parent); if (!layer->get()) { return NODE_THROW("Layer object already destroyed"); } if (args.Length() < 1) { return NODE_THROW("field definition(s) must be given"); } FieldDefn *field_def; int err; bool approx = true; NODE_ARG_BOOL_OPT(1, "approx", approx); if (args[0]->IsArray()) { Handle<Array> array = Handle<Array>::Cast(args[0]); int n = array->Length(); for (int i = 0; i < n; i++) { Handle<Value> element = array->Get(i); if (IS_WRAPPED(element, FieldDefn)) { field_def = ObjectWrap::Unwrap<FieldDefn>(element->ToObject()); err = layer->get()->CreateField(field_def->get(), approx); if (err) { return NODE_THROW_OGRERR(err); } } else { return NODE_THROW("All array elements must be FieldDefn objects"); } } } else if (IS_WRAPPED(args[0], FieldDefn)) { field_def = ObjectWrap::Unwrap<FieldDefn>(args[0]->ToObject()); err = layer->get()->CreateField(field_def->get(), approx); if (err) { return NODE_THROW_OGRERR(err); } } else { return NODE_THROW("field definition(s) must be a FieldDefn object or array of FieldDefn objects"); } return Undefined(); }
Handle<Value> Geometry::exportToWKB(const Arguments& args) { HandleScope scope; Geometry *geom = ObjectWrap::Unwrap<Geometry>(args.This()); int size = geom->this_->WkbSize(); unsigned char *data = (unsigned char*) malloc(size); //byte order OGRwkbByteOrder byte_order; std::string order = "MSB"; NODE_ARG_OPT_STR(0, "byte order", order); if (order == "MSB") { byte_order = wkbXDR; } else if (order == "LSB") { byte_order = wkbNDR; } else { return NODE_THROW("byte order must be 'MSB' or 'LSB'"); } #if GDAL_VERSION_NUM > 1100000 //wkb variant OGRwkbVariant wkb_variant; std::string variant = "OGC"; NODE_ARG_OPT_STR(1, "wkb variant", variant); if (variant == "OGC") { wkb_variant = wkbVariantOgc; } else if (order == "ISO") { wkb_variant = wkbVariantIso; } else { return NODE_THROW("byte order must be 'OGC' or 'ISO'"); } OGRErr err = geom->this_->exportToWkb(byte_order, data, wkb_variant); #else OGRErr err = geom->this_->exportToWkb(byte_order, data); #endif //^^ export to wkb and fill buffer ^^ //TODO: avoid extra memcpy in FastBuffer::New and have exportToWkb write directly into buffer if (err) { free(data); return NODE_THROW_OGRERR(err); } Handle<Value> result = FastBuffer::New(data, size); free(data); return scope.Close(result); }
Handle<Value> LayerFields::reorder(const Arguments& args) { HandleScope scope; Handle<Object> parent = args.This()->GetHiddenValue(String::NewSymbol("parent_"))->ToObject(); Layer *layer = ObjectWrap::Unwrap<Layer>(parent); if (!layer->get()) { return NODE_THROW("Layer object already destroyed"); } OGRFeatureDefn *def = layer->get()->GetLayerDefn(); if (!def) { return NODE_THROW("Layer has no layer definition set"); } Handle<Array> field_map = Array::New(0); NODE_ARG_ARRAY(0, "field map", field_map); int n = def->GetFieldCount(); OGRErr err = 0; if ((int)field_map->Length() != n) { return NODE_THROW("Array length must match field count"); } int *field_map_array = new int[n]; for (int i = 0; i < n; i++) { Handle<Value> val = field_map->Get(i); if (!val->IsNumber()) { delete [] field_map_array; return NODE_THROW("Array must only contain integers"); } int key = val->IntegerValue(); if (key < 0 || key >= n) { delete [] field_map_array; return NODE_THROW("Values must be between 0 and field count - 1"); } field_map_array[i] = key; } err = layer->get()->ReorderFields(field_map_array); delete [] field_map_array; if (err) { return NODE_THROW_OGRERR(err); } return Undefined(); }
Handle<Value> Geometry::exportToWKT(const Arguments& args) { HandleScope scope; Geometry *geom = ObjectWrap::Unwrap<Geometry>(args.This()); char *text = NULL; OGRErr err = geom->this_->exportToWkt(&text); if (err) { return NODE_THROW_OGRERR(err); } if (text) { return scope.Close(SafeString::New(text)); } return Undefined(); }
Handle<Value> Geometry::createFromWkt(const Arguments &args) { HandleScope scope; std::string wkt_string; SpatialReference *srs = NULL; NODE_ARG_STR(0, "wkt", wkt_string); NODE_ARG_WRAPPED_OPT(1, "srs", SpatialReference, srs); char *wkt = (char*) wkt_string.c_str(); OGRGeometry *geom = NULL; OGRSpatialReference *ogr_srs = NULL; if (srs) { ogr_srs = srs->get(); } OGRErr err = OGRGeometryFactory::createFromWkt(&wkt, ogr_srs, &geom); if (err) { return NODE_THROW_OGRERR(err); } return scope.Close(Geometry::New(geom, true)); }