1 /******************************************************************************
2  * $Id: gnm.i c92cc7b9bd8a8ae987d1ee2a1f764787ec3ef445 2018-09-16 10:52:21 +0900 Hiroshi Miura $
3  *
4  * Project:  GNM Core SWIG Interface declarations.
5  * Purpose:  GNM declarations.
6  * Authors:  Mikhail Gusev (gusevmihs at gmail dot com)
7  *           Dmitry Baryshnikov, polimax@mail.ru
8  *
9  ******************************************************************************
10  * Copyright (c) 2014, Mikhail Gusev
11  * Copyright (c) 2014-2015, NextGIS <info@nextgis.com>
12  *
13  * Permission is hereby granted, free of charge, to any person obtaining a
14  * copy of this software and associated documentation files (the "Software"),
15  * to deal in the Software without restriction, including without limitation
16  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
17  * and/or sell copies of the Software, and to permit persons to whom the
18  * Software is furnished to do so, subject to the following conditions:
19  *
20  * The above copyright notice and this permission notice shall be included
21  * in all copies or substantial portions of the Software.
22  *
23  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
24  * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
25  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
26  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
27  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
28  * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
29  * DEALINGS IN THE SOFTWARE.
30  *****************************************************************************/
31 
32 #ifndef FROM_GDAL_I
33 %include "exception.i"
34 #endif
35 %include constraints.i
36 
37 #ifdef PERL_CPAN_NAMESPACE
38 %module "Geo::GNM"
39 #elif defined(SWIGCSHARP)
40 %module Gnm
41 #elif defined(SWIGPYTHON)
42 %module (package="osgeo") gnm
43 #else
44 %module gnm
45 #endif
46 
47 #ifdef SWIGCSHARP
48 %include swig_csharp_extensions.i
49 #endif
50 
51 #ifdef SWIGPERL
52 %include confess.i
53 #endif
54 
55 #ifndef SWIGJAVA
56 %feature ("compactdefaultargs");
57 #endif
58 
59 %{
60 #include <iostream>
61 using namespace std;
62 
63 #define CPL_SUPRESS_CPLUSPLUS
64 
65 #include "gdal.h"
66 #include "ogr_api.h"
67 #include "ogr_core.h"
68 #include "cpl_port.h"
69 #include "cpl_string.h"
70 #include "ogr_srs_api.h"
71 #include "gnm_api.h"
72 
73 typedef void GDALMajorObjectShadow;
74 typedef void GNMNetworkShadow;
75 typedef void GNMGenericNetworkShadow;
76 
77 #ifdef DEBUG
78 typedef struct OGRSpatialReferenceHS OSRSpatialReferenceShadow;
79 #ifndef SWIGPERL
80 typedef struct OGRDriverHS OGRDriverShadow;
81 typedef struct OGRDataSourceHS OGRDataSourceShadow;
82 #endif
83 typedef struct OGRLayerHS OGRLayerShadow;
84 typedef struct OGRFeatureHS OGRFeatureShadow;
85 typedef struct OGRFeatureDefnHS OGRFeatureDefnShadow;
86 typedef struct OGRGeometryHS OGRGeometryShadow;
87 typedef struct OGRCoordinateTransformationHS OSRCoordinateTransformationShadow;
88 typedef struct OGRCoordinateTransformationHS OGRCoordinateTransformationShadow;
89 typedef struct OGRFieldDefnHS OGRFieldDefnShadow;
90 #else
91 typedef void OSRSpatialReferenceShadow;
92 #ifndef SWIGPERL
93 typedef void OGRDriverShadow;
94 typedef void OGRDataSourceShadow;
95 #endif
96 typedef void OGRLayerShadow;
97 typedef void OGRFeatureShadow;
98 typedef void OGRFeatureDefnShadow;
99 typedef void OGRGeometryShadow;
100 typedef void OSRCoordinateTransformationShadow;
101 typedef void OGRFieldDefnShadow;
102 #endif
103 typedef struct OGRStyleTableHS OGRStyleTableShadow;
104 typedef struct OGRGeomFieldDefnHS OGRGeomFieldDefnShadow;
105 %}
106 
107 #if defined(SWIGPYTHON)
108 %include gnm_python.i
109 #elif defined(SWIGCSHARP)
110 //%include gnm_csharp.i
111 #elif defined(SWIGJAVA)
112 %include gnm_java.i
113 #elif defined(SWIGPERL)
114 //%include gnm_perl.i
115 %import typemaps_perl.i
116 #else
117 %include gdal_typemaps.i
118 #endif
119 
120 #define FROM_OGR_I
121 %import ogr.i
122 
123 
124 typedef int GNMDirection;
125 typedef int CPLErr;
126 
127 //************************************************************************
128 //
129 // Define the MajorObject object
130 //
131 //************************************************************************
132 #if defined(SWIGPYTHON)
133 %{
134 #include "gdal.h"
135 %}
136 #define FROM_PYTHON_OGR_I
137 %include MajorObject.i
138 #undef FROM_PYTHON_OGR_I
139 #else /* defined(SWIGPYTHON) */
140 %import MajorObject.i
141 #endif /* defined(SWIGPYTHON) */
142 
143 %feature("autodoc");
144 
145 // Redefine AlgorithmType
146 %rename (GraphAlgorithm) GNMGraphAlgorithmType;
147 typedef enum
148 {
149     GATDijkstraShortestPath = 1,
150     GATKShortestPath = 2,
151     GATConnectedComponents = 3
152 } GNMGraphAlgorithmType;
153 
154 #define GNMGFID GIntBig
155 #define GNM_EDGE_DIR_BOTH       0   // bidirectional
156 #define GNM_EDGE_DIR_SRCTOTGT   1   // from source to target
157 #define GNM_EDGE_DIR_TGTTOSRC   2   // from target to source
158 
159 #ifndef SWIGJAVA
160 %inline %{
CastToNetwork(GDALMajorObjectShadow * base)161   GNMNetworkShadow* CastToNetwork(GDALMajorObjectShadow* base) {
162       return (GNMNetworkShadow*)GNMCastToNetwork((GDALMajorObjectH)base);
163   }
164 %}
165 
166 %inline %{
CastToGenericNetwork(GDALMajorObjectShadow * base)167   GNMGenericNetworkShadow* CastToGenericNetwork(GDALMajorObjectShadow* base) {
168       return (GNMGenericNetworkShadow*)GNMCastToGenericNetwork((GDALMajorObjectH)base);
169   }
170 %}
171 #endif
172 
173 /************************************************************************/
174 /*                       GNMNetworkShadow                               */
175 /************************************************************************/
176 
177 %rename (Network) GNMNetworkShadow;
178 
179 class GNMNetworkShadow : public GDALMajorObjectShadow
180 {
GNMNetworkShadow()181     GNMNetworkShadow(){}
182 
183     public:
184 
185     %extend
186     {
~GNMNetworkShadow()187         ~GNMNetworkShadow()
188         {
189             if ( GDALDereferenceDataset( self ) <= 0 ) {
190               GDALClose(self);
191             }
192         }
193 
194 #ifndef SWIGJAVA
195         %apply SWIGTYPE *DISOWN {OGRLayerShadow *layer};
ReleaseResultSet(OGRLayerShadow * layer)196         void ReleaseResultSet(OGRLayerShadow *layer){
197             GDALDatasetReleaseResultSet(self, layer);
198         }
199         %clear OGRLayerShadow *layer;
200 #endif
201 
GetVersion()202         int GetVersion()
203         {
204             return GNMGetVersion(self);
205         }
206 
GetName()207         char const *GetName()
208         {
209             return GNMGetName(self);
210         }
211 
212         %newobject GetFeatureByGlobalFID;
GetFeatureByGlobalFID(GNMGFID GFID)213         OGRFeatureShadow *GetFeatureByGlobalFID (GNMGFID GFID)
214         {
215             return GNMGetFeatureByGlobalFID(self, GFID);
216         }
217 
218         %newobject GetPath;
219         #ifndef SWIGJAVA
220         %feature( "kwargs" ) GetPath;
221         #endif
222         OGRLayerShadow *GetPath (GNMGFID nStartFID, GNMGFID nEndFID,
223                                  GNMGraphAlgorithmType eAlgorithm,
224                                  char **options = 0)
225         {
226             return GNMGetPath(self, nStartFID, nEndFID, eAlgorithm, options);
227         }
228 
DisconnectAll()229         CPLErr DisconnectAll() {
230             return GNMDisconnectAll( self );
231         }
232 
GetProjection()233         char const *GetProjection() {
234             return GDALGetProjectionRef( self );
235         }
236 
GetProjectionRef()237         char const *GetProjectionRef() {
238             return GDALGetProjectionRef( self );
239         }
240 
241         %apply (char **CSL) {char **};
GetFileList()242         char **GetFileList() {
243             return GDALGetFileList( self );
244         }
245         %clear char **;
246 
247         /* Note that datasources own their layers */
248         #ifndef SWIGJAVA
249         %feature( "kwargs" ) CreateLayer;
250         #endif
251         OGRLayerShadow *CreateLayer(const char* name,
252               OSRSpatialReferenceShadow* srs=NULL,
253               OGRwkbGeometryType geom_type=wkbUnknown,
254               char** options=0) {
255             OGRLayerShadow* layer = (OGRLayerShadow*) GDALDatasetCreateLayer( self,
256                                       name,
257                                       srs,
258                                       geom_type,
259                                       options);
260             return layer;
261         }
262 
263         #ifndef SWIGJAVA
264         %feature( "kwargs" ) CopyLayer;
265         #endif
266         %apply Pointer NONNULL {OGRLayerShadow *src_layer};
267         OGRLayerShadow *CopyLayer(OGRLayerShadow *src_layer,
268             const char* new_name,
269             char** options=0) {
270             OGRLayerShadow* layer = (OGRLayerShadow*) GDALDatasetCopyLayer( self,
271                                                       src_layer,
272                                                       new_name,
273                                                       options);
274             return layer;
275         }
276 
DeleteLayer(int index)277         OGRErr DeleteLayer(int index){
278             return GDALDatasetDeleteLayer(self, index);
279         }
280 
GetLayerCount()281         int GetLayerCount() {
282             return GDALDatasetGetLayerCount(self);
283         }
284 
285         #ifdef SWIGJAVA
GetLayerByIndex(int index)286         OGRLayerShadow *GetLayerByIndex( int index ) {
287         #else
288         OGRLayerShadow *GetLayerByIndex( int index=0) {
289         #endif
290         OGRLayerShadow* layer = (OGRLayerShadow*) GDALDatasetGetLayer(self,
291                                                                       index);
292             return layer;
293         }
294 
295         OGRLayerShadow *GetLayerByName( const char* layer_name) {
296             OGRLayerShadow* layer =
297                   (OGRLayerShadow*) GDALDatasetGetLayerByName(self, layer_name);
298             return layer;
299         }
300 
301         bool TestCapability(const char * cap) {
302             return (GDALDatasetTestCapability(self, cap) > 0);
303         }
304 
305         #ifndef SWIGJAVA
306         %feature( "kwargs" ) StartTransaction;
307         #endif
308         OGRErr StartTransaction(int force = FALSE)
309         {
310             return GDALDatasetStartTransaction(self, force);
311         }
312 
313         OGRErr CommitTransaction()
314         {
315             return GDALDatasetCommitTransaction(self);
316         }
317 
318         OGRErr RollbackTransaction()
319         {
320             return GDALDatasetRollbackTransaction(self);
321         }
322 
323     }
324 };
325 
326 /************************************************************************/
327 /*                   GNMGenericNetworkShadow                            */
328 /************************************************************************/
329 
330 %rename (GenericNetwork) GNMGenericNetworkShadow;
331 
332 class GNMGenericNetworkShadow : public GNMNetworkShadow
333 {
GNMGenericNetworkShadow()334     GNMGenericNetworkShadow(){}
335 
336     public:
337 
338     %extend
339     {
~GNMGenericNetworkShadow()340         ~GNMGenericNetworkShadow()
341         {
342             if ( GDALDereferenceDataset( self ) <= 0 ) {
343               GDALClose(self);
344             }
345         }
346 
ConnectFeatures(GNMGFID nSrcFID,GNMGFID nTgtFID,GNMGFID nConFID,double dfCost,double dfInvCost,GNMDirection eDir)347         CPLErr ConnectFeatures (GNMGFID nSrcFID, GNMGFID nTgtFID,
348                                 GNMGFID nConFID, double dfCost,
349                                 double dfInvCost,
350                                 GNMDirection eDir) {
351             return GNMConnectFeatures(self, nSrcFID, nTgtFID,
352                                               nConFID, dfCost, dfInvCost, eDir);
353         }
354 
DisconnectFeatures(GNMGFID nSrcFID,GNMGFID nTgtFID,GNMGFID nConFID)355         CPLErr DisconnectFeatures (GNMGFID nSrcFID, GNMGFID nTgtFID,
356                                    GNMGFID nConFID) {
357             return GNMDisconnectFeatures(self, nSrcFID, nTgtFID,
358                                                            nConFID);
359         }
360 
DisconnectFeaturesWithId(GNMGFID nFID)361         CPLErr DisconnectFeaturesWithId(GNMGFID nFID) {
362             return GNMDisconnectFeaturesWithId(self, nFID);
363         }
364 
ReconnectFeatures(GNMGFID nSrcFID,GNMGFID nTgtFID,GNMGFID nConFID,double dfCost,double dfInvCost,GNMDirection eDir)365         CPLErr ReconnectFeatures (GNMGFID nSrcFID, GNMGFID nTgtFID, GNMGFID nConFID,
366                                   double dfCost, double dfInvCost,
367                                   GNMDirection eDir) {
368             return GNMReconnectFeatures(self, nSrcFID, nTgtFID, nConFID, dfCost, dfInvCost, eDir);
369         }
370 
371         %apply Pointer NONNULL {const char * pszRuleStr};
CreateRule(const char * pszRuleStr)372         CPLErr CreateRule (const char *pszRuleStr) {
373             return GNMCreateRule(self, pszRuleStr);
374         }
375         %clear const char * pszRuleStr;
376 
DeleteAllRules()377         CPLErr DeleteAllRules() {
378             return GNMDeleteAllRules(self);
379         }
380 
381         %apply Pointer NONNULL {const char * pszRuleStr};
DeleteRule(const char * pszRuleStr)382         CPLErr DeleteRule(const char *pszRuleStr) {
383             return GNMDeleteRule(self, pszRuleStr);
384         }
385         %clear const char * pszRuleStr;
386 
387         %apply (char **CSL) {char **};
GetRules()388         char** GetRules() {
389             return GNMGetRules(self);
390         }
391         %clear char **;
392 
393         #ifndef SWIGJAVA
394         %feature( "kwargs" ) ConnectPointsByLines;
395         #endif
396         %apply (char **options) { char ** papszLayerList };
ConnectPointsByLines(char ** papszLayerList,double dfTolerance,double dfCost,double dfInvCost,GNMDirection eDir)397         CPLErr ConnectPointsByLines (char **papszLayerList,
398                                          double dfTolerance,
399                                          double dfCost,
400                                          double dfInvCost,
401                                          GNMDirection eDir) {
402             return GNMConnectPointsByLines(self, papszLayerList, dfTolerance, dfCost, dfInvCost, eDir);
403         }
404         %clear char **papszLayerList;
405 
ChangeBlockState(GNMGFID nFID,bool bIsBlock)406         CPLErr ChangeBlockState (GNMGFID nFID, bool bIsBlock) {
407             return GNMChangeBlockState(self, nFID, bIsBlock);
408         }
409 
410         CPLErr ChangeAllBlockState (bool bIsBlock = false) {
411             return GNMChangeAllBlockState(self, bIsBlock);
412         }
413     }
414 };
415