1# PROJ API Definition
2
3IF CTE_PROJ_VERSION_MAJOR >= 8:
4    cdef extern from "proj.h":
5        const char * proj_context_errno_string(PJ_CONTEXT* ctx, int err)
6        ctypedef enum PJ_CATEGORY:
7            PJ_CATEGORY_ELLIPSOID
8            PJ_CATEGORY_PRIME_MERIDIAN
9            PJ_CATEGORY_DATUM
10            PJ_CATEGORY_CRS
11            PJ_CATEGORY_COORDINATE_OPERATION
12            PJ_CATEGORY_DATUM_ENSEMBLE
13ELSE:
14    cdef extern from "proj.h":
15        const char * proj_errno_string(int err)
16        ctypedef enum PJ_CATEGORY:
17            PJ_CATEGORY_ELLIPSOID
18            PJ_CATEGORY_PRIME_MERIDIAN
19            PJ_CATEGORY_DATUM
20            PJ_CATEGORY_CRS
21            PJ_CATEGORY_COORDINATE_OPERATION
22    cdef int PJ_CATEGORY_DATUM_ENSEMBLE = PJ_CATEGORY_DATUM
23
24
25cdef extern from "proj.h":
26    cdef int PROJ_VERSION_MAJOR
27    cdef int PROJ_VERSION_MINOR
28    cdef int PROJ_VERSION_PATCH
29    void proj_context_set_search_paths(
30        PJ_CONTEXT *ctx, int count_paths, const char* const* paths)
31    int proj_context_set_database_path(PJ_CONTEXT *ctx,
32                                       const char *dbPath,
33                                       const char *const *auxDbPaths,
34                                       const char* const *options)
35    void proj_context_set_ca_bundle_path(PJ_CONTEXT *ctx, const char *path);
36
37    # projCtx has been replaced by PJ_CONTEXT *.
38    # projPJ  has been replaced by PJ *
39    ctypedef struct PJ
40    ctypedef struct PJ_CONTEXT
41    PJ_CONTEXT *proj_context_create ()
42    PJ_CONTEXT *proj_context_clone (PJ_CONTEXT *ctx)
43    PJ_CONTEXT *proj_context_destroy (PJ_CONTEXT *ctx)
44
45    ctypedef enum PJ_LOG_LEVEL:
46        PJ_LOG_NONE  = 0
47        PJ_LOG_ERROR = 1
48        PJ_LOG_DEBUG = 2
49        PJ_LOG_TRACE = 3
50        PJ_LOG_TELL  = 4
51    ctypedef void (*PJ_LOG_FUNCTION)(void *, int, const char *)
52    void proj_log_func (PJ_CONTEXT *ctx, void *app_data, PJ_LOG_FUNCTION logf)
53
54    int proj_errno (const PJ *P) nogil
55    int proj_context_errno (PJ_CONTEXT *ctx)
56    int  proj_errno_reset (const PJ *P) nogil
57    PJ *proj_create (PJ_CONTEXT *ctx, const char *definition)
58    PJ *proj_normalize_for_visualization(PJ_CONTEXT *ctx, const PJ* obj)
59
60    ctypedef struct PJ_PROJ_INFO:
61        const char  *id
62        const char  *description
63        const char  *definition
64        int         has_inverse #1 if an inverse mapping exists, 0 otherwise              */
65        double      accuracy
66
67    PJ_PROJ_INFO proj_pj_info(PJ *P)
68
69    ctypedef struct PJ_XYZT:
70        double   x,   y,  z, t
71    ctypedef struct PJ_UVWT:
72        double   u,   v,  w, t
73    ctypedef struct PJ_LPZT:
74        double lam, phi,  z, t
75    ctypedef struct PJ_OPK:
76        double o, p, k
77    ctypedef struct PJ_ENU:
78        double e, n, u
79    ctypedef struct PJ_GEOD:
80        double s, a1, a2
81
82    ctypedef struct PJ_UV:
83        double   u,   v
84    ctypedef struct PJ_XY:
85        double   x,   y
86    ctypedef struct PJ_LP:
87        double lam, phi
88
89    ctypedef struct PJ_XYZ:
90        double   x,   y,  z
91    ctypedef struct PJ_UVW:
92        double   u,   v,  w
93    ctypedef struct PJ_LPZ:
94        double lam, phi,  z
95
96
97    ctypedef union PJ_COORD:
98        double v[4];
99        PJ_XYZT xyzt;
100        PJ_UVWT uvwt;
101        PJ_LPZT lpzt;
102        PJ_GEOD geod;
103        PJ_OPK opk;
104        PJ_ENU enu;
105        PJ_XYZ xyz;
106        PJ_UVW uvw;
107        PJ_LPZ lpz;
108        PJ_XY xy;
109        PJ_UV uv;
110        PJ_LP lp;
111
112    PJ_COORD proj_coord (double x, double y, double z, double t)
113
114    ctypedef enum PJ_DIRECTION:
115        PJ_FWD   =  1 # Forward
116        PJ_IDENT =  0 # Do nothing
117        PJ_INV   = -1 # Inverse
118
119    int proj_angular_input (PJ *P, PJ_DIRECTION dir) nogil
120    int proj_angular_output (PJ *P, PJ_DIRECTION dir) nogil
121    int proj_degree_input (PJ *P, PJ_DIRECTION dir) nogil
122    int proj_degree_output (PJ *P, PJ_DIRECTION dir) nogil
123
124    size_t proj_trans_generic (
125        PJ *P,
126        PJ_DIRECTION direction,
127        double *x, size_t sx, size_t nx,
128        double *y, size_t sy, size_t ny,
129        double *z, size_t sz, size_t nz,
130        double *t, size_t st, size_t nt
131    ) nogil
132    ctypedef struct PJ_AREA
133    PJ *proj_create_crs_to_crs_from_pj(
134        PJ_CONTEXT *ctx,
135        PJ *source_crs,
136        PJ *target_crs,
137        PJ_AREA *area,
138        const char* const *options,
139    )
140
141    ctypedef enum PJ_COMPARISON_CRITERION:
142        PJ_COMP_STRICT
143        PJ_COMP_EQUIVALENT
144        PJ_COMP_EQUIVALENT_EXCEPT_AXIS_ORDER_GEOGCRS
145
146    void proj_destroy(PJ *obj)
147    int proj_is_equivalent_to_with_ctx(PJ_CONTEXT *ctx,
148                                       const PJ *obj, const PJ *other,
149                                       PJ_COMPARISON_CRITERION criterion)
150
151    const char* proj_get_id_auth_name(const PJ *obj, int index)
152    const char* proj_get_id_code(const PJ *obj, int index)
153    int proj_get_area_of_use(PJ_CONTEXT *ctx,
154                             const PJ *obj,
155                             double* out_west_lon_degree,
156                             double* out_south_lat_degree,
157                             double* out_east_lon_degree,
158                             double* out_north_lat_degree,
159                             const char **out_area_name)
160    PJ_AREA *proj_area_create()
161    void proj_area_set_bbox(PJ_AREA *area,
162                            double west_lon_degree,
163                            double south_lat_degree,
164                            double east_lon_degree,
165                            double north_lat_degree)
166    void proj_area_destroy(PJ_AREA* area)
167
168    ctypedef enum PJ_WKT_TYPE:
169        PJ_WKT2_2015
170        PJ_WKT2_2015_SIMPLIFIED
171        PJ_WKT2_2019
172        PJ_WKT2_2019_SIMPLIFIED
173        PJ_WKT1_GDAL
174        PJ_WKT1_ESRI
175
176    const char* proj_as_wkt(PJ_CONTEXT *ctx,
177                            const PJ *obj,
178                            PJ_WKT_TYPE type,
179                            const char* const *options)
180
181    ctypedef enum PJ_PROJ_STRING_TYPE:
182        PJ_PROJ_5
183        PJ_PROJ_4
184
185    const char* proj_as_proj_string(PJ_CONTEXT *ctx,
186                                    const PJ *obj,
187                                    PJ_PROJ_STRING_TYPE type,
188                                    const char* const *options)
189    const char* proj_as_projjson(PJ_CONTEXT *ctx,
190                                 const PJ *obj,
191                                 const char* const *options)
192    PJ *proj_crs_get_geodetic_crs(PJ_CONTEXT *ctx, const PJ *crs)
193
194    ctypedef enum PJ_TYPE:
195        PJ_TYPE_UNKNOWN
196        PJ_TYPE_ELLIPSOID
197        PJ_TYPE_PRIME_MERIDIAN
198        PJ_TYPE_GEODETIC_REFERENCE_FRAME
199        PJ_TYPE_DYNAMIC_GEODETIC_REFERENCE_FRAME
200        PJ_TYPE_VERTICAL_REFERENCE_FRAME
201        PJ_TYPE_DYNAMIC_VERTICAL_REFERENCE_FRAME
202        PJ_TYPE_DATUM_ENSEMBLE
203        PJ_TYPE_CRS
204        PJ_TYPE_GEODETIC_CRS
205        PJ_TYPE_GEOCENTRIC_CRS
206        PJ_TYPE_GEOGRAPHIC_CRS
207        PJ_TYPE_GEOGRAPHIC_2D_CRS
208        PJ_TYPE_GEOGRAPHIC_3D_CRS
209        PJ_TYPE_VERTICAL_CRS
210        PJ_TYPE_PROJECTED_CRS
211        PJ_TYPE_COMPOUND_CRS
212        PJ_TYPE_TEMPORAL_CRS
213        PJ_TYPE_ENGINEERING_CRS
214        PJ_TYPE_BOUND_CRS
215        PJ_TYPE_OTHER_CRS
216        PJ_TYPE_CONVERSION
217        PJ_TYPE_TRANSFORMATION
218        PJ_TYPE_CONCATENATED_OPERATION
219        PJ_TYPE_OTHER_COORDINATE_OPERATION
220        PJ_TYPE_TEMPORAL_DATUM
221        PJ_TYPE_ENGINEERING_DATUM
222        PJ_TYPE_PARAMETRIC_DATUM
223
224    PJ_TYPE proj_get_type(const PJ *obj)
225    const char* proj_get_name(const PJ *obj)
226    const char* proj_get_remarks(const PJ *obj)
227    const char* proj_get_scope(const PJ *obj)
228
229    int proj_is_crs(const PJ *obj)
230    int proj_is_derived_crs(PJ_CONTEXT *ctx, const PJ* crs)
231    PJ *proj_crs_get_datum(PJ_CONTEXT *ctx, const PJ *crs)
232    PJ *proj_crs_get_horizontal_datum(PJ_CONTEXT *ctx, const PJ *crs)
233
234    ctypedef enum PJ_COORDINATE_SYSTEM_TYPE:
235        PJ_CS_TYPE_UNKNOWN
236        PJ_CS_TYPE_CARTESIAN
237        PJ_CS_TYPE_ELLIPSOIDAL
238        PJ_CS_TYPE_VERTICAL
239        PJ_CS_TYPE_SPHERICAL
240        PJ_CS_TYPE_ORDINAL
241        PJ_CS_TYPE_PARAMETRIC
242        PJ_CS_TYPE_DATETIMETEMPORAL
243        PJ_CS_TYPE_TEMPORALCOUNT
244        PJ_CS_TYPE_TEMPORALMEASURE
245
246    PJ *proj_crs_get_coordinate_system(PJ_CONTEXT *ctx, const PJ *crs)
247    PJ_COORDINATE_SYSTEM_TYPE proj_cs_get_type(PJ_CONTEXT *ctx,
248                                               const PJ *cs)
249    int proj_cs_get_axis_count(PJ_CONTEXT *ctx,
250                               const PJ *cs)
251    int proj_cs_get_axis_info(PJ_CONTEXT *ctx,
252                              const PJ *cs, int index,
253                              const char **out_name,
254                              const char **out_abbrev,
255                              const char **out_direction,
256                              double *out_unit_conv_factor,
257                              const char **out_unit_name,
258                              const char **out_unit_auth_name,
259                              const char **out_unit_code)
260
261    PJ *proj_get_ellipsoid(PJ_CONTEXT *ctx, const PJ *obj)
262    int proj_ellipsoid_get_parameters(PJ_CONTEXT *ctx,
263                                      const PJ *ellipsoid,
264                                      double *out_semi_major_metre,
265                                      double *out_semi_minor_metre,
266                                      int    *out_is_semi_minor_computed,
267                                      double *out_inv_flattening)
268    PJ *proj_get_prime_meridian(PJ_CONTEXT *ctx, const PJ *obj)
269    int proj_prime_meridian_get_parameters(PJ_CONTEXT *ctx,
270                                           const PJ *prime_meridian,
271                                           double *out_longitude,
272                                           double *out_unit_conv_factor,
273                                           const char **out_unit_name)
274    PJ *proj_crs_get_sub_crs(PJ_CONTEXT *ctx, const PJ *crs, int index)
275    PJ *proj_get_source_crs(PJ_CONTEXT *ctx, const PJ *obj)
276    PJ *proj_get_target_crs(PJ_CONTEXT *ctx, const PJ *obj)
277
278    ctypedef struct PJ_OBJ_LIST
279    PJ_OBJ_LIST *proj_identify(PJ_CONTEXT *ctx,
280                               const PJ* obj,
281                               const char *auth_name,
282                               const char* const *options,
283                               int **out_confidence)
284    PJ *proj_list_get(PJ_CONTEXT *ctx,
285                      const PJ_OBJ_LIST *result,
286                      int index)
287    int proj_list_get_count(const PJ_OBJ_LIST *result)
288    void proj_list_destroy(PJ_OBJ_LIST *result)
289    void proj_int_list_destroy(int* list)
290    void proj_context_use_proj4_init_rules(PJ_CONTEXT *ctx, int enable)
291    ctypedef enum PJ_GUESSED_WKT_DIALECT:
292        PJ_GUESSED_WKT2_2018
293        PJ_GUESSED_WKT2_2015
294        PJ_GUESSED_WKT1_GDAL
295        PJ_GUESSED_WKT1_ESRI
296        PJ_GUESSED_NOT_WKT
297
298    PJ_GUESSED_WKT_DIALECT proj_context_guess_wkt_dialect(PJ_CONTEXT *ctx,
299                                                          const char *wkt)
300
301    ctypedef struct PJ_OPERATIONS:
302        const char  *id
303        PJ          *(*proj)(PJ *)
304        const char  * const *descr
305
306    const PJ_OPERATIONS *proj_list_operations()
307
308    ctypedef struct PJ_ELLPS:
309        const char  *id   # ellipse keyword name
310        const char  *major  # a= value
311        const char  *ell  # elliptical parameter
312        const char  *name  # comments
313    const PJ_ELLPS *proj_list_ellps()
314
315    ctypedef struct PJ_PRIME_MERIDIANS:
316        const char  *id
317        const char  *defn
318    const PJ_PRIME_MERIDIANS *proj_list_prime_meridians()
319    ctypedef char **PROJ_STRING_LIST
320    void proj_string_list_destroy(PROJ_STRING_LIST list)
321    PROJ_STRING_LIST proj_get_authorities_from_database(PJ_CONTEXT *ctx)
322    PROJ_STRING_LIST proj_get_codes_from_database(PJ_CONTEXT *ctx,
323                                                  const char *auth_name,
324                                                  PJ_TYPE type,
325                                                  int allow_deprecated)
326
327    ctypedef struct PROJ_CRS_INFO:
328        char* auth_name
329        char* code
330        char* name
331        PJ_TYPE type
332        int deprecated
333        int bbox_valid
334        double west_lon_degree
335        double south_lat_degree
336        double east_lon_degree
337        double north_lat_degree
338        char* area_name
339        char* projection_method_name
340
341    ctypedef struct PROJ_CRS_LIST_PARAMETERS:
342        const PJ_TYPE* types
343        size_t typesCount
344        int crs_area_of_use_contains_bbox
345        int bbox_valid
346        double west_lon_degree
347        double south_lat_degree
348        double east_lon_degree
349        double north_lat_degree
350        int allow_deprecated
351
352    PROJ_CRS_LIST_PARAMETERS *proj_get_crs_list_parameters_create()
353
354    void proj_get_crs_list_parameters_destroy(PROJ_CRS_LIST_PARAMETERS* params)
355
356    PROJ_CRS_INFO **proj_get_crs_info_list_from_database(
357                                        PJ_CONTEXT *ctx,
358                                        const char *auth_name,
359                                        const PROJ_CRS_LIST_PARAMETERS* params,
360                                        int *out_result_count)
361
362    void proj_crs_info_list_destroy(PROJ_CRS_INFO** list)
363
364    PJ *proj_crs_get_coordoperation(PJ_CONTEXT *ctx,
365                                    const PJ *crs)
366
367    int proj_coordoperation_get_method_info(PJ_CONTEXT *ctx,
368                                            const PJ *coordoperation,
369                                            const char **out_method_name,
370                                            const char **out_method_auth_name,
371                                            const char **out_method_code)
372
373    int proj_coordoperation_is_instantiable(PJ_CONTEXT *ctx,
374                                            const PJ *coordoperation)
375
376    int proj_coordoperation_has_ballpark_transformation(PJ_CONTEXT *ctx,
377                                                        const PJ *coordoperation)
378
379    int proj_coordoperation_get_param_count(PJ_CONTEXT *ctx,
380                                            const PJ *coordoperation)
381
382    int proj_coordoperation_get_param_index(PJ_CONTEXT *ctx,
383                                            const PJ *coordoperation,
384                                            const char *name)
385
386    int proj_coordoperation_get_param(PJ_CONTEXT *ctx,
387                                      const PJ *coordoperation,
388                                      int index,
389                                      const char **out_name,
390                                      const char **out_auth_name,
391                                      const char **out_code,
392                                      double *out_value,
393                                      const char **out_value_string,
394                                      double *out_unit_conv_factor,
395                                      const char **out_unit_name,
396                                      const char **out_unit_auth_name,
397                                      const char **out_unit_code,
398                                      const char **out_unit_category)
399
400    int proj_coordoperation_get_grid_used_count(PJ_CONTEXT *ctx,
401                                                        const PJ *coordoperation)
402
403    int proj_coordoperation_get_grid_used(PJ_CONTEXT *ctx,
404                                          const PJ *coordoperation,
405                                          int index,
406                                          const char **out_short_name,
407                                          const char **out_full_name,
408                                          const char **out_package_name,
409                                          const char **out_url,
410                                          int *out_direct_download,
411                                          int *out_open_license,
412                                          int *out_available)
413
414    double proj_coordoperation_get_accuracy(PJ_CONTEXT *ctx,
415                                            const PJ *obj)
416
417    int proj_coordoperation_get_towgs84_values(PJ_CONTEXT *ctx,
418                                               const PJ *coordoperation,
419                                               double *out_values,
420                                               int value_count,
421                                               int emit_error_if_incompatible)
422    int proj_concatoperation_get_step_count(PJ_CONTEXT *ctx,
423                                            const PJ *concatoperation)
424    PJ *proj_concatoperation_get_step(PJ_CONTEXT *ctx,
425                                      const PJ *concatoperation,
426                                      int i_step)
427    PJ *proj_create_from_database(PJ_CONTEXT *ctx,
428                                  const char *auth_name,
429                                  const char *code,
430                                  PJ_CATEGORY category,
431                                  int usePROJAlternativeGridNames,
432                                  const char* const *options)
433    PJ_OBJ_LIST *proj_create_from_name(PJ_CONTEXT *ctx,
434                                       const char *auth_name,
435                                       const char *searchedName,
436                                       const PJ_TYPE* types,
437                                       size_t typesCount,
438                                       int approximateMatch,
439                                       size_t limitResultCount,
440                                       const char* const *options)
441
442    ctypedef struct PJ_OPERATION_FACTORY_CONTEXT
443
444    PJ_OPERATION_FACTORY_CONTEXT *proj_create_operation_factory_context(
445        PJ_CONTEXT *ctx,
446        const char *authority
447    )
448    void proj_operation_factory_context_destroy(
449        PJ_OPERATION_FACTORY_CONTEXT *ctx
450    )
451    PJ_OBJ_LIST *proj_create_operations(
452        PJ_CONTEXT *ctx,
453        const PJ *source_crs,
454        const PJ *target_crs,
455        const PJ_OPERATION_FACTORY_CONTEXT *operationContext
456    )
457    void proj_operation_factory_context_set_grid_availability_use(
458        PJ_CONTEXT *ctx,
459        PJ_OPERATION_FACTORY_CONTEXT *factory_ctx,
460        PROJ_GRID_AVAILABILITY_USE use
461    )
462    void proj_operation_factory_context_set_spatial_criterion(
463        PJ_CONTEXT *ctx,
464        PJ_OPERATION_FACTORY_CONTEXT *factory_ctx,
465        PROJ_SPATIAL_CRITERION criterion
466    )
467    void proj_operation_factory_context_set_area_of_interest(
468        PJ_CONTEXT *ctx,
469        PJ_OPERATION_FACTORY_CONTEXT *factory_ctx,
470        double west_lon_degree,
471        double south_lat_degree,
472        double east_lon_degree,
473        double north_lat_degree
474    )
475
476    ctypedef enum PROJ_SPATIAL_CRITERION:
477        PROJ_SPATIAL_CRITERION_STRICT_CONTAINMENT
478        PROJ_SPATIAL_CRITERION_PARTIAL_INTERSECTION
479
480    ctypedef enum PROJ_GRID_AVAILABILITY_USE:
481        PROJ_GRID_AVAILABILITY_USED_FOR_SORTING
482        PROJ_GRID_AVAILABILITY_DISCARD_OPERATION_IF_MISSING_GRID
483        PROJ_GRID_AVAILABILITY_IGNORED
484
485    ctypedef struct PJ_FACTORS:
486        double meridional_scale
487        double parallel_scale
488        double areal_scale
489        double angular_distortion
490        double meridian_parallel_angle
491        double meridian_convergence
492        double tissot_semimajor
493        double tissot_semiminor
494        double dx_dlam
495        double dx_dphi
496        double dy_dlam
497        double dy_dphi
498
499    PJ_FACTORS proj_factors(PJ *P, PJ_COORD lp) nogil
500    # neworking related
501    const char *proj_context_get_user_writable_directory(PJ_CONTEXT *ctx, int create)
502    int proj_context_set_enable_network(PJ_CONTEXT* ctx, int enabled)
503    int proj_context_is_network_enabled(PJ_CONTEXT* ctx)
504    # units
505    ctypedef struct PROJ_UNIT_INFO:
506        # Authority name.
507        char* auth_name
508        # Object code.
509        char* code
510        # Object name. For example "metre", "US survey foot", etc. */
511        char* name
512        # Category of the unit: one of "linear", "linear_per_time", "angular",
513        # "angular_per_time", "scale", "scale_per_time" or "time" */
514        char* category
515        # Conversion factor to apply to transform from that unit to the
516        # corresponding SI unit (metre for "linear", radian for "angular", etc.).
517        # It might be 0 in some cases to indicate no known conversion factor.
518        double conv_factor
519        # PROJ short name, like "m", "ft", "us-ft", etc... Might be NULL */
520        char* proj_short_name
521        # Whether the object is deprecated
522        int deprecated
523
524    PROJ_UNIT_INFO **proj_get_units_from_database(
525        PJ_CONTEXT *ctx,
526        const char *auth_name,
527        const char *category,
528        int allow_deprecated,
529        int *out_result_count,
530    )
531    void proj_unit_list_destroy(PROJ_UNIT_INFO** list)
532    const char *proj_context_get_url_endpoint(PJ_CONTEXT* ctx)
533