1# The beginnings of a Cython definition of GEOS. In the future much of this
2# could be auto-generated.
3
4from libc.stdint cimport uintptr_t
5
6
7cdef extern from "geos_c.h":
8    ctypedef void *GEOSContextHandle_t
9    ctypedef struct GEOSGeometry
10    ctypedef struct GEOSCoordSequence
11    ctypedef struct GEOSPreparedGeometry
12
13    GEOSCoordSequence *GEOSCoordSeq_create_r(GEOSContextHandle_t, unsigned int, unsigned int) nogil
14    GEOSCoordSequence *GEOSGeom_getCoordSeq_r(GEOSContextHandle_t, GEOSGeometry *) nogil
15
16    int GEOSCoordSeq_getSize_r(GEOSContextHandle_t, GEOSCoordSequence *, unsigned int *) nogil
17    int GEOSCoordSeq_setX_r(GEOSContextHandle_t, GEOSCoordSequence *, int, double) nogil
18    int GEOSCoordSeq_setY_r(GEOSContextHandle_t, GEOSCoordSequence *, int, double) nogil
19    int GEOSCoordSeq_setZ_r(GEOSContextHandle_t, GEOSCoordSequence *, int, double) nogil
20    int GEOSCoordSeq_getX_r(GEOSContextHandle_t, GEOSCoordSequence *, int, double *) nogil
21    int GEOSCoordSeq_getY_r(GEOSContextHandle_t, GEOSCoordSequence *, int, double *) nogil
22    int GEOSCoordSeq_getZ_r(GEOSContextHandle_t, GEOSCoordSequence *, int, double *) nogil
23
24    GEOSGeometry *GEOSGeom_createPoint_r(GEOSContextHandle_t, GEOSCoordSequence *) nogil
25    GEOSGeometry *GEOSGeom_createLineString_r(GEOSContextHandle_t, GEOSCoordSequence *) nogil
26    GEOSGeometry *GEOSGeom_createLinearRing_r(GEOSContextHandle_t, GEOSCoordSequence *) nogil
27    GEOSGeometry *GEOSGeom_clone_r(GEOSContextHandle_t, GEOSGeometry *) nogil
28    GEOSCoordSequence *GEOSCoordSeq_clone_r(GEOSContextHandle_t, GEOSCoordSequence *) nogil
29
30    void GEOSGeom_destroy_r(GEOSContextHandle_t, GEOSGeometry *) nogil
31
32    char GEOSPreparedContains_r(GEOSContextHandle_t, const GEOSPreparedGeometry*, const GEOSGeometry*) nogil
33    char GEOSPreparedContainsProperly_r(GEOSContextHandle_t, const GEOSPreparedGeometry*, const GEOSGeometry*) nogil
34    char GEOSPreparedCoveredBy_r(GEOSContextHandle_t, const GEOSPreparedGeometry*, const GEOSGeometry*) nogil
35    char GEOSPreparedCovers_r(GEOSContextHandle_t, const GEOSPreparedGeometry*, const GEOSGeometry*) nogil
36    char GEOSPreparedCrosses_r(GEOSContextHandle_t, const GEOSPreparedGeometry*, const GEOSGeometry*) nogil
37    char GEOSPreparedDisjoint_r(GEOSContextHandle_t, const GEOSPreparedGeometry*, const GEOSGeometry*) nogil
38    char GEOSPreparedIntersects_r(GEOSContextHandle_t, const GEOSPreparedGeometry*, const GEOSGeometry*) nogil
39    char GEOSPreparedOverlaps_r(GEOSContextHandle_t, const GEOSPreparedGeometry*, const GEOSGeometry*) nogil
40    char GEOSPreparedTouches_r(GEOSContextHandle_t, const GEOSPreparedGeometry*, const GEOSGeometry*) nogil
41    char GEOSPreparedWithin_r(GEOSContextHandle_t, const GEOSPreparedGeometry*, const GEOSGeometry*) nogil
42
43    char GEOSHasZ_r(GEOSContextHandle_t, GEOSGeometry *) nogil
44    char GEOSisRing_r(GEOSContextHandle_t, GEOSGeometry *) nogil
45    char GEOSisClosed_r(GEOSContextHandle_t, GEOSGeometry *) nogil
46    char GEOSisValid_r(GEOSContextHandle_t, GEOSGeometry *) nogil
47    char GEOSisSimple_r(GEOSContextHandle_t, GEOSGeometry *) nogil
48
49
50cdef GEOSContextHandle_t get_geos_context_handle():
51    # Note: This requires that lgeos is defined, so needs to be imported as:
52    from shapely.geos import lgeos
53    cdef uintptr_t handle = lgeos.geos_handle
54    return <GEOSContextHandle_t>handle
55
56
57cdef GEOSPreparedGeometry *geos_from_prepared(shapely_geom) except *:
58    """Get the Prepared GEOS geometry pointer from the given shapely geometry."""
59    cdef uintptr_t geos_geom = shapely_geom._geom
60    return <GEOSPreparedGeometry *>geos_geom
61