Esempio n. 1
0
static VALUE method_factory_write_for_marshal(VALUE self, VALUE obj)
{
  RGeo_FactoryData* self_data;
  GEOSContextHandle_t self_context;
  GEOSWKBWriter* wkb_writer;
  const GEOSGeometry* geom;
  VALUE result;
  char* str;
  size_t size;
  char has_3d;
#ifndef RGEO_GEOS_SUPPORTS_SETOUTPUTDIMENSION
  RGeo_Globals* globals;
  VALUE wkb_generator;
#endif

  self_data = RGEO_FACTORY_DATA_PTR(self);
  self_context = self_data->geos_context;
  has_3d = self_data->flags & RGEO_FACTORYFLAGS_SUPPORTS_Z_OR_M;
#ifndef RGEO_GEOS_SUPPORTS_SETOUTPUTDIMENSION
  if (has_3d) {
    globals = self_data->globals;
    wkb_generator = globals->marshal_wkb_generator;
    if (NIL_P(wkb_generator)) {
      wkb_generator = rb_funcall(
        rb_const_get_at(globals->geos_module, rb_intern("Utils")),
        rb_intern("marshal_wkb_generator"), 0);
      globals->marshal_wkb_generator = wkb_generator;
    }
    return rb_funcall(wkb_generator, globals->id_generate, 1, obj);
  }
#endif
  wkb_writer = self_data->marshal_wkb_writer;
  if (!wkb_writer) {
    wkb_writer = GEOSWKBWriter_create_r(self_context);
    if (has_3d) {
      GEOSWKBWriter_setOutputDimension_r(self_context, wkb_writer, 3);
    }
    self_data->marshal_wkb_writer = wkb_writer;
  }
  result = Qnil;
  if (wkb_writer) {
    geom = rgeo_get_geos_geometry_safe(obj);
    if (geom) {
      str = (char*)GEOSWKBWriter_write_r(self_context, wkb_writer, geom, &size);
      if (str) {
        result = rb_str_new(str, size);
        GEOSFree_r(self_context, str);
      }
    }
  }
  return result;
}
Esempio n. 2
0
static VALUE method_geometry_as_binary(VALUE self)
{
  VALUE result = Qnil;
  RGeo_GeometryData* self_data = RGEO_GEOMETRY_DATA_PTR(self);
  const GEOSGeometry* self_geom = self_data->geom;
  if (self_geom) {
    RGeo_FactoryData* factory_data = RGEO_FACTORY_DATA_PTR(self_data->factory);
    GEOSWKBWriter* wkb_writer = factory_data->wkb_writer;
    GEOSContextHandle_t geos_context = self_data->geos_context;
    if (!wkb_writer) {
      wkb_writer = GEOSWKBWriter_create_r(geos_context);
      factory_data->wkb_writer = wkb_writer;
    }
    size_t size;
    char* str = (char*)GEOSWKBWriter_write_r(geos_context, wkb_writer, self_geom, &size);
    if (str) {
      result = rb_str_new(str, size);
      GEOSFree_r(geos_context, str);
    }
  }
  return result;
}
Esempio n. 3
0
static VALUE method_geometry_as_binary(VALUE self)
{
  VALUE result;
  RGeo_GeometryData* self_data;
  const GEOSGeometry* self_geom;
  RGeo_FactoryData* factory_data;
  VALUE wkb_generator;
  GEOSWKBWriter* wkb_writer;
  GEOSContextHandle_t geos_context;
  size_t size;
  char* str;

  result = Qnil;
  self_data = RGEO_GEOMETRY_DATA_PTR(self);
  self_geom = self_data->geom;
  if (self_geom) {
    factory_data = RGEO_FACTORY_DATA_PTR(self_data->factory);
    wkb_generator = factory_data->wkrep_wkb_generator;
    if (!NIL_P(wkb_generator)) {
      result = rb_funcall(wkb_generator, factory_data->globals->id_generate, 1, self);
    }
    else {
      wkb_writer = factory_data->wkb_writer;
      geos_context = self_data->geos_context;
      if (!wkb_writer) {
        wkb_writer = GEOSWKBWriter_create_r(geos_context);
        factory_data->wkb_writer = wkb_writer;
      }
      str = (char*)GEOSWKBWriter_write_r(geos_context, wkb_writer, self_geom, &size);
      if (str) {
        result = rb_str_new(str, size);
        GEOSFree_r(geos_context, str);
      }
    }
  }
  return result;
}