static void destroy_factory_func(RGeo_FactoryData* data) { GEOSContextHandle_t context; context = data->geos_context; if (data->wkt_reader) { GEOSWKTReader_destroy_r(context, data->wkt_reader); } if (data->wkb_reader) { GEOSWKBReader_destroy_r(context, data->wkb_reader); } if (data->wkt_writer) { GEOSWKTWriter_destroy_r(context, data->wkt_writer); } if (data->wkb_writer) { GEOSWKBWriter_destroy_r(context, data->wkb_writer); } if (data->psych_wkt_reader) { GEOSWKTReader_destroy_r(context, data->psych_wkt_reader); } if (data->marshal_wkb_reader) { GEOSWKBReader_destroy_r(context, data->marshal_wkb_reader); } if (data->psych_wkt_writer) { GEOSWKTWriter_destroy_r(context, data->psych_wkt_writer); } if (data->marshal_wkb_writer) { GEOSWKBWriter_destroy_r(context, data->marshal_wkb_writer); } finishGEOS_r(context); free(data); }
std::string Polygon::wkt(double precision, bool bOutputZ) const { GEOSWKTWriter *writer = GEOSWKTWriter_create_r(m_ctx); GEOSWKTWriter_setRoundingPrecision_r(m_ctx, writer, precision); if (bOutputZ) GEOSWKTWriter_setOutputDimension_r(m_ctx, writer, 3); char *smoothWkt = GEOSWKTWriter_write_r(m_ctx, writer, m_geom); std::string output(smoothWkt); GEOSFree_r(m_ctx, smoothWkt); GEOSWKTWriter_destroy_r(m_ctx, writer); return output; }
static VALUE method_factory_initialize_copy(VALUE self, VALUE orig) { RGeo_FactoryData* self_data; RGeo_FactoryData* orig_data; GEOSContextHandle_t context; // Clear out existing data self_data = RGEO_FACTORY_DATA_PTR(self); context = self_data->geos_context; if (self_data->wkt_reader) { GEOSWKTReader_destroy_r(context, self_data->wkt_reader); self_data->wkt_reader = NULL; } if (self_data->wkb_reader) { GEOSWKBReader_destroy_r(context, self_data->wkb_reader); self_data->wkb_reader = NULL; } if (self_data->wkt_writer) { GEOSWKTWriter_destroy_r(context, self_data->wkt_writer); self_data->wkt_writer = NULL; } if (self_data->wkb_writer) { GEOSWKBWriter_destroy_r(context, self_data->wkb_writer); self_data->wkb_writer = NULL; } if (self_data->psych_wkt_reader) { GEOSWKTReader_destroy_r(context, self_data->psych_wkt_reader); self_data->psych_wkt_reader = NULL; } if (self_data->marshal_wkb_reader) { GEOSWKBReader_destroy_r(context, self_data->marshal_wkb_reader); self_data->marshal_wkb_reader = NULL; } if (self_data->psych_wkt_writer) { GEOSWKTWriter_destroy_r(context, self_data->psych_wkt_writer); self_data->psych_wkt_writer = NULL; } if (self_data->marshal_wkb_writer) { GEOSWKBWriter_destroy_r(context, self_data->marshal_wkb_writer); self_data->marshal_wkb_writer = NULL; } self_data->wkrep_wkt_generator = Qnil; self_data->wkrep_wkb_generator = Qnil; self_data->wkrep_wkt_parser = Qnil; self_data->wkrep_wkb_parser = Qnil; self_data->proj4_obj = Qnil; self_data->coord_sys_obj = Qnil; // Copy new data from original object if (TYPE(orig) == T_DATA && RDATA(orig)->dfree == (RUBY_DATA_FUNC)destroy_factory_func) { orig_data = RGEO_FACTORY_DATA_PTR(orig); self_data->flags = orig_data->flags; self_data->srid = orig_data->srid; self_data->buffer_resolution = orig_data->buffer_resolution; self_data->wkrep_wkt_generator = orig_data->wkrep_wkt_generator; self_data->wkrep_wkb_generator = orig_data->wkrep_wkb_generator; self_data->wkrep_wkt_parser = orig_data->wkrep_wkt_parser; self_data->wkrep_wkb_parser = orig_data->wkrep_wkb_parser; self_data->proj4_obj = orig_data->proj4_obj; self_data->coord_sys_obj = orig_data->coord_sys_obj; } return self; }