python/src/geom_buf.h (91 lines of code) (raw):
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
#ifndef GEOM_BUF
#define GEOM_BUF
#include <stdlib.h>
#include "geomserde.h"
#include "geos_c_dyn.h"
/*
* Constants for identifying geometry dimensions in the serialized buffer of
* geometry.
*/
typedef enum CoordinateType_enum {
XY = 1,
XYZ = 2,
XYM = 3,
XYZM = 4
} CoordinateType;
/*
* Constants for identifying the geometry type in the serialized buffer of
* geometry.
*/
typedef enum GeometryTypeId_enum {
POINT = 1,
LINESTRING = 2,
POLYGON = 3,
MULTIPOINT = 4,
MULTILINESTRING = 5,
MULTIPOLYGON = 6,
GEOMETRYCOLLECTION = 7
} GeometryTypeId;
/*
* Basic info of coordinate sequence retrieved by calling multiple libgeos_c
* APIs.
*/
typedef struct CoordinateSequenceInfo {
unsigned int dims;
int has_z;
int has_m;
CoordinateType coord_type;
unsigned int bytes_per_coord;
unsigned int num_coords;
unsigned int total_bytes;
} CoordinateSequenceInfo;
/*
* Geometry buffer data structure for tracking the reading progress of
* coordinate part and offset part separately.
*/
typedef struct GeomBuffer {
void *buf;
int buf_size;
double *buf_coord;
double *buf_coord_end;
int *buf_int;
int *buf_int_end;
} GeomBuffer;
SedonaErrorCode get_coord_seq_info_from_geom(
GEOSContextHandle_t handle, const GEOSGeometry *geom,
CoordinateSequenceInfo *coord_seq_info);
void *alloc_buffer_for_geom(GeometryTypeId geom_type_id,
CoordinateType coord_type, int srid, int buf_size,
int num_coords);
SedonaErrorCode geom_buf_alloc(GeomBuffer *geom_buf,
GeometryTypeId geom_type_id, int srid,
const CoordinateSequenceInfo *cs_info,
int num_ints);
SedonaErrorCode read_geom_buf_header(const char *buf, int buf_size,
GeomBuffer *geom_buf,
CoordinateSequenceInfo *cs_info,
GeometryTypeId *p_geom_type_id,
int *p_srid);
SedonaErrorCode geom_buf_write_int(GeomBuffer *geom_buf, int value);
SedonaErrorCode geom_buf_read_bounded_int(GeomBuffer *geom_buf, int *p_value);
SedonaErrorCode geom_buf_write_coords(GeomBuffer *geom_buf,
GEOSContextHandle_t handle,
const GEOSCoordSequence *coord_seq,
const CoordinateSequenceInfo *cs_info);
SedonaErrorCode geom_buf_read_coords(GeomBuffer *geom_buf,
GEOSContextHandle_t handle,
const CoordinateSequenceInfo *cs_info,
GEOSCoordSequence **p_coord_seq);
SedonaErrorCode geom_buf_write_linear_segment(GeomBuffer *geom_buf,
GEOSContextHandle_t handle,
const GEOSGeometry *geom,
CoordinateSequenceInfo *cs_info);
SedonaErrorCode geom_buf_read_linear_segment(GeomBuffer *geom_buf,
GEOSContextHandle_t handle,
CoordinateSequenceInfo *cs_info,
int type, GEOSGeometry **p_geom);
SedonaErrorCode geom_buf_write_polygon(GeomBuffer *geom_buf,
GEOSContextHandle_t handle,
const GEOSGeometry *geom,
CoordinateSequenceInfo *cs_info);
SedonaErrorCode geom_buf_read_polygon(GeomBuffer *geom_buf,
GEOSContextHandle_t handle,
CoordinateSequenceInfo *cs_info,
GEOSGeometry **p_geom);
void destroy_geometry_array(GEOSContextHandle_t handle, GEOSGeometry **geoms,
int num_geoms);
#define RETURN_BUFFER_FOR_EMPTY_GEOM(geom_type_id, coord_type, srid) \
do { \
void *buf = alloc_buffer_for_geom(geom_type_id, coord_type, srid, 8, 0); \
if (buf == NULL) { \
return SEDONA_ALLOC_ERROR; \
} \
*p_buf = buf; \
*p_buf_size = 8; \
return SEDONA_SUCCESS; \
} while (0)
#endif /* GEOM_BUF */