1 : /******************************************************************************
2 : * $Id: ogr_xplane_apt_reader.h
3 : *
4 : * Project: X-Plane apt.dat file reader headers
5 : * Purpose: Definition of classes for X-Plane apt.dat file reader
6 : * Author: Even Rouault, even dot rouault at mines dash paris dot org
7 : *
8 : ******************************************************************************
9 : * Copyright (c) 2008, Even Rouault
10 : *
11 : * Permission is hereby granted, free of charge, to any person obtaining a
12 : * copy of this software and associated documentation files (the "Software"),
13 : * to deal in the Software without restriction, including without limitation
14 : * the rights to use, copy, modify, merge, publish, distribute, sublicense,
15 : * and/or sell copies of the Software, and to permit persons to whom the
16 : * Software is furnished to do so, subject to the following conditions:
17 : *
18 : * The above copyright notice and this permission notice shall be included
19 : * in all copies or substantial portions of the Software.
20 : *
21 : * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
22 : * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
23 : * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
24 : * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
25 : * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
26 : * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
27 : * DEALINGS IN THE SOFTWARE.
28 : ****************************************************************************/
29 :
30 : #ifndef _OGR_XPLANE_APT_READER_H_INCLUDED
31 : #define _OGR_XPLANE_APT_READER_H_INCLUDED
32 :
33 : #include "ogr_xplane.h"
34 : #include "ogr_xplane_reader.h"
35 :
36 : /************************************************************************/
37 : /* OGRXPlaneAPTLayer */
38 : /************************************************************************/
39 :
40 :
41 : class OGRXPlaneAPTLayer : public OGRXPlaneLayer
42 2 : {
43 : public:
44 : OGRXPlaneAPTLayer();
45 :
46 : /* If the airport has a tower, its coordinates are the tower coordinates */
47 : /* If it has no tower, then we pick up the coordinates of the threshold of its first found runway */
48 : OGRFeature* AddFeature(const char* pszAptICAO,
49 : const char* pszAptName,
50 : int nAPTType,
51 : double dfElevation,
52 : int bHasCoordinates = FALSE,
53 : double dfLat = 0,
54 : double dfLon = 0,
55 : int bHasTower = FALSE,
56 : double dfHeightTower = 0,
57 : const char* pszTowerName = NULL);
58 : };
59 :
60 :
61 : /************************************************************************/
62 : /* OGRXPlaneRunwayThresholdLayer */
63 : /************************************************************************/
64 :
65 : static const sEnumerationElement runwaySurfaceType[] =
66 : {
67 : { 1, "Asphalt" },
68 : { 2, "Concrete" },
69 : { 3, "Turf/grass" },
70 : { 4, "Dirt" },
71 : { 5, "Gravel" },
72 : { 6, "Asphalt" /* helipad V810 */},
73 : { 7, "Concrete" /* helipad V810 */},
74 : { 8, "Turf/grass" /* helipad V810 */},
75 : { 9, "Dirt" /* helipad V810 */},
76 : { 10, "Asphalt" /* taxiway V810 */ },
77 : { 11, "Concrete" /* taxiway V810 */ },
78 : { 12, "Dry lakebed" },
79 : { 13, "Water" },
80 : { 14, "Snow/ice" /* V850 */ },
81 : { 15, "Transparent" /* V850 */ }
82 : };
83 :
84 : static const sEnumerationElement runwayShoulderType[] =
85 : {
86 : { 0, "None" },
87 : { 1, "Asphalt" },
88 : { 2, "Concrete" }
89 : };
90 :
91 : static const sEnumerationElement runwayMarkingType[] =
92 : {
93 : { 0, "None" },
94 : { 1, "Visual" },
95 : { 2, "Non-precision approach" },
96 : { 3, "Precision approach" },
97 : { 4, "UK-style non-precision" },
98 : { 5, "UK-style precision" }
99 : };
100 :
101 : static const sEnumerationElement approachLightingType[] =
102 : {
103 : { 0, "None" },
104 : { 1, "ALSF-I" },
105 : { 2, "ALSF-II" },
106 : { 3, "Calvert" },
107 : { 4, "Calvert ISL Cat II and III" },
108 : { 5, "SSALR" },
109 : { 6, "SSALF" },
110 : { 7, "SALS" },
111 : { 8, "MALSR" },
112 : { 9, "MALSF" },
113 : { 10, "MALS" },
114 : { 11, "ODALS" },
115 : { 12, "RAIL" }
116 : };
117 :
118 : static const sEnumerationElement approachLightingTypeV810[] =
119 : {
120 : { 1, "None" },
121 : { 2, "SSALS" },
122 : { 3, "SALSF" },
123 : { 4, "ALSF-I" },
124 : { 5, "ALSF-II" },
125 : { 6, "ODALS" },
126 : { 7, "Calvert" },
127 : { 8, "Calvert ISL Cat II and III" },
128 : };
129 :
130 : static const sEnumerationElement runwayEdgeLigthingType[] =
131 : {
132 : { 0, "None" },
133 : { 1, "LIRL" }, /* proposed for V90x */
134 : { 2, "MIRL" },
135 : { 3, "HIRL" } /* proposed for V90x */
136 : };
137 :
138 : static const sEnumerationElement runwayREILType[] =
139 : {
140 : { 0, "None" },
141 : { 1, "Omni-directional" },
142 : { 2, "Unidirectional" }
143 : };
144 :
145 : static const sEnumerationElement runwayVisualApproachPathIndicatorTypeV810[] =
146 : {
147 : { 1, "None" },
148 : { 2, "VASI" },
149 : { 3, "PAPI Right" },
150 : { 4, "Space Shuttle PAPI" }
151 : };
152 :
153 649 : DEFINE_XPLANE_ENUMERATION(RunwaySurfaceEnumeration, runwaySurfaceType);
154 649 : DEFINE_XPLANE_ENUMERATION(RunwayShoulderEnumeration, runwayShoulderType);
155 649 : DEFINE_XPLANE_ENUMERATION(RunwayMarkingEnumeration, runwayMarkingType);
156 649 : DEFINE_XPLANE_ENUMERATION(RunwayApproachLightingEnumeration, approachLightingType);
157 649 : DEFINE_XPLANE_ENUMERATION(RunwayApproachLightingEnumerationV810, approachLightingTypeV810);
158 649 : DEFINE_XPLANE_ENUMERATION(RunwayEdgeLightingEnumeration, runwayEdgeLigthingType);
159 649 : DEFINE_XPLANE_ENUMERATION(RunwayREILEnumeration, runwayREILType);
160 649 : DEFINE_XPLANE_ENUMERATION(RunwayVisualApproachPathIndicatorEnumerationV810, runwayVisualApproachPathIndicatorTypeV810);
161 :
162 : class OGRXPlaneRunwayThresholdLayer : public OGRXPlaneLayer
163 2 : {
164 : public:
165 : OGRXPlaneRunwayThresholdLayer();
166 :
167 : OGRFeature* AddFeature(const char* pszAptICAO,
168 : const char* pszRwyNum,
169 : double dfLat,
170 : double dfLon,
171 : double dfWidth,
172 : const char* pszSurfaceType,
173 : const char* pszShoulderType,
174 : double dfSmoothness,
175 : int bHasCenterLineLights,
176 : const char* pszEdgeLighting,
177 : int bHasDistanceRemainingSigns,
178 : double dfDisplacedThresholdLength,
179 : double dfStopwayLength,
180 : const char* pszMarkings,
181 : const char* pszApproachLightingCode,
182 : int bHasTouchdownLights,
183 : const char* pszREIL);
184 :
185 : /* Set a few computed values */
186 : void SetRunwayLengthAndHeading(OGRFeature* poFeature,
187 : double dfLength,
188 : double dfHeading);
189 :
190 : OGRFeature* AddFeatureFromNonDisplacedThreshold(OGRFeature* poNonDisplacedThresholdFeature);
191 : };
192 :
193 : /************************************************************************/
194 : /* OGRXPlaneRunwayLayer */
195 : /************************************************************************/
196 :
197 :
198 : class OGRXPlaneRunwayLayer : public OGRXPlaneLayer
199 2 : {
200 : public:
201 : OGRXPlaneRunwayLayer();
202 :
203 : OGRFeature* AddFeature(const char* pszAptICAO,
204 : const char* pszRwyNum1,
205 : const char* pszRwyNum2,
206 : double dfLat1,
207 : double dfLon1,
208 : double dfLat2,
209 : double dfLon2,
210 : double dfWidth,
211 : const char* pszSurfaceType,
212 : const char* pszShoulderType,
213 : double dfSmoothness,
214 : int bHasCenterLineLights,
215 : const char* pszEdgeLighting,
216 : int bHasDistanceRemainingSigns);
217 : };
218 :
219 :
220 : /************************************************************************/
221 : /* OGRXPlaneStopwayLayer */
222 : /************************************************************************/
223 :
224 :
225 : class OGRXPlaneStopwayLayer : public OGRXPlaneLayer
226 2 : {
227 : public:
228 : OGRXPlaneStopwayLayer();
229 :
230 : OGRFeature* AddFeature(const char* pszAptICAO,
231 : const char* pszRwyNum,
232 : double dfLatThreshold,
233 : double dfLonThreshold,
234 : double dfRunwayHeading,
235 : double dfWidth,
236 : double dfStopwayLength);
237 : };
238 :
239 : /************************************************************************/
240 : /* OGRXPlaneWaterRunwayThresholdLayer */
241 : /************************************************************************/
242 :
243 :
244 : class OGRXPlaneWaterRunwayThresholdLayer : public OGRXPlaneLayer
245 2 : {
246 : public:
247 : OGRXPlaneWaterRunwayThresholdLayer();
248 :
249 : OGRFeature* AddFeature(const char* pszAptICAO,
250 : const char* pszRwyNum,
251 : double dfLat,
252 : double dfLon,
253 : double dfWidth,
254 : int bBuoys);
255 :
256 : /* Set a few computed values */
257 : void SetRunwayLengthAndHeading(OGRFeature* poFeature,
258 : double dfLength,
259 : double dfHeading);
260 : };
261 :
262 :
263 : /************************************************************************/
264 : /* OGRXPlaneWaterRunwayLayer */
265 : /************************************************************************/
266 :
267 : /* Polygonal object */
268 :
269 : class OGRXPlaneWaterRunwayLayer : public OGRXPlaneLayer
270 2 : {
271 : public:
272 : OGRXPlaneWaterRunwayLayer();
273 :
274 : OGRFeature* AddFeature(const char* pszAptICAO,
275 : const char* pszRwyNum1,
276 : const char* pszRwyNum2,
277 : double dfLat1,
278 : double dfLon1,
279 : double dfLat2,
280 : double dfLon2,
281 : double dfWidth,
282 : int bBuoys);
283 : };
284 :
285 :
286 : /************************************************************************/
287 : /* OGRXPlaneHelipadLayer */
288 : /************************************************************************/
289 :
290 : static const sEnumerationElement helipadEdgeLigthingType[] =
291 : {
292 : { 0, "None" },
293 : { 1, "Yellow" },
294 : { 2, "White" }, /* proposed for V90x */
295 : { 3, "Red" } /* proposed for V90x */
296 : };
297 :
298 649 : DEFINE_XPLANE_ENUMERATION(HelipadEdgeLightingEnumeration, helipadEdgeLigthingType);
299 :
300 : class OGRXPlaneHelipadLayer : public OGRXPlaneLayer
301 2 : {
302 : public:
303 : OGRXPlaneHelipadLayer();
304 :
305 : OGRFeature* AddFeature(const char* pszAptICAO,
306 : const char* pszHelipadNum,
307 : double dfLat,
308 : double dfLon,
309 : double dfTrueHeading,
310 : double dfLength,
311 : double dfWidth,
312 : const char* pszSurfaceType,
313 : const char* pszMarkings,
314 : const char* pszShoulderType,
315 : double dfSmoothness,
316 : const char* pszEdgeLighing);
317 : };
318 :
319 : /************************************************************************/
320 : /* OGRXPlaneHelipadPolygonLayer */
321 : /************************************************************************/
322 :
323 :
324 : class OGRXPlaneHelipadPolygonLayer : public OGRXPlaneLayer
325 2 : {
326 : public:
327 : OGRXPlaneHelipadPolygonLayer();
328 :
329 : OGRFeature* AddFeature(const char* pszAptICAO,
330 : const char* pszHelipadNum,
331 : double dfLat,
332 : double dfLon,
333 : double dfTrueHeading,
334 : double dfLength,
335 : double dfWidth,
336 : const char* pszSurfaceType,
337 : const char* pszMarkings,
338 : const char* pszShoulderType,
339 : double dfSmoothness,
340 : const char* pszEdgeLighing);
341 : };
342 :
343 :
344 : /************************************************************************/
345 : /* OGRXPlaneTaxiwayRectangleLayer */
346 : /************************************************************************/
347 :
348 :
349 : class OGRXPlaneTaxiwayRectangleLayer : public OGRXPlaneLayer
350 2 : {
351 : public:
352 : OGRXPlaneTaxiwayRectangleLayer();
353 :
354 : OGRFeature* AddFeature(const char* pszAptICAO,
355 : double dfLat,
356 : double dfLon,
357 : double dfTrueHeading,
358 : double dfLength,
359 : double dfWidth,
360 : const char* pszSurfaceType,
361 : double dfSmoothness,
362 : int bBlueEdgeLights);
363 : };
364 :
365 :
366 : /************************************************************************/
367 : /* OGRXPlanePavementLayer */
368 : /************************************************************************/
369 :
370 :
371 : class OGRXPlanePavementLayer : public OGRXPlaneLayer
372 2 : {
373 : public:
374 : OGRXPlanePavementLayer();
375 :
376 : OGRFeature* AddFeature(const char* pszAptICAO,
377 : const char* pszPavementName,
378 : const char* pszSurfaceType,
379 : double dfSmoothness,
380 : double dfTextureHeading,
381 : OGRPolygon* poPolygon);
382 : };
383 :
384 : /************************************************************************/
385 : /* OGRXPlaneAPTBoundaryLayer */
386 : /************************************************************************/
387 :
388 :
389 : class OGRXPlaneAPTBoundaryLayer : public OGRXPlaneLayer
390 2 : {
391 : public:
392 : OGRXPlaneAPTBoundaryLayer();
393 :
394 : OGRFeature* AddFeature(const char* pszAptICAO,
395 : const char* pszBoundaryName,
396 : OGRPolygon* poPolygon);
397 : };
398 :
399 :
400 : /************************************************************************/
401 : /* OGRXPlaneAPTLinearFeatureLayer */
402 : /************************************************************************/
403 :
404 :
405 : class OGRXPlaneAPTLinearFeatureLayer : public OGRXPlaneLayer
406 2 : {
407 : public:
408 : OGRXPlaneAPTLinearFeatureLayer();
409 :
410 : OGRFeature* AddFeature(const char* pszAptICAO,
411 : const char* pszLinearFeatureName,
412 : OGRMultiLineString* poMultilineString);
413 : };
414 :
415 :
416 : /************************************************************************/
417 : /* OGRXPlaneATCFreqLayer */
418 : /************************************************************************/
419 :
420 : class OGRXPlaneATCFreqLayer : public OGRXPlaneLayer
421 2 : {
422 : public:
423 : OGRXPlaneATCFreqLayer();
424 :
425 : OGRFeature* AddFeature(const char* pszAptICAO,
426 : const char* pszATCType,
427 : const char* pszATCFreqName,
428 : double dfFrequency);
429 : };
430 :
431 :
432 : /************************************************************************/
433 : /* OGRXPlaneStartupLocationLayer */
434 : /************************************************************************/
435 :
436 : class OGRXPlaneStartupLocationLayer : public OGRXPlaneLayer
437 2 : {
438 : public:
439 : OGRXPlaneStartupLocationLayer();
440 :
441 : OGRFeature* AddFeature(const char* pszAptICAO,
442 : const char* pszName,
443 : double dfLat,
444 : double dfLon,
445 : double dfTrueHeading);
446 : };
447 :
448 : /************************************************************************/
449 : /* OGRXPlaneAPTLightBeaconLayer */
450 : /************************************************************************/
451 :
452 :
453 : static const sEnumerationElement APTLightBeaconColorType[] =
454 : {
455 : { 0, "None" },
456 : { 1, "White-green" }, /* land airport */
457 : { 2, "White-yellow" }, /* seaplane base */
458 : { 3, "Green-yellow-white" }, /* heliports */
459 : { 4, "White-white-green" } /* military field */
460 : };
461 :
462 649 : DEFINE_XPLANE_ENUMERATION(APTLightBeaconColorEnumeration, APTLightBeaconColorType);
463 :
464 : class OGRXPlaneAPTLightBeaconLayer : public OGRXPlaneLayer
465 2 : {
466 : public:
467 : OGRXPlaneAPTLightBeaconLayer();
468 :
469 : OGRFeature* AddFeature(const char* pszAptICAO,
470 : const char* pszName,
471 : double dfLat,
472 : double dfLon,
473 : const char* pszColor);
474 : };
475 :
476 : /************************************************************************/
477 : /* OGRXPlaneAPTWindsockLayer */
478 : /************************************************************************/
479 :
480 : class OGRXPlaneAPTWindsockLayer : public OGRXPlaneLayer
481 2 : {
482 : public:
483 : OGRXPlaneAPTWindsockLayer();
484 :
485 : OGRFeature* AddFeature(const char* pszAptICAO,
486 : const char* pszName,
487 : double dfLat,
488 : double dfLon,
489 : int bIsIllumnited);
490 : };
491 :
492 :
493 : /************************************************************************/
494 : /* OGRXPlaneTaxiwaySignLayer */
495 : /************************************************************************/
496 :
497 : class OGRXPlaneTaxiwaySignLayer : public OGRXPlaneLayer
498 2 : {
499 : public:
500 : OGRXPlaneTaxiwaySignLayer();
501 :
502 : OGRFeature* AddFeature(const char* pszAptICAO,
503 : const char* pszText,
504 : double dfLat,
505 : double dfLon,
506 : double dfHeading,
507 : int nSize);
508 : };
509 :
510 : /************************************************************************/
511 : /* OGRXPlane_VASI_PAPI_WIGWAG_Layer */
512 : /************************************************************************/
513 :
514 : static const sEnumerationElement VASI_PAPI_WIGWAG_Type[] =
515 : {
516 : { 1, "VASI" },
517 : { 2, "PAPI Left" },
518 : { 3, "PAPI Right" },
519 : { 4, "Space Shuttle PAPI" },
520 : { 5, "Tri-colour VASI" },
521 : { 6, "Wig-Wag lights" }
522 : };
523 :
524 649 : DEFINE_XPLANE_ENUMERATION(VASI_PAPI_WIGWAG_Enumeration, VASI_PAPI_WIGWAG_Type);
525 :
526 : class OGRXPlane_VASI_PAPI_WIGWAG_Layer : public OGRXPlaneLayer
527 2 : {
528 : public:
529 : OGRXPlane_VASI_PAPI_WIGWAG_Layer();
530 :
531 : OGRFeature* AddFeature(const char* pszAptICAO,
532 : const char* pszRwyNum,
533 : const char* pszObjectType,
534 : double dfLat,
535 : double dfLon,
536 : double dfHeading,
537 : double dfVisualGlidePathAngle);
538 : };
539 :
540 :
541 :
542 : enum
543 : {
544 : APT_AIRPORT_HEADER = 1,
545 : APT_RUNWAY_TAXIWAY_V_810 = 10,
546 : APT_TOWER = 14,
547 : APT_STARTUP_LOCATION = 15,
548 : APT_SEAPLANE_HEADER = 16,
549 : APT_HELIPORT_HEADER = 17,
550 : APT_LIGHT_BEACONS = 18,
551 : APT_WINDSOCKS = 19,
552 : APT_TAXIWAY_SIGNS = 20,
553 : APT_VASI_PAPI_WIGWAG = 21,
554 : APT_ATC_AWOS_ASOS_ATIS = 50,
555 : APT_ATC_CTAF = 51,
556 : APT_ATC_CLD = 52,
557 : APT_ATC_GND = 53,
558 : APT_ATC_TWR = 54,
559 : APT_ATC_APP = 55,
560 : APT_ATC_DEP = 56,
561 : APT_RUNWAY = 100,
562 : APT_WATER_RUNWAY = 101,
563 : APT_HELIPAD = 102,
564 : APT_PAVEMENT_HEADER = 110,
565 : APT_NODE = 111,
566 : APT_NODE_WITH_BEZIER = 112,
567 : APT_NODE_CLOSE = 113,
568 : APT_NODE_CLOSE_WITH_BEZIER = 114,
569 : APT_NODE_END = 115,
570 : APT_NODE_END_WITH_BEZIER = 116,
571 : APT_LINEAR_HEADER = 120,
572 : APT_BOUNDARY_HEADER = 130,
573 : };
574 :
575 :
576 :
577 : /************************************************************************/
578 : /* OGRXPlaneAptReader */
579 : /************************************************************************/
580 :
581 : class OGRXPlaneAptReader : public OGRXPlaneReader
582 2 : {
583 : private:
584 : OGRXPlaneAPTLayer* poAPTLayer;
585 : OGRXPlaneRunwayLayer* poRunwayLayer;
586 : OGRXPlaneStopwayLayer* poStopwayLayer;
587 : OGRXPlaneRunwayThresholdLayer* poRunwayThresholdLayer;
588 : OGRXPlaneWaterRunwayLayer* poWaterRunwayLayer;
589 : OGRXPlaneWaterRunwayThresholdLayer* poWaterRunwayThresholdLayer;
590 : OGRXPlaneHelipadLayer* poHelipadLayer;
591 : OGRXPlaneHelipadPolygonLayer* poHelipadPolygonLayer;
592 : OGRXPlaneTaxiwayRectangleLayer* poTaxiwayRectangleLayer;
593 : OGRXPlanePavementLayer* poPavementLayer;
594 : OGRXPlaneAPTBoundaryLayer* poAPTBoundaryLayer;
595 : OGRXPlaneAPTLinearFeatureLayer* poAPTLinearFeatureLayer;
596 : OGRXPlaneATCFreqLayer* poATCFreqLayer;
597 : OGRXPlaneStartupLocationLayer* poStartupLocationLayer;
598 : OGRXPlaneAPTLightBeaconLayer* poAPTLightBeaconLayer;
599 : OGRXPlaneAPTWindsockLayer* poAPTWindsockLayer;
600 : OGRXPlaneTaxiwaySignLayer* poTaxiwaySignLayer;
601 : OGRXPlane_VASI_PAPI_WIGWAG_Layer* poVASI_PAPI_WIGWAG_Layer;
602 :
603 : int bAptHeaderFound;
604 : double dfElevation;
605 : int bControlTower;
606 : CPLString osAptICAO;
607 : CPLString osAptName;
608 : int nAPTType;
609 :
610 : int bTowerFound;
611 : double dfLatTower, dfLonTower;
612 : double dfHeightTower;
613 : CPLString osTowerName;
614 :
615 : int bRunwayFound;
616 : double dfLatFirstRwy , dfLonFirstRwy;
617 :
618 : int bResumeLine;
619 :
620 : private:
621 : OGRXPlaneAptReader();
622 :
623 : void ParseAptHeaderRecord();
624 : void ParsePavement();
625 : void ParseAPTBoundary();
626 : void ParseAPTLinearFeature();
627 : void ParseRunwayTaxiwayV810Record();
628 : void ParseRunwayRecord();
629 : void ParseWaterRunwayRecord();
630 : void ParseHelipadRecord();
631 : void ParseTowerRecord();
632 : void ParseATCRecord(int nType);
633 : void ParseStartupLocationRecord();
634 : void ParseLightBeaconRecord();
635 : void ParseWindsockRecord();
636 : void ParseTaxiwaySignRecord();
637 : void ParseVasiPapiWigWagRecord();
638 :
639 : OGRGeometry* FixPolygonTopology(OGRPolygon& polygon);
640 : int ParsePolygonalGeometry(OGRGeometry** ppoGeom);
641 : int ParseLinearGeometry(OGRMultiLineString& multilinestring, int* pbIsValid);
642 :
643 : static void AddBezierCurve (OGRLineString& lineString,
644 : double dfLatA, double dfLonA,
645 : double dfCtrPtLatA, double dfCtrPtLonA,
646 : double dfSymCtrlPtLatB, double dfSymCtrlPtLonB,
647 : double dfLatB, double dfLonB);
648 : static void AddBezierCurve (OGRLineString& lineString,
649 : double dfLatA, double dfLonA,
650 : double dfCtrPtLat, double dfCtrPtLon,
651 : double dfLatB, double dfLonB);
652 :
653 : protected:
654 : virtual void Read();
655 :
656 : public:
657 : OGRXPlaneAptReader( OGRXPlaneDataSource* poDataSource );
658 : virtual OGRXPlaneReader* CloneForLayer(OGRXPlaneLayer* poLayer);
659 : virtual int IsRecognizedVersion( const char* pszVersionString);
660 : virtual void Rewind();
661 : };
662 :
663 : #endif
|