Example #1
0
static VALUE method_geometry_buffer(VALUE self, VALUE distance)
{
  VALUE result = Qnil;
  RGeo_GeometryData* self_data = RGEO_GEOMETRY_DATA_PTR(self);
  const GEOSGeometry* self_geom = self_data->geom;
  if (self_geom) {
    VALUE factory = self_data->factory;
    int resolution = NUM2INT(RGEO_FACTORY_DATA_PTR(factory)->buffer_resolution);
    result = rgeo_wrap_geos_geometry(factory, GEOSBuffer_r(self_data->geos_context, self_geom, rb_num2dbl(distance), resolution), Qnil);
  }
  return result;
}
static void ST_Buffer(sqlite3_context *context, int nbArgs, sqlite3_value **args) {
  GEOS_START(context);
  GEOS_GET_GEOM(g1, args, 0);
  double distance = sqlite3_value_double(args[1]);
  if (g1 == NULL) {
    if (error_count(&error) > 0) {
      sqlite3_result_error(context, error_message(&error), -1);
    } else {
      sqlite3_result_null(context);
    }
    return;
  }

  GEOSGeometry *result = GEOSBuffer_r(GEOS_HANDLE, g1->geometry, distance, DEFAULT_QUADRANT_SEGMENTS);
  if (result != NULL) {
    set_geos_geom_result(context, GEOS_CONTEXT, result, &error);
    GEOSGeom_destroy_r( GEOS_HANDLE, result );
  } else {
    geom_geos_get_error(&error);
    sqlite3_result_error(context, error_message(&error), -1);
  }
  GEOS_FREE_GEOM( g1, 0 );
}