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