1 /********************************************************************** 2 * 3 * PostGIS - Spatial Types for PostgreSQL 4 * http://postgis.net 5 * 6 * PostGIS is free software: you can redistribute it and/or modify 7 * it under the terms of the GNU General Public License as published by 8 * the Free Software Foundation, either version 2 of the License, or 9 * (at your option) any later version. 10 * 11 * PostGIS is distributed in the hope that it will be useful, 12 * but WITHOUT ANY WARRANTY; without even the implied warranty of 13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14 * GNU General Public License for more details. 15 * 16 * You should have received a copy of the GNU General Public License 17 * along with PostGIS. If not, see <http://www.gnu.org/licenses/>. 18 * 19 ********************************************************************** 20 * 21 * Copyright (C) 2016-2017 Björn Harrtell <bjorn@wololo.org> 22 * 23 **********************************************************************/ 24 25 #ifndef MVT_H_ 26 #define MVT_H_ 1 27 28 #include <stdlib.h> 29 #include "postgres.h" 30 #include "utils/builtins.h" 31 #include "utils/array.h" 32 #include "utils/typcache.h" 33 #include "utils/lsyscache.h" 34 #include "catalog/pg_type.h" 35 #include "catalog/namespace.h" 36 #include "executor/executor.h" 37 #include "access/htup_details.h" 38 #include "access/htup.h" 39 #include "../postgis_config.h" 40 #include "liblwgeom.h" 41 #include "liblwgeom_internal.h" 42 #include "lwgeom_pg.h" 43 #include "lwgeom_log.h" 44 45 #ifdef HAVE_LIBPROTOBUF 46 47 #include "vector_tile.pb-c.h" 48 49 typedef struct mvt_column_cache 50 { 51 uint32_t *column_keys_index; 52 uint32_t *column_oid; 53 Datum *values; 54 bool *nulls; 55 TupleDesc tupdesc; 56 } mvt_column_cache; 57 58 typedef struct mvt_agg_context 59 { 60 char *name; 61 uint32_t extent; 62 char *geom_name; 63 uint32_t geom_index; 64 HeapTupleHeader row; 65 VectorTile__Tile__Feature *feature; 66 VectorTile__Tile__Layer *layer; 67 VectorTile__Tile *tile; 68 size_t features_capacity; 69 struct mvt_kv_key *keys_hash; 70 struct mvt_kv_string_value *string_values_hash; 71 struct mvt_kv_float_value *float_values_hash; 72 struct mvt_kv_double_value *double_values_hash; 73 struct mvt_kv_uint_value *uint_values_hash; 74 struct mvt_kv_sint_value *sint_values_hash; 75 struct mvt_kv_bool_value *bool_values_hash; 76 uint32_t values_hash_i; 77 uint32_t keys_hash_i; 78 uint32_t row_columns; 79 mvt_column_cache column_cache; 80 } mvt_agg_context; 81 82 /* Prototypes */ 83 LWGEOM *mvt_geom(LWGEOM *geom, const GBOX *bounds, uint32_t extent, uint32_t buffer, bool clip_geom); 84 void mvt_agg_init_context(mvt_agg_context *ctx); 85 void mvt_agg_transfn(mvt_agg_context *ctx); 86 bytea *mvt_agg_finalfn(mvt_agg_context *ctx); 87 bytea *mvt_ctx_serialize(mvt_agg_context *ctx); 88 mvt_agg_context * mvt_ctx_deserialize(const bytea *ba); 89 mvt_agg_context * mvt_ctx_combine(mvt_agg_context *ctx1, mvt_agg_context *ctx2); 90 91 92 #endif /* HAVE_LIBPROTOBUF */ 93 94 #endif 95