static bool detect_extent(boost::shared_ptr<sqlite_connection> ds, bool has_spatial_index, mapnik::box2d<double> & extent, std::string const& index_table, std::string const& metadata, std::string const& geometry_field, std::string const& geometry_table, std::string const& key_field, std::string const& table ) { if (has_spatial_index) { std::ostringstream s; s << "SELECT MIN(xmin), MIN(ymin), MAX(xmax), MAX(ymax) FROM " << index_table; boost::shared_ptr<sqlite_resultset> rs(ds->execute_query(s.str())); if (rs->is_valid() && rs->step_next()) { if (! rs->column_isnull(0)) { double xmin = rs->column_double(0); double ymin = rs->column_double(1); double xmax = rs->column_double(2); double ymax = rs->column_double(3); extent.init (xmin, ymin, xmax, ymax); return true; } } } else if (! metadata.empty()) { std::ostringstream s; s << "SELECT xmin, ymin, xmax, ymax FROM " << metadata; s << " WHERE LOWER(f_table_name) = LOWER('" << geometry_table << "')"; boost::shared_ptr<sqlite_resultset> rs(ds->execute_query(s.str())); if (rs->is_valid() && rs->step_next()) { double xmin = rs->column_double(0); double ymin = rs->column_double(1); double xmax = rs->column_double(2); double ymax = rs->column_double(3); extent.init (xmin, ymin, xmax, ymax); return true; } } else if (! key_field.empty()) { std::ostringstream s; s << "SELECT " << geometry_field << "," << key_field << " FROM (" << table << ")"; boost::shared_ptr<sqlite_resultset> rs(ds->execute_query(s.str())); sqlite_utils::query_extent(rs,extent); return true; } return false; }
void shape_io::read_bbox(shape_file::record_type & record, mapnik::box2d<double> & bbox) { double lox = record.read_double(); double loy = record.read_double(); double hix = record.read_double(); double hiy = record.read_double(); bbox.init(lox, loy, hix, hiy); }