├── .gitignore ├── package.json ├── example_files ├── input │ ├── openaip_hotspot_france_fr.dat │ ├── openaip_hotspot_france_fr.cup │ ├── openaip_navaid_france_fr.dat │ ├── openaip_navaid_france_fr.cup │ ├── openaip_hotspot_france_fr.aip │ └── openaip_navaid_france_fr.aip └── output │ ├── hotspots.geojson │ └── navaids.geojson ├── README.md ├── index.js └── parser.js /.gitignore: -------------------------------------------------------------------------------- 1 | # node.js 2 | # 3 | node_modules/ 4 | node_modules*/ 5 | npm-debug.log 6 | 7 | # ignore input and output folder contents. 8 | output/* 9 | input/* 10 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "openaip2geojson", 3 | "version": "1.0.0", 4 | "description": "A simple parser to transform OpenAIP (.aip) files into Geojson files", 5 | "main": "index.js", 6 | "scripts": { 7 | "test": "echo \"Error: no test specified\" && exit 1" 8 | }, 9 | "author": "Knudian", 10 | "license": "MIT", 11 | "dependencies": { 12 | "colors": "^1.1.2", 13 | "fs": "0.0.1-security", 14 | "geojson": "^0.4.0", 15 | "q": "^1.4.1", 16 | "xml2js": "^0.4.17" 17 | }, 18 | "repository": { 19 | "type": "git", 20 | "url": "git@github.com:Knudian/OpenAIP2GeoJSON.git" 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /example_files/input/openaip_hotspot_france_fr.dat: -------------------------------------------------------------------------------- 1 | *** 2 | * 3 | * Exported on: 18.11.2016 4 | * This data is owned by Butterfly Avionics GmbH and licensed under the CC BY-NC-SA, 5 | * not to be used for commercial purposes. For more information on commercial licensing visit 6 | * 7 | * http://www.openaip.net/commercial-licensing 8 | * 9 | * openAIP data is not certified and must not be used for primary navigation or flight planning. 10 | * NEVER RELY ON OPENAIP DATA. openAIP data contains errors. Using openAIP data may 11 | * result in serious injury or death, use at your own risk! 12 | * 13 | * OPENAIP OFFERS THE WORK AS-IS AND MAKES NO REPRESENTATIONS OR WARRANTIES OF ANY KIND 14 | * CONCERNING THE WORK, EXPRESS, IMPLIED, STATUTORY OR OTHERWISE, INCLUDING, WITHOUT LIMITATION, 15 | * WARRANTIES OF TITLE, MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, NONINFRINGEMENT, OR 16 | * THE ABSENCE OF LATENT OR OTHER DEFECTS, ACCURACY, OR THE PRESENCE OF ABSENCE OF ERRORS, 17 | * WHETHER OR NOT DISCOVERABLE. SOME JURISDICTIONS DO NOT ALLOW THE EXCLUSION OF IMPLIED 18 | * WARRANTIES, SO THIS EXCLUSION MAY NOT APPLY TO YOU. 19 | * 20 | * EXCEPT TO THE EXTENT REQUIRED BY APPLICABLE LAW, IN NO EVENT WILL OPENAIP BE LIABLE TO YOU ON 21 | * ANY LEGAL THEORY FOR ANY SPECIAL, INCIDENTAL, CONSEQUENTIAL, PUNITIVE OR EXEMPLARY DAMAGES 22 | * ARISING OUT OF THIS LICENSE OR THE USE OF THE WORK, EVEN IF OPENAIP HAS BEEN ADVISED OF THE 23 | * POSSIBILITY OF SUCH DAMAGES. 24 | * 25 | *** 26 | 27 | ************************** 28 | * 29 | * OPENAIP HOTSPOTS EXPORT 30 | * 31 | * VERSION= 1327395 32 | * 33 | ************************** 34 | 1,43:58:08N,06:14:52E,1573.0M,T,Beynes,Hotspot|Reliability 65%|irregular interval 35 | 2,44:10:36N,06:28:10E,1932.0M,T,Carton,Hotspot|Reliability 65%|irregular interval 36 | 3,44:20:17N,06:39:40E,2535.0M,T,Chapeau de Gendarme,Hotspot|Reliability 65%|irregular interval 37 | 4,44:07:11N,06:25:17E,2239.0M,T,Cheval Blanc,Hotspot|Reliability 65%|irregular interval 38 | 5,44:01:37N,06:19:01E,1555.0M,T,Coupe,Hotspot|Reliability 65%|irregular interval 39 | 6,44:11:37N,06:17:40E,1424.0M,T,Crête de Leman (Bleyeul),Hotspot|Reliability 65%|irregular interval 40 | 7,43:57:45N,06:33:23E,1620.0M,T,Crête de Serres,Hotspot|Reliability 65%|irregular interval 41 | 8,43:50:40N,06:36:07E,1869.0M,T,Crête du Teillon,Hotspot|Reliability 65%|irregular interval 42 | 9,44:56:30N,06:38:38E,2609.0M,T,Crêtes de Peyrolle,Hotspot|Reliability 65%|irregular interval 43 | 10,44:24:34N,06:23:01E,2410.0M,T,Dormillouse,Hotspot|Reliability 65%|irregular interval 44 | 11,44:26:06N,06:39:14E,2746.0M,T,Grand Bérard,Hotspot|Reliability 65%|irregular interval 45 | 12,44:17:25N,06:38:15E,2762.0M,T,Grand Cheval de Bois,Hotspot|Reliability 65%|irregular interval 46 | 13,43:48:03N,06:57:56E,1000.0M,T,Gréolières,Hotspot|Reliability 65%|nearly constant 47 | 14,46:07:42N,06:34:24E,1980.0M,T,Marcelly,Hotspot|Reliability 65%|irregular interval 48 | 15,43:53:56N,06:15:09E,1667.0M,T,Montdenier,Hotspot|Reliability 65%|irregular interval 49 | 16,44:35:14N,06:25:57E,2478.0M,T,Mont Guillaume,Hotspot|Reliability 65%|irregular interval 50 | 17,44:29:12N,06:23:57E,1961.0M,T,Morgon,Hotspot|Reliability 65%|irregular interval 51 | 18,44:15:03N,06:23:53E,1978.0M,T,Mte. de la Grisonnière,Hotspot|Reliability 65%|irregular interval 52 | 19,45:33:02N,05:59:48E,700.0M,T,Pente de la chapelle (Challes),Hotspot|Reliability 65%|nearly constant 53 | 20,44:41:43N,06:39:45E,2176.0M,T,Prachaval,Hotspot|Reliability 65%|scheduled interval 54 | 21,44:13:03N,06:39:42E,2335.0M,T,Simmonet des Graux,Hotspot|Reliability 65%|irregular interval 55 | 22,44:51:07N,06:32:02E,2758.0M,T,Tête d'Amont,Hotspot|Reliability 65%|irregular interval 56 | 23,44:36:37N,06:23:09E,2598.0M,T,Tête de Lucy,Hotspot|Reliability 65%|irregular interval 57 | 24,44:26:09N,06:46:20E,2558.0M,T,Tête de Siguret,Hotspot|Reliability 65%|irregular interval 58 | 25,44:46:25N,06:37:06E,2520.0M,T,Tête du Peyron,Hotspot|Reliability 65%|scheduled interval 59 | 26,44:11:55N,06:29:43E,1919.0M,T,Vachière,Hotspot|Reliability 65%|irregular interval 60 | -------------------------------------------------------------------------------- /example_files/input/openaip_hotspot_france_fr.cup: -------------------------------------------------------------------------------- 1 | *** 2 | * 3 | * Exported on: 18.11.2016 4 | * This data is owned by Butterfly Avionics GmbH and licensed under the CC BY-NC-SA, 5 | * not to be used for commercial purposes. For more information on commercial licensing visit 6 | * 7 | * http://www.openaip.net/commercial-licensing 8 | * 9 | * openAIP data is not certified and must not be used for primary navigation or flight planning. 10 | * NEVER RELY ON OPENAIP DATA. openAIP data contains errors. Using openAIP data may 11 | * result in serious injury or death, use at your own risk! 12 | * 13 | * OPENAIP OFFERS THE WORK AS-IS AND MAKES NO REPRESENTATIONS OR WARRANTIES OF ANY KIND 14 | * CONCERNING THE WORK, EXPRESS, IMPLIED, STATUTORY OR OTHERWISE, INCLUDING, WITHOUT LIMITATION, 15 | * WARRANTIES OF TITLE, MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, NONINFRINGEMENT, OR 16 | * THE ABSENCE OF LATENT OR OTHER DEFECTS, ACCURACY, OR THE PRESENCE OF ABSENCE OF ERRORS, 17 | * WHETHER OR NOT DISCOVERABLE. SOME JURISDICTIONS DO NOT ALLOW THE EXCLUSION OF IMPLIED 18 | * WARRANTIES, SO THIS EXCLUSION MAY NOT APPLY TO YOU. 19 | * 20 | * EXCEPT TO THE EXTENT REQUIRED BY APPLICABLE LAW, IN NO EVENT WILL OPENAIP BE LIABLE TO YOU ON 21 | * ANY LEGAL THEORY FOR ANY SPECIAL, INCIDENTAL, CONSEQUENTIAL, PUNITIVE OR EXEMPLARY DAMAGES 22 | * ARISING OUT OF THIS LICENSE OR THE USE OF THE WORK, EVEN IF OPENAIP HAS BEEN ADVISED OF THE 23 | * POSSIBILITY OF SUCH DAMAGES. 24 | * 25 | *** 26 | 27 | name,country,lat,lon,elev,desc 28 | "Beynes","BEYNE",FR,4358.128N,00614.861E,1573.0m,1,,,"","Hotspot, Reliability 65%, irregular interval" 29 | "Carton","CARTO",FR,4410.592N,00628.159E,1932.0m,1,,,"","Hotspot, Reliability 65%, irregular interval" 30 | "Chapeau de Gendarme","CHAPE",FR,4420.290N,00639.662E,2535.0m,1,,,"","Hotspot, Reliability 65%, irregular interval" 31 | "Cheval Blanc","CHEVA",FR,4407.175N,00625.284E,2239.0m,1,,,"","Hotspot, Reliability 65%, irregular interval" 32 | "Coupe","COUPE",FR,4401.618N,00619.022E,1555.0m,1,,,"","Hotspot, Reliability 65%, irregular interval" 33 | "Crête de Leman (Bleyeul)","CRêT",FR,4411.616N,00617.662E,1424.0m,1,,,"","Hotspot, Reliability 65%, irregular interval" 34 | "Crête de Serres","CRêT",FR,4357.750N,00633.380E,1620.0m,1,,,"","Hotspot, Reliability 65%, irregular interval" 35 | "Crête du Teillon","CRêT",FR,4350.671N,00636.109E,1869.0m,1,,,"","Hotspot, Reliability 65%, irregular interval" 36 | "Crêtes de Peyrolle","CRêT",FR,4456.500N,00638.633E,2609.0m,1,,,"","Hotspot, Reliability 65%, irregular interval" 37 | "Dormillouse","DORMI",FR,4424.560N,00623.018E,2410.0m,1,,,"","Hotspot, Reliability 65%, irregular interval" 38 | "Grand Bérard","GRAND",FR,4426.105N,00639.240E,2746.0m,1,,,"","Hotspot, Reliability 65%, irregular interval" 39 | "Grand Cheval de Bois","GRAND",FR,4417.424N,00638.251E,2762.0m,1,,,"","Hotspot, Reliability 65%, irregular interval" 40 | "Gréolières","GRéO",FR,4348.057N,00657.929E,1000.0m,1,,,"","Hotspot, Reliability 65%, nearly constant" 41 | "Marcelly","MARCE",FR,4607.697N,00634.394E,1980.0m,1,,,"","Hotspot, Reliability 65%, irregular interval" 42 | "Montdenier","MONTD",FR,4353.938N,00615.149E,1667.0m,1,,,"","Hotspot, Reliability 65%, irregular interval" 43 | "Mont Guillaume","MONT ",FR,4435.227N,00625.943E,2478.0m,1,,,"","Hotspot, Reliability 65%, irregular interval" 44 | "Morgon","MORGO",FR,4429.203N,00623.951E,1961.0m,1,,,"","Hotspot, Reliability 65%, irregular interval" 45 | "Mte. de la Grisonnière","MTE. ",FR,4415.052N,00623.889E,1978.0m,1,,,"","Hotspot, Reliability 65%, irregular interval" 46 | "Pente de la chapelle (Challes)","PENTE",FR,4533.036N,00559.800E,700.0m,1,,,"","Hotspot, Reliability 65%, nearly constant" 47 | "Prachaval","PRACH",FR,4441.716N,00639.751E,2176.0m,1,,,"","Hotspot, Reliability 65%, scheduled interval" 48 | "Simmonet des Graux","SIMMO",FR,4413.047N,00639.698E,2335.0m,1,,,"","Hotspot, Reliability 65%, irregular interval" 49 | "Tête d'Amont","TêTE",FR,4451.123N,00632.041E,2758.0m,1,,,"","Hotspot, Reliability 65%, irregular interval" 50 | "Tête de Lucy","TêTE",FR,4436.624N,00623.147E,2598.0m,1,,,"","Hotspot, Reliability 65%, irregular interval" 51 | "Tête de Siguret","TêTE",FR,4426.142N,00646.337E,2558.0m,1,,,"","Hotspot, Reliability 65%, irregular interval" 52 | "Tête du Peyron","TêTE",FR,4446.410N,00637.098E,2520.0m,1,,,"","Hotspot, Reliability 65%, scheduled interval" 53 | "Vachière","VACHI",FR,4411.920N,00629.725E,1919.0m,1,,,"","Hotspot, Reliability 65%, irregular interval" 54 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # OpenAIP2GeoJSON 2 | 3 | This little script look for files from [OpenAIP](http://www.openaip.net) in the folder ```input```, and transform those into GeoJSON files. 4 | 5 | ## TODO 6 | - [x] parser for .aip files 7 | - [ ] parser for .cup files 8 | - [ ] parser for .dat files 9 | - [ ] ask for input/output directories 10 | - [ ] a better "check duplicates" method 11 | - [ ] a better console output (ongoing) 12 | - [ ] generate areas from runways, from their properties. 13 | 14 | ## How to run it 15 | 16 | Clone the project, and install dependencies by running 17 | ```bash 18 | npm install 19 | ``` 20 | Then run it with 21 | ```bash 22 | cd OpenAIP2GeoJSON/ 23 | node index.js 24 | ``` 25 | 26 | The parser will then look into the ```input``` folder and parse all extensions readable by the script. 27 | Your GeoJSON files will be exported into the ```output``` folder. 28 | 29 | ## Data structures 30 | 31 | Following the [RFC 7946](https://tools.ietf.org/html/rfc7946), all files are following the GeoJSON structure defined by IETF. 32 | 33 | All datas are divided into separate files : 34 | - airports.geojson, 35 | - airspaces.geojson, 36 | - hotspots.geojson, 37 | - navaids.geojson, 38 | - runways.geojson 39 | 40 | Each of those is a _FeatureCollection_, containing the datas. 41 | Actually, apart from airspaces, all datas are _Points_ (airspaces are _Polygons_). 42 | 43 | Even if not in used at the moment, a **guid** property is given for each geographical information. 44 | 45 | ### Units 46 | - Coordinates (```[longitude, latitude]```) in decimal degrees, 47 | - Elevation (```elev```) in decimal meters, 48 | - Frequencies in MHz (MegaHertz). 49 | 50 | ### Sample : airports.geojson 51 | ```javascript 52 | // Example from France OpenAIP for Abbeville airport. 53 | { 54 | "type":"FeatureCollection", 55 | "features":[ 56 | { 57 | "type":"Feature", 58 | "geometry":{ 59 | "type":"Point", 60 | "coordinates":[1.831389,50.101667] 61 | }, 62 | "properties":{ 63 | "guid":"", 64 | "aeronautical":"airport", 65 | "name":"ABBEVILLE", 66 | "type":"HELI_CIVIL", 67 | "country":"FR", 68 | "icao":"", 69 | "radios":[ 70 | { 71 | "category":"COMMUNICATION", 72 | "frequency":134.825, 73 | "type":"FIS", 74 | "spec":"", 75 | "description":"LILLE Information" 76 | } 77 | ], 78 | "elev":24.9936 79 | } 80 | }, 81 | ... 82 | ] 83 | } 84 | ``` 85 | 86 | ### Sample : airspace.geojson 87 | ```javascript 88 | // Example from France OpenAIP for Bourg-St-Maurice airspace. 89 | { 90 | "type":"FeatureCollection", 91 | "features":[ 92 | { 93 | "type":"Feature", 94 | "geometry":{ 95 | "type":"Polygon", 96 | "coordinates":[ 97 | [ 98 | [6.6333333333333,45.659166666667], 99 | [6.7127777777778,45.697777777778], 100 | [6.745,45.673888888889], 101 | [6.7525,45.614444444444], 102 | [6.75,45.613333333333], 103 | [6.7205555555556,45.610833333333], 104 | [6.6333333333333,45.659166666667] 105 | ] 106 | ] 107 | }, 108 | "properties":{ 109 | "guid":"", 110 | "aeronautical":"airspace", 111 | "category":"DANGER", 112 | "version":"d10ba4b78e487033c62696d9776893c21f17479f", 113 | "id":"117703", 114 | "country":"FR", 115 | "name":"7 D 187 BourgStMaurice", 116 | "alt_limits":{ 117 | "top":{"ref":"STD","value":"FL 55"}, 118 | "bottom":{"ref":"GND","value":"F 0"} 119 | } 120 | } 121 | }, 122 | ... 123 | ] 124 | } 125 | ``` 126 | 127 | ### Sample : hotspots.geojson 128 | ```javascript 129 | // Example from France OpenAIP for Beynes hotspot. 130 | { 131 | "type":"FeatureCollection", 132 | "features":[ 133 | { 134 | "type":"Feature", 135 | "geometry":{ 136 | "type":"Point", 137 | "coordinates":[6.24768066413,43.968807501452] 138 | }, 139 | "properties":{ 140 | "guid":"", 141 | "aeronautical":"hotspot", 142 | "type":"NATURAL", 143 | "country":"FR", 144 | "name":"Beynes", 145 | "elev":1573, 146 | "reliability":0.65, 147 | "occurrence":"IRREGULAR_INTERVAL", 148 | "conditions":[ 149 | { 150 | "type":"FAVORABLE", 151 | "timeofday":["NOON/AFTERNOON","AFTERNOON/LATE_AFTERNOON"], 152 | "wind":[] 153 | } 154 | ] 155 | } 156 | }, 157 | ... 158 | ] 159 | } 160 | ``` 161 | ### Sample : navaids.geojson 162 | ```javascript 163 | // Example from France OpenAIP for Abbeville navaid. 164 | { 165 | "type":"FeatureCollection", 166 | "features":[ 167 | { 168 | "type":"Feature", 169 | "geometry":{ 170 | "type":"Point", 171 | "coordinates":[1.8547222222222,50.135277777778] 172 | }, 173 | "properties":{ 174 | "guid":"", 175 | "aeronautical":"navaid", 176 | "type":"VOR-DME", 177 | "country":"FR", 178 | "id":"ABB", 179 | "elev":68, 180 | "radios":[ 181 | {"frequency":108.45,"channel":"21Y"} 182 | ], 183 | "params":{ 184 | "range":60, 185 | "declination":-0.31475, 186 | "alignedtotruenorth":false 187 | } 188 | } 189 | }, 190 | ... 191 | ] 192 | } 193 | ``` 194 | ### Sample : runways.geojson 195 | ```javascript 196 | // Example from France OpenAIP for one of Abbeville's airport runways. 197 | { 198 | "type":"FeatureCollection", 199 | "features":[ 200 | { 201 | "type":"Feature", 202 | "geometry":{ 203 | "type":"Point", 204 | "coordinates":[1.8325,50.143056] 205 | }, 206 | "properties":{ 207 | "guid":"", 208 | "aeronautical":"runway", 209 | "operations":"ACTIVE", 210 | "airport":"ABBEVILLE", 211 | "name":"02/20", 212 | "sfc":"ASPH", 213 | "elev":67.056, 214 | "length":1249.9848, 215 | "width":22.86, 216 | "directions":["024","204"] 217 | } 218 | }, 219 | ... 220 | ] 221 | } 222 | ``` 223 | 224 | ## Dependencies 225 | 226 | This parser uses : 227 | - [colors](https://www.npmjs.com/package/colors), 228 | - [fs](https://www.npmjs.com/package/fs), 229 | - [geojson](https://www.npmjs.com/package/geojson), 230 | - [q](https://www.npmjs.com/package/q), 231 | - [xml2js](https://www.npmjs.com/package/xml2js), 232 | 233 | ## Disclaimer 234 | Since this little parser is just a parser, and is not providing any datas - examples are just examples, don't trust those -, the datas are not qualified to be use instead of official sources (following aeronautical rules, you must have datas provided officially). 235 | -------------------------------------------------------------------------------- /example_files/output/hotspots.geojson: -------------------------------------------------------------------------------- 1 | {"type":"FeatureCollection","features":[{"type":"Feature","geometry":{"type":"Point","coordinates":[6.24768066413,43.968807501452]},"properties":{"guid":"","aeronautical":"hotspot","type":"NATURAL","country":"FR","name":"Beynes","elev":1573,"reliability":0.65,"occurrence":"IRREGULAR_INTERVAL","conditions":[{"type":"FAVORABLE","timeofday":["NOON/AFTERNOON","AFTERNOON/LATE_AFTERNOON"],"wind":[]}]}},{"type":"Feature","geometry":{"type":"Point","coordinates":[6.46931399238,44.176535459337]},"properties":{"guid":"","aeronautical":"hotspot","type":"NATURAL","country":"FR","name":"Carton","elev":1932,"reliability":0.65,"occurrence":"IRREGULAR_INTERVAL","conditions":[{"type":"FAVORABLE","timeofday":["MORNING/NOON","NOON/AFTERNOON","AFTERNOON/LATE_AFTERNOON","EVENING"],"wind":["180","225","270","315"]}]}},{"type":"Feature","geometry":{"type":"Point","coordinates":[6.6610412598196,44.338171403802]},"properties":{"guid":"","aeronautical":"hotspot","type":"NATURAL","country":"FR","name":"Chapeau de Gendarme","elev":2535,"reliability":0.65,"occurrence":"IRREGULAR_INTERVAL","conditions":[{"type":"FAVORABLE","timeofday":["NOON/AFTERNOON","AFTERNOON/LATE_AFTERNOON"],"wind":["0","180","225","270","315"]}]}},{"type":"Feature","geometry":{"type":"Point","coordinates":[6.4214019776016,44.119590976755]},"properties":{"guid":"","aeronautical":"hotspot","type":"NATURAL","country":"FR","name":"Cheval Blanc","elev":2239,"reliability":0.65,"occurrence":"IRREGULAR_INTERVAL","conditions":[{"type":"FAVORABLE","timeofday":["NOON/AFTERNOON","AFTERNOON/LATE_AFTERNOON"],"wind":[]}]}},{"type":"Feature","geometry":{"type":"Point","coordinates":[6.317031860418,44.026969991215]},"properties":{"guid":"","aeronautical":"hotspot","type":"NATURAL","country":"FR","name":"Coupe","elev":1555,"reliability":0.65,"occurrence":"IRREGULAR_INTERVAL","conditions":[{"type":"FAVORABLE","timeofday":["NOON/AFTERNOON","AFTERNOON/LATE_AFTERNOON"],"wind":["270","315"]}]}},{"type":"Feature","geometry":{"type":"Point","coordinates":[6.294372558659,44.193608006011]},"properties":{"guid":"","aeronautical":"hotspot","type":"NATURAL","country":"FR","name":"Crête de Leman (Bleyeul)","elev":1424,"reliability":0.65,"occurrence":"IRREGULAR_INTERVAL","conditions":[{"type":"FAVORABLE","timeofday":["NOON/AFTERNOON","AFTERNOON/LATE_AFTERNOON"],"wind":["180","225","270"]}]}},{"type":"Feature","geometry":{"type":"Point","coordinates":[6.5563278198822,43.962506231452]},"properties":{"guid":"","aeronautical":"hotspot","type":"NATURAL","country":"FR","name":"Crête de Serres","elev":1620,"reliability":0.65,"occurrence":"IRREGULAR_INTERVAL","conditions":[{"type":"FAVORABLE","timeofday":["NOON/AFTERNOON","AFTERNOON/LATE_AFTERNOON"],"wind":[]}]}},{"type":"Feature","geometry":{"type":"Point","coordinates":[6.6018180847691,43.844512226672]},"properties":{"guid":"","aeronautical":"hotspot","type":"NATURAL","country":"FR","name":"Crête du Teillon","elev":1869,"reliability":0.65,"occurrence":"IRREGULAR_INTERVAL","conditions":[{"type":"FAVORABLE","timeofday":["NOON/AFTERNOON","AFTERNOON/LATE_AFTERNOON"],"wind":[]}]}},{"type":"Feature","geometry":{"type":"Point","coordinates":[6.643875122127,44.941673501189]},"properties":{"guid":"","aeronautical":"hotspot","type":"NATURAL","country":"FR","name":"Crêtes de Peyrolle","elev":2609,"reliability":0.65,"occurrence":"IRREGULAR_INTERVAL","conditions":[{"type":"FAVORABLE","timeofday":["NOON/AFTERNOON","AFTERNOON/LATE_AFTERNOON"],"wind":["180","225","270","315"]}]}},{"type":"Feature","geometry":{"type":"Point","coordinates":[6.3836364746784,44.40933876306]},"properties":{"guid":"","aeronautical":"hotspot","type":"NATURAL","country":"FR","name":"Dormillouse","elev":2410,"reliability":0.65,"occurrence":"IRREGULAR_INTERVAL","conditions":[{"type":"FAVORABLE","timeofday":["NOON/AFTERNOON","AFTERNOON/LATE_AFTERNOON","EVENING"],"wind":["180","225","270"]}]}},{"type":"Feature","geometry":{"type":"Point","coordinates":[6.6540031433624,44.435084929]},"properties":{"guid":"","aeronautical":"hotspot","type":"NATURAL","country":"FR","name":"Grand Bérard","elev":2746,"reliability":0.65,"occurrence":"IRREGULAR_INTERVAL","conditions":[{"type":"FAVORABLE","timeofday":["NOON/AFTERNOON","AFTERNOON/LATE_AFTERNOON"],"wind":["135","180","225","270"]}]}},{"type":"Feature","geometry":{"type":"Point","coordinates":[6.6375236511753,44.290391738902]},"properties":{"guid":"","aeronautical":"hotspot","type":"NATURAL","country":"FR","name":"Grand Cheval de Bois","elev":2762,"reliability":0.65,"occurrence":"IRREGULAR_INTERVAL","conditions":[{"type":"FAVORABLE","timeofday":["NOON/AFTERNOON","AFTERNOON/LATE_AFTERNOON"],"wind":[]}]}},{"type":"Feature","geometry":{"type":"Point","coordinates":[6.9654769895465,43.800957731115]},"properties":{"guid":"","aeronautical":"hotspot","type":"NATURAL","country":"FR","name":"Gréolières","elev":1000,"reliability":0.65,"occurrence":"NEARLY_CONSTANT","conditions":[{"type":"FAVORABLE","timeofday":["MORNING/NOON","NOON/AFTERNOON","AFTERNOON/LATE_AFTERNOON"],"wind":["135","180","225","315"]}]}},{"type":"Feature","geometry":{"type":"Point","coordinates":[6.573230743225,46.128278914261]},"properties":{"guid":"","aeronautical":"hotspot","type":"NATURAL","country":"FR","name":"Marcelly","elev":1980,"reliability":0.65,"occurrence":"IRREGULAR_INTERVAL","conditions":[{"type":"FAVORABLE","timeofday":["NOON/AFTERNOON","AFTERNOON/LATE_AFTERNOON"],"wind":["135","180","225","270"]}]}},{"type":"Feature","geometry":{"type":"Point","coordinates":[6.2524871826835,43.898961999271]},"properties":{"guid":"","aeronautical":"hotspot","type":"NATURAL","country":"FR","name":"Montdenier","elev":1667,"reliability":0.65,"occurrence":"IRREGULAR_INTERVAL","conditions":[{"type":"FAVORABLE","timeofday":["NOON/AFTERNOON","AFTERNOON/LATE_AFTERNOON"],"wind":[]}]}},{"type":"Feature","geometry":{"type":"Point","coordinates":[6.4323883057255,44.587123276436]},"properties":{"guid":"","aeronautical":"hotspot","type":"NATURAL","country":"FR","name":"Mont Guillaume","elev":2478,"reliability":0.65,"occurrence":"IRREGULAR_INTERVAL","conditions":[{"type":"FAVORABLE","timeofday":["NOON/AFTERNOON","AFTERNOON/LATE_AFTERNOON"],"wind":["180","225","270","315"]}]}},{"type":"Feature","geometry":{"type":"Point","coordinates":[6.3991912776389,44.486708771656]},"properties":{"guid":"","aeronautical":"hotspot","type":"NATURAL","country":"FR","name":"Morgon","elev":1961,"reliability":0.65,"occurrence":"IRREGULAR_INTERVAL","conditions":[{"type":"FAVORABLE","timeofday":["NOON/AFTERNOON","AFTERNOON/LATE_AFTERNOON","EVENING"],"wind":["180","225","270"]}]}},{"type":"Feature","geometry":{"type":"Point","coordinates":[6.3981418610204,44.250873528601]},"properties":{"guid":"","aeronautical":"hotspot","type":"NATURAL","country":"FR","name":"Mte. de la Grisonnière","elev":1978,"reliability":0.65,"occurrence":"IRREGULAR_INTERVAL","conditions":[{"type":"FAVORABLE","timeofday":["NOON/AFTERNOON","AFTERNOON/LATE_AFTERNOON"],"wind":["225","270","315"]}]}},{"type":"Feature","geometry":{"type":"Point","coordinates":[5.9966630934054,45.550603171946]},"properties":{"guid":"","aeronautical":"hotspot","type":"NATURAL","country":"FR","name":"Pente de la chapelle (Challes)","elev":700,"reliability":0.65,"occurrence":"NEARLY_CONSTANT","conditions":[{"type":"FAVORABLE","timeofday":["NOON/AFTERNOON","AFTERNOON/LATE_AFTERNOON"],"wind":["270","315"]}]}},{"type":"Feature","geometry":{"type":"Point","coordinates":[6.6625213620381,44.695260824108]},"properties":{"guid":"","aeronautical":"hotspot","type":"NATURAL","country":"FR","name":"Prachaval","elev":2176,"reliability":0.65,"occurrence":"SCHEDULED_INTERVAL","conditions":[{"type":"FAVORABLE","timeofday":["NOON/AFTERNOON","AFTERNOON/LATE_AFTERNOON"],"wind":["180","225","270","315"]}]}},{"type":"Feature","geometry":{"type":"Point","coordinates":[6.6616407547996,44.217451984038]},"properties":{"guid":"","aeronautical":"hotspot","type":"NATURAL","country":"FR","name":"Simmonet des Graux","elev":2335,"reliability":0.65,"occurrence":"IRREGULAR_INTERVAL","conditions":[{"type":"FAVORABLE","timeofday":["MORNING/NOON","NOON/AFTERNOON","AFTERNOON/LATE_AFTERNOON","EVENING"],"wind":["135","180","225","270"]}]}},{"type":"Feature","geometry":{"type":"Point","coordinates":[6.5340118408785,44.852053425665]},"properties":{"guid":"","aeronautical":"hotspot","type":"NATURAL","country":"FR","name":"Tête d'Amont","elev":2758,"reliability":0.65,"occurrence":"IRREGULAR_INTERVAL","conditions":[{"type":"FAVORABLE","timeofday":["NOON/AFTERNOON","AFTERNOON/LATE_AFTERNOON"],"wind":[]}]}},{"type":"Feature","geometry":{"type":"Point","coordinates":[6.3857822418845,44.610408084882]},"properties":{"guid":"","aeronautical":"hotspot","type":"NATURAL","country":"FR","name":"Tête de Lucy","elev":2598,"reliability":0.65,"occurrence":"IRREGULAR_INTERVAL","conditions":[{"type":"FAVORABLE","timeofday":["NOON/AFTERNOON","AFTERNOON/LATE_AFTERNOON"],"wind":["180","225","270","315"]}]}},{"type":"Feature","geometry":{"type":"Point","coordinates":[6.7722778320776,44.435697794794]},"properties":{"guid":"","aeronautical":"hotspot","type":"NATURAL","country":"FR","name":"Tête de Siguret","elev":2558,"reliability":0.65,"occurrence":"IRREGULAR_INTERVAL","conditions":[{"type":"FAVORABLE","timeofday":["NOON/AFTERNOON","AFTERNOON/LATE_AFTERNOON","EVENING"],"wind":["180","225","270","315"]}]}},{"type":"Feature","geometry":{"type":"Point","coordinates":[6.6182975769598,44.773506048914]},"properties":{"guid":"","aeronautical":"hotspot","type":"NATURAL","country":"FR","name":"Tête du Peyron","elev":2520,"reliability":0.65,"occurrence":"SCHEDULED_INTERVAL","conditions":[{"type":"FAVORABLE","timeofday":["NOON/AFTERNOON","AFTERNOON/LATE_AFTERNOON"],"wind":["225","270","315"]}]}},{"type":"Feature","geometry":{"type":"Point","coordinates":[6.4954107730056,44.198660087436]},"properties":{"guid":"","aeronautical":"hotspot","type":"NATURAL","country":"FR","name":"Vachière","elev":1919,"reliability":0.65,"occurrence":"IRREGULAR_INTERVAL","conditions":[{"type":"FAVORABLE","timeofday":["MORNING/NOON","NOON/AFTERNOON","AFTERNOON/LATE_AFTERNOON","EVENING"],"wind":["180","225","270","315"]}]}}]} -------------------------------------------------------------------------------- /index.js: -------------------------------------------------------------------------------- 1 | // Import dependencies 2 | var xml2js = require('xml2js'), 3 | fs = require('fs'), 4 | colors = require('colors/safe'), 5 | Q = require('q'), 6 | GeoJSON = require('geojson'); 7 | // Declare global vars 8 | var airports = [], 9 | runways = [], 10 | airspaces = [], 11 | navaids = [], 12 | hotspots = [], 13 | pathInput = "./input/", 14 | pathOutput = "./output/", 15 | points = [], 16 | polygons = [], 17 | fileTypes = ['airports', 'airspace', 'hotspot', 'navaid'], 18 | geoBlocks = ['airports', 'airspaces', 'hotspots', 'navaids', 'runways']; 19 | 20 | init(); 21 | 22 | function init(){ 23 | // Shows the main menu used by this little script. 24 | console.log(">>> OpenAIP to GeoJSON converter"); 25 | console.log(colors.red("Be sure all your files in the \"input\" folder.")); 26 | console.log(colors.green(">>> reading [input] folder")); 27 | fs.readdir(pathInput, function(err, items) { 28 | for (var i=0; i>> Staring analysis of ' + block)); 40 | switch (block) { 41 | case 'airports' : doAirports(data, block); break; 42 | case 'airspace' : doAirspaces(data, block); break; 43 | case 'hotspot' : doHotspot(data, block); break; 44 | case 'navaid' : doNavaid(data, block); break; 45 | } 46 | } 47 | 48 | function doAirports(inputData, block){ 49 | var airportList = inputData.OPENAIP.WAYPOINTS[0].AIRPORT; 50 | for(var a = 0; a < airportList.length; a++){ 51 | var tempAirport = airportList[a]; 52 | var airport = { 53 | guid: "", 54 | aeronautical : "airport", 55 | name: tempAirport.NAME[0], 56 | type: tempAirport.$.TYPE, 57 | country: tempAirport.COUNTRY[0], 58 | icao : (tempAirport.ICAO != undefined ) ? tempAirport.ICAO[0] : "", 59 | radios: [], 60 | latitude : parseFloat(tempAirport.GEOLOCATION[0].LAT[0]), 61 | longitude : parseFloat(tempAirport.GEOLOCATION[0].LON[0]), 62 | elev : parseFloat(tempAirport.GEOLOCATION[0].ELEV[0]._) 63 | }; 64 | // Work on radios 65 | if(tempAirport.RADIO != undefined){ 66 | for(var r = 0; r < tempAirport.RADIO.length; r++){ 67 | var tempRadio = tempAirport.RADIO[r]; 68 | var radio = { 69 | category: tempRadio.$.CATEGORY, 70 | frequency: parseFloat(tempRadio.FREQUENCY[0]), 71 | type: tempRadio.TYPE[0], 72 | spec: (tempRadio.TYPESPEC != undefined ) ? tempRadio.TYPESPEC[0] : "", 73 | description: (tempRadio.DESCRIPTION != undefined) ? tempRadio.DESCRIPTION[0] : "" 74 | }; 75 | airport.radios.push(radio); 76 | } 77 | } 78 | // Work on runways 79 | if(tempAirport.RWY != undefined){ 80 | for(var r = 0; r < tempAirport.RWY.length; r++){ 81 | var tempRnw = tempAirport.RWY[r]; 82 | var rnw = { 83 | guid: "", 84 | aeronautical : "runway", 85 | operations : tempRnw.$.OPERATIONS, 86 | airport : airport.name, 87 | name : tempRnw.NAME[0], 88 | sfc : tempRnw.SFC[0], 89 | latitude : airport.latitude, 90 | longitude : airport.longitude, 91 | elev : airport.elev, 92 | length : parseFloat(tempRnw.LENGTH[0]._), 93 | width : parseFloat(tempRnw.WIDTH[0]._), 94 | directions: [] 95 | }; 96 | if( tempRnw.DIRECTION != undefined ){ 97 | for(var z = 0; z < tempRnw.DIRECTION.length; z++){ 98 | rnw.directions.push(tempRnw.DIRECTION[z].$.TC); 99 | } 100 | } 101 | runways.push(rnw); 102 | } 103 | } 104 | airports.push(airport); 105 | } 106 | console.log(colors.yellow(">>> DONE : "+ airports.length + " airports")); 107 | checkContinueProcess(block); 108 | } 109 | 110 | function doAirspaces(inputData, block){ 111 | var airspacesList = inputData.OPENAIP.AIRSPACES[0].ASP; 112 | for(var a = 0; a < airspacesList.length; a ++){ 113 | var tempAirspace = airspacesList[a]; 114 | var airspace = { 115 | guid: "", 116 | aeronautical : "airspace", 117 | category: tempAirspace.$.CATEGORY, 118 | version: tempAirspace.VERSION[0], 119 | id: tempAirspace.ID[0], 120 | country: tempAirspace.COUNTRY[0], 121 | name: tempAirspace.NAME[0], 122 | alt_limits:{ 123 | top:{ 124 | ref:tempAirspace.ALTLIMIT_TOP[0].$.REFERENCE, 125 | value: tempAirspace.ALTLIMIT_TOP[0].ALT[0].$.UNIT +" "+ tempAirspace.ALTLIMIT_TOP[0].ALT[0]._ 126 | }, 127 | bottom:{ 128 | ref:tempAirspace.ALTLIMIT_BOTTOM[0].$.REFERENCE, 129 | value:tempAirspace.ALTLIMIT_BOTTOM[0].ALT[0].$.UNIT +" "+ tempAirspace.ALTLIMIT_BOTTOM[0].ALT[0]._ 130 | } 131 | }, 132 | geometry:[] 133 | }; 134 | // Generate vertexes for airspaces geometry 135 | // A GeoJSON polygon is polygon : [ [ [Coordinates 1] ] ] 136 | var strGeomArr = tempAirspace.GEOMETRY[0].POLYGON[0].split(', '); 137 | var vertexes = []; 138 | for(var g = 0; g < strGeomArr.length; g++){ 139 | var tmpVertex = strGeomArr[g].split(" "); 140 | var vertex = [ parseFloat(tmpVertex[0]), parseFloat(tmpVertex[1])]; 141 | vertexes.push(vertex); 142 | } 143 | airspace.geometry = [ vertexes ]; 144 | airspaces.push(airspace); 145 | } 146 | console.log(colors.yellow(">>> DONE : "+ airspaces.length + " airspaces")); 147 | checkContinueProcess(block); 148 | } 149 | 150 | function doHotspot(inputData, block){ 151 | var hotspotList = inputData.OPENAIP.HOTSPOTS[0].HOTSPOT; 152 | for(var h = 0; h < hotspotList.length; h++){ 153 | var tempHotspot = hotspotList[h]; 154 | var hotspot = { 155 | guid: "", 156 | aeronautical : "hotspot", 157 | type: tempHotspot.$.TYPE, 158 | country: tempHotspot.COUNTRY[0], 159 | name: tempHotspot.NAME[0], 160 | latitude : parseFloat(tempHotspot.GEOLOCATION[0].LAT[0]), 161 | longitude : parseFloat(tempHotspot.GEOLOCATION[0].LON[0]), 162 | elev : parseFloat(tempHotspot.GEOLOCATION[0].ELEV[0]._), 163 | reliability: parseFloat(tempHotspot.RELIABILITY[0]), 164 | occurrence: tempHotspot.OCCURRENCE[0], 165 | conditions:[] 166 | }; 167 | // Working on conditions. 168 | if(tempHotspot.CONDITIONS != undefined){ 169 | for(var i = 0; i < tempHotspot.CONDITIONS.length; i++){ 170 | var tmpCond = tempHotspot.CONDITIONS[i]; 171 | var cond = { 172 | type: tmpCond.$.TYPE, 173 | timeofday: [], 174 | wind:[] 175 | }; 176 | // Work on times 177 | if(tmpCond.TIMEOFDAY != undefined){ 178 | for(var j=0; j < tmpCond.TIMEOFDAY[0].TIME.length; j++){ 179 | cond.timeofday.push(tmpCond.TIMEOFDAY[0].TIME[j]); 180 | } 181 | } 182 | // Work on winds 183 | if(tmpCond.WIND != undefined){ 184 | for(var j = 0; j < tmpCond.WIND[0].DIRECTION.length; j++){ 185 | cond.wind.push(tmpCond.WIND[0].DIRECTION[j]); 186 | } 187 | } 188 | hotspot.conditions.push(cond); 189 | } 190 | } 191 | hotspots.push(hotspot); 192 | } 193 | console.log(colors.yellow(">>> DONE : "+ hotspots.length + " hotspots")); 194 | checkContinueProcess(block); 195 | } 196 | 197 | function doNavaid(inputData, block){ 198 | var navaidList = inputData.OPENAIP.NAVAIDS[0].NAVAID; 199 | for(var i = 0; i < navaidList.length; i++){ 200 | var tempNavaid = navaidList[i]; 201 | var navaid = { 202 | guid: "", 203 | aeronautical : "navaid", 204 | type: tempNavaid.$.TYPE, 205 | country: tempNavaid.COUNTRY[0], 206 | id: tempNavaid.ID[0], 207 | latitude : parseFloat(tempNavaid.GEOLOCATION[0].LAT[0]), 208 | longitude : parseFloat(tempNavaid.GEOLOCATION[0].LON[0]), 209 | elev : parseFloat(tempNavaid.GEOLOCATION[0].ELEV[0]._), 210 | radios:[], 211 | params:{ 212 | range: (tempNavaid.PARAMS[0].RANGE != undefined) ? parseFloat(tempNavaid.PARAMS[0].RANGE[0]._) : null, 213 | declination : parseFloat(tempNavaid.PARAMS[0].DECLINATION[0]), 214 | alignedtotruenorth : !(tempNavaid.PARAMS[0].ALIGNEDTOTRUENORTH[0] === "FALSE") 215 | } 216 | }; 217 | // Work on radio 218 | if(tempNavaid.RADIO != undefined){ 219 | for(var j =0; j < tempNavaid.RADIO.length; j++){ 220 | var radio = { 221 | frequency: parseFloat(tempNavaid.RADIO[j].FREQUENCY[0]), 222 | channel: (tempNavaid.RADIO[j].CHANNEL != undefined) ? tempNavaid.RADIO[j].CHANNEL[0] : "" 223 | }; 224 | navaid.radios.push(radio); 225 | } 226 | } 227 | navaids.push(navaid); 228 | } 229 | console.log(colors.yellow(">>> DONE : "+ navaids.length + " navaids")); 230 | checkContinueProcess(block); 231 | } 232 | 233 | function getFileData(item, block){ 234 | var file = pathInput+item; 235 | var ext = item.slice(-3); 236 | if( ext === 'aip'){ 237 | fs.readFile(file, 'utf8', function(err, data){ 238 | if(err){ return console.err(err); } 239 | xml2js.parseString(data, function(err, result){ 240 | if(err) { return console.err(err);} 241 | return analyseDatas(result, block); 242 | }); 243 | }); 244 | } else { 245 | console.log(colors.red(">> Files with extension " + ext + " are not supported at the moment.")); 246 | } 247 | } 248 | 249 | function checkContinueProcess(block){ 250 | // Set the filtype corresponding to null 251 | for(var i = 0; i < fileTypes.length; i++){ 252 | if(fileTypes[i] === block){ 253 | fileTypes[i] = null; 254 | } 255 | } 256 | // Checks if a type of datas has been done or not. 257 | var t = fileTypes; t.sort(); 258 | 259 | if(t[0] == null){ 260 | startProcess(); 261 | } 262 | } 263 | 264 | function startProcess(){ 265 | console.log(colors.green(">>> Pre-work finished, starting generating GeoJSON files")); 266 | for(var i = 0; i < geoBlocks.length; i++){ 267 | var data = null; 268 | switch(geoBlocks[i]){ 269 | case 'airports' : data = airports; break; 270 | case 'airspaces': data = airspaces; break; 271 | case 'hotspots' : data = hotspots; break; 272 | case 'navaids' : data = navaids; break; 273 | case 'runways' : data = runways; break; 274 | } 275 | createGeoFile(checkDuplicatesInArray(data, geoBlocks[i]), geoBlocks[i]); 276 | } 277 | } 278 | 279 | function createGeoFile(data, block){ 280 | var geoData = GeoJSON.parse(data, ( block !== 'airspaces') ? {Point:['latitude','longitude']} : {'Polygon':'geometry'}); 281 | fs.writeFile('./output/'+block+'.geojson', JSON.stringify(geoData), (err) => { 282 | if (err) throw err; 283 | console.log(colors.green(">>> Saved geojson file for "+ block)); 284 | }); 285 | } 286 | 287 | function checkDuplicatesInArray(data, block){ 288 | // Creates a duplicate Array, in which unique items will be stored. 289 | var tempArray = []; 290 | for(var i = 0; i < data.length; i++){ 291 | var item = data[i]; 292 | if(tempArray.length == 0){ 293 | tempArray.push(item); 294 | } else { 295 | var existsInArray = false; 296 | for(var j = 0; j < tempArray.length; j++){ 297 | if(existsInArray === false){ 298 | existsInArray = (tempArray[j] == item); 299 | } 300 | } 301 | if(!existsInArray){ 302 | tempArray.push(item); 303 | } 304 | } 305 | } 306 | return tempArray; 307 | } 308 | -------------------------------------------------------------------------------- /example_files/input/openaip_navaid_france_fr.dat: -------------------------------------------------------------------------------- 1 | *** 2 | * 3 | * Exported on: 18.11.2016 4 | * This data is owned by Butterfly Avionics GmbH and licensed under the CC BY-NC-SA, 5 | * not to be used for commercial purposes. For more information on commercial licensing visit 6 | * 7 | * http://www.openaip.net/commercial-licensing 8 | * 9 | * openAIP data is not certified and must not be used for primary navigation or flight planning. 10 | * NEVER RELY ON OPENAIP DATA. openAIP data contains errors. Using openAIP data may 11 | * result in serious injury or death, use at your own risk! 12 | * 13 | * OPENAIP OFFERS THE WORK AS-IS AND MAKES NO REPRESENTATIONS OR WARRANTIES OF ANY KIND 14 | * CONCERNING THE WORK, EXPRESS, IMPLIED, STATUTORY OR OTHERWISE, INCLUDING, WITHOUT LIMITATION, 15 | * WARRANTIES OF TITLE, MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, NONINFRINGEMENT, OR 16 | * THE ABSENCE OF LATENT OR OTHER DEFECTS, ACCURACY, OR THE PRESENCE OF ABSENCE OF ERRORS, 17 | * WHETHER OR NOT DISCOVERABLE. SOME JURISDICTIONS DO NOT ALLOW THE EXCLUSION OF IMPLIED 18 | * WARRANTIES, SO THIS EXCLUSION MAY NOT APPLY TO YOU. 19 | * 20 | * EXCEPT TO THE EXTENT REQUIRED BY APPLICABLE LAW, IN NO EVENT WILL OPENAIP BE LIABLE TO YOU ON 21 | * ANY LEGAL THEORY FOR ANY SPECIAL, INCIDENTAL, CONSEQUENTIAL, PUNITIVE OR EXEMPLARY DAMAGES 22 | * ARISING OUT OF THIS LICENSE OR THE USE OF THE WORK, EVEN IF OPENAIP HAS BEEN ADVISED OF THE 23 | * POSSIBILITY OF SUCH DAMAGES. 24 | * 25 | *** 26 | 27 | ************************** 28 | * 29 | * OPENAIP NAVAIDS EXPORT 30 | * 31 | * VERSION= 1371698 32 | * 33 | ************************** 34 | 1,50:08:07N,01:51:17E,68.0M,T,ABBEVILLE,Navaid|ID:ABB|Frequency:108.45/21Y|Range:60 NM |Magnetic declination:-0.31475|Aligned to true north:FALSE 35 | 2,43:53:16N,00:52:22E,265.0M,T,AGEN-GAUDONVILLE,Navaid|ID:AGN|Frequency:114.8/95X|Range:100 NM |Magnetic declination:-0.12077|Aligned to true north:FALSE 36 | 3,41:46:14N,08:46:29E,628.0M,T,AJACCIO-COTI CHIAVARI,Navaid|ID:AJO|Frequency:114.8/95X|Range:200 NM |Magnetic declination:1.87235|Aligned to true north:FALSE 37 | 4,45:59:19N,05:19:53E,244.0M,T,AMBERIEU,Navaid|ID:AMU|Frequency:/110X|Range:120 NM |Magnetic declination:1.01494|Aligned to true north:FALSE 38 | 5,47:25:44N,01:03:52E,110.0M,T,AMBOISE,Navaid|ID:AMB|Frequency:113.7/84X|Range:80 NM |Magnetic declination:-0.30056|Aligned to true north:FALSE 39 | 6,47:25:05N,01:02:28E,106.0M,T,AMBOISE,Navaid|ID:AMB|Frequency:341/|Range:50 NM |Magnetic declination:-0.30598|Aligned to true north:FALSE 40 | 7,47:32:13N,00:51:07W,86.0M,T,ANGERS,Navaid|ID:ANG|Frequency:113/|Range:80 NM |Magnetic declination:-0.37491|Aligned to true north:FALSE 41 | 8,43:54:30N,04:54:19E,33.0M,T,AVIGNON CAUMONT,Navaid|ID:CM|Frequency:369/|Range:20 NM |Magnetic declination:0.96633|Aligned to true north:FALSE 42 | 9,43:59:43N,04:44:47E,44.0M,T,AVIGNON PUJAUT,Navaid|ID:AVN|Frequency:114.6/93X|Range:60 NM |Magnetic declination:0.92323|Aligned to true north:FALSE 43 | 10,47:03:29N,02:37:47E,169.0M,T,AVORD,Navaid|ID:AVD|Frequency:/43X|Range: NM |Magnetic declination:0.49525|Aligned to true north:FALSE 44 | 11,47:07:14N,02:47:58E,207.0M,T,AVORD,Navaid|ID:AVD|Frequency:288.500/|Range:20 NM |Magnetic declination:0.5408|Aligned to true north:FALSE 45 | 12,47:39:42N,07:28:45E,252.0M,T,BALE NORTH,Navaid|ID:BN|Frequency:353/|Range: NM |Magnetic declination:1.89404|Aligned to true north:FALSE 46 | 13,47:34:47N,07:32:11E,268.0M,T,BALE SOUTH,Navaid|ID:BS|Frequency:376/|Range: NM |Magnetic declination:|Aligned to true north:FALSE 47 | 14,47:37:58N,07:29:58E,256.0M,T,BASLE/MULHOUSE,Navaid|ID:BLM|Frequency:117.45/|Range:60 NM |Magnetic declination:1.40285|Aligned to true north:FALSE 48 | 15,42:34:25N,09:28:29E,2.0M,T,BASTIA PORETTA,Navaid|ID:BTA|Frequency:114.15/88Y|Range:80 NM |Magnetic declination:2.05495|Aligned to true north:FALSE 49 | 16,43:28:00N,01:30:37W,70.0M,T,BIARRITZ BAYONNE ANGLET,Navaid|ID:BTZ|Frequency:114.15/88Y|Range:60 NM |Magnetic declination:-0.76625|Aligned to true north:FALSE 50 | 17,44:49:37N,00:43:16W,49.0M,T,BORDEAUX MERIGNAC,Navaid|ID:BMC|Frequency:113.75/84Y|Range:100 NM |Magnetic declination:-0.62189|Aligned to true north:FALSE 51 | 18,50:37:29N,01:54:26E,168.0M,T,BOULOGNE SUR MER,Navaid|ID:BNE|Frequency:113.8/|Range:70 NM |Magnetic declination:-0.27113|Aligned to true north:FALSE 52 | 19,49:11:18N,03:03:24E,146.0M,T,BOURSONNE,Navaid|ID:BSN|Frequency:114.85/95Y|Range:60 NM |Magnetic declination:0.2179|Aligned to true north:FALSE 53 | 20,48:24:25N,03:17:41E,78.0M,T,BRAY SUR SEINE,Navaid|ID:BRY|Frequency:114.1/88X|Range:60 NM |Magnetic declination:0.3416|Aligned to true north:FALSE 54 | 21,48:28:39N,04:17:08W,111.0M,T,BREST BRETAGNE,Navaid|ID:GU|Frequency:338/|Range:25 NM |Magnetic declination:-3|Aligned to true north:FALSE 55 | 22,48:26:40N,04:24:59W,93.0M,T,BREST BRETAGNE,Navaid|ID:BGP|Frequency:387/|Range:25 NM |Magnetic declination:-3|Aligned to true north:FALSE 56 | 23,49:10:24N,00:27:19W,74.0M,T,CAEN CARPIQUET,Navaid|ID:CAN|Frequency:114.45/|Range:80 NM |Magnetic declination:-0.92415|Aligned to true north:FALSE 57 | 24,42:34:37N,08:48:24E,8.0M,T,CALVI SAINTE CATHERINE,Navaid|ID:CV|Frequency:375/|Range:25 NM |Magnetic declination:1.91392|Aligned to true north:FALSE 58 | 25,50:13:41N,03:09:05E,67.0M,T,CAMBRAI EPINOY,Navaid|ID:CMB|Frequency:112.6/73X|Range:80 NM |Magnetic declination:0.17028|Aligned to true north:FALSE 59 | 26,43:33:37N,06:52:15E,481.0M,T,CANNES TANNERON,Navaid|ID:CNM|Frequency:111.4/|Range:40 NM |Magnetic declination:1.4767|Aligned to true north:FALSE 60 | 27,45:52:55N,05:45:26E,1432.0M,T,CHAMBERY,Navaid|ID:CBY|Frequency:115.4/102Y|Range: NM |Magnetic declination:1.10301|Aligned to true north:FALSE 61 | 28,45:35:32N,05:53:01E,252.0M,T,CHAMBERY AIX LES BAINS,Navaid|ID:CH|Frequency:346/|Range:25 NM |Magnetic declination:1.38149|Aligned to true north:FALSE 62 | 29,48:28:48N,00:59:13E,213.0M,T,CHARTRES LA LOUPE,Navaid|ID:CHW|Frequency:115.2/99X|Range:100 NM |Magnetic declination:-0.38167|Aligned to true north:FALSE 63 | 30,48:03:21N,01:22:31E,126.0M,T,CHATEAUDUN,Navaid|ID:CHN|Frequency:/39X|Range:40 NM |Magnetic declination:-0.22306|Aligned to true north:FALSE 64 | 31,48:03:33N,01:23:13E,126.0M,T,CHATEAUDUN,Navaid|ID:CAD|Frequency:115.95/106Y|Range:80 NM |Magnetic declination:-0.21992|Aligned to true north:FALSE 65 | 32,48:03:48N,01:21:49E,130.0M,T,CHATEAUDUN,Navaid|ID:CDN|Frequency:359.5/|Range:50 NM |Magnetic declination:-0.22934|Aligned to true north:FALSE 66 | 33,46:56:12N,01:48:04E,165.0M,T,CHATEAUROUX DEOLS,Navaid|ID:CTX|Frequency:428/|Range:50 NM |Magnetic declination:-0.01078|Aligned to true north:FALSE 67 | 34,49:08:16N,03:34:40E,195.0M,T,CHATILLON SUR MARNE,Navaid|ID:CTL|Frequency:117.6/123X|Range:70 NM |Magnetic declination:0.38442|Aligned to true north:FALSE 68 | 35,45:47:15N,03:11:32E,321.0M,T,CLERMONT FERRAND AUVERGNE,Navaid|ID:CFA|Frequency:114.35/90Y|Range:100 NM |Magnetic declination:0.46249|Aligned to true north:FALSE 69 | 36,45:39:34N,00:18:42W,25.0M,T,COGNAC CHATEAUBERNARD,Navaid|ID:CNA|Frequency:114.65/93Y|Range:100 NM |Magnetic declination:-0.55744|Aligned to true north:FALSE 70 | 37,45:40:10N,00:18:22W,33.0M,T,COGNAC CHATEAUBERNARD,Navaid|ID:CGC|Frequency:354/|Range:75 NM |Magnetic declination:-0.5582|Aligned to true north:FALSE 71 | 38,45:39:41N,00:18:28W,28.0M,T,COGNAC CHATEAUBERNARD,Navaid|ID:CGC|Frequency:/109X|Range:160 NM |Magnetic declination:-0.55744|Aligned to true north:FALSE 72 | 39,48:50:41N,03:00:50E,139.0M,T,COULOMMIERS VOISINS,Navaid|ID:CLM|Frequency:112.9/76X|Range:60 NM |Magnetic declination:0.22945|Aligned to true north:FALSE 73 | 40,49:18:39N,00:18:46E,145.0M,T,DEAUVILLE NORMANDIE,Navaid|ID:DVL|Frequency:110.2/|Range:60 NM |Magnetic declination:-0.67814|Aligned to true north:FALSE 74 | 41,49:55:31N,01:10:14E,104.0M,T,DIEPPE,Navaid|ID:DPE|Frequency:115.8/|Range:40 NM |Magnetic declination:-0.45175|Aligned to true north:FALSE 75 | 42,43:59:29N,06:06:03E,913.0M,T,DIGNE,Navaid|ID:DGN|Frequency:113.85/|Range:90 NM |Magnetic declination:1.28828|Aligned to true north:FALSE 76 | 43,47:16:19N,05:05:30E,216.0M,T,DIJON-LONGVIC,Navaid|ID:DIJ|Frequency:/82X|Range:60 NM |Magnetic declination:0.93049|Aligned to true north:FALSE 77 | 44,48:35:10N,02:04:56W,63.0M,T,DINARD PLEURTUIT SAINT MALO,Navaid|ID:DIN|Frequency:114.300/90X|Range:80 NM |Magnetic declination:-2|Aligned to true north:FALSE 78 | 45,48:28:55N,02:03:10W,62.0M,T,DINARD PLEURTUIT SAINT MALO,Navaid|ID:DR|Frequency:390/|Range:25 NM |Magnetic declination:-2|Aligned to true north:FALSE 79 | 46,48:37:33N,01:39:24E,158.0M,T,EPERNON,Navaid|ID:EPR|Frequency:115.65/103Y|Range:60 NM |Magnetic declination:-0.17835|Aligned to true north:FALSE 80 | 47,48:19:04N,06:03:34E,343.0M,T,EPINAL MIRECOURT,Navaid|ID:EPL|Frequency:113/|Range:60 NM |Magnetic declination:1.16441|Aligned to true north:FALSE 81 | 48,49:01:43N,01:12:51E,136.0M,T,EVREUX FAUVILLE,Navaid|ID:EVX|Frequency:/71X|Range: NM |Magnetic declination:-0.35649|Aligned to true north:FALSE 82 | 49,49:01:43N,01:12:51E,136.0M,T,EVREUX FAUVILLE,Navaid|ID:EVX|Frequency:112.4/71X|Range:60 NM |Magnetic declination:-0.35649|Aligned to true north:FALSE 83 | 50,43:57:15N,01:49:27E,295.0M,T,GAILLAC-CASTELNAU DE MONTMIRAIL,Navaid|ID:GAI|Frequency:115.8/|Range:100 NM |Magnetic declination:0.17109|Aligned to true north:FALSE 84 | 51,48:59:11N,06:42:58E,309.0M,T,GROSTENQUIN,Navaid|ID:GTQ|Frequency:111.25/49Y|Range:60 NM |Magnetic declination:1.33061|Aligned to true north:FALSE 85 | 52,48:09:36N,03:36:09W,227.0M,T,GUISCRIFF SCAER,Navaid|ID:GSG|Frequency:395/|Range:25 NM |Magnetic declination:-3|Aligned to true north:FALSE 86 | 53,47:33:42N,06:43:56E,399.0M,T,HERICOURT,Navaid|ID:HR|Frequency:289/|Range:30 NM |Magnetic declination:1.37482|Aligned to true north:FALSE 87 | 54,43:30:01N,04:56:24E,15.0M,T,ISTRES LE TUBE,Navaid|ID:ITS|Frequency:112.700/74X|Range: NM |Magnetic declination:1|Aligned to true north:FALSE 88 | 55,48:47:26N,00:31:49E,290.0M,T,L'AIGLE,Navaid|ID:LGL|Frequency:115.000/|Range: NM |Magnetic declination:-2|Aligned to true north:FALSE 89 | 56,46:41:29N,02:08:58E,269.0M,T,LA CHATRE,Navaid|ID:LCA|Frequency:112.1/|Range: NM |Magnetic declination:0.3783|Aligned to true north:FALSE 90 | 57,48:43:09N,03:18:28W,71.0M,T,LANNION,Navaid|ID:LN|Frequency:345/|Range:50 NM |Magnetic declination:-3|Aligned to true north:FALSE 91 | 58,48:17:01N,04:25:56W,76.0M,T,LANVEOC POULMIC,Navaid|ID:BST|Frequency:428/|Range:50 NM |Magnetic declination:-3|Aligned to true north:FALSE 92 | 59,46:41:21N,01:17:11W,93.0M,T,LA ROCHE SUR YON LES AJONCS,Navaid|ID:YN|Frequency:334/|Range: NM |Magnetic declination:-1|Aligned to true north:FALSE 93 | 60,45:29:20N,05:26:21E,641.0M,T,LA TOUR DU PIN,Navaid|ID:LTP|Frequency:115.55/|Range: NM |Magnetic declination:1.0302|Aligned to true north:FALSE 94 | 61,43:22:58N,06:15:21E,303.0M,T,LE LUC LE CANNET,Navaid|ID:LUC|Frequency:113.0/77X|Range: NM |Magnetic declination:1|Aligned to true north:FALSE 95 | 62,43:28:00N,00:01:06W,293.0M,T,LEMBEYE,Navaid|ID:LMB|Frequency:111.8/|Range: NM |Magnetic declination:-1|Aligned to true north:FALSE 96 | 63,43:28:00N,00:01:06W,293.0M,T,LILLE LESQUIN,Navaid|ID:LEQ|Frequency:109.0/27X|Range: NM |Magnetic declination:-0.06258|Aligned to true north:FALSE 97 | 64,45:48:57N,01:01:32E,417.0M,T,LIMOGES,Navaid|ID:LMG|Frequency:114.5/92X|Range: NM |Magnetic declination:-1|Aligned to true north:FALSE 98 | 65,47:45:47N,03:26:26W,44.0M,T,LORIENT LANN BIHOUE,Navaid|ID:LOR|Frequency:359/|Range:50 NM |Magnetic declination:-2|Aligned to true north:FALSE 99 | 66,47:41:18N,06:17:44E,316.0M,T,LUXEUIL,Navaid|ID:LUL|Frequency:117.1/|Range: NM |Magnetic declination:1|Aligned to true north:FALSE 100 | 67,45:44:44N,05:05:26E,234.0M,T,LYON SAINT EXUPERY,Navaid|ID:LSE|Frequency:114.75/94Y|Range: NM |Magnetic declination:1.22442|Aligned to true north:FALSE 101 | 68,48:27:21N,02:48:48E,102.0M,T,MELUN,Navaid|ID:MLN|Frequency:113.6/83X|Range:40 NM |Magnetic declination:0.23263|Aligned to true north:FALSE 102 | 69,49:23:28N,05:23:29E,190.0M,T,MONTMEDY-DUN SUR MEUSE,Navaid|ID:MMD|Frequency:109.4/|Range:40 NM |Magnetic declination:1.12985|Aligned to true north:FALSE 103 | 70,48:38:48N,03:45:46W,120.0M,T,MORLAIX PLOUJEAN,Navaid|ID:MLX|Frequency:371/|Range:25 NM |Magnetic declination:-3|Aligned to true north:FALSE 104 | 71,47:03:10N,01:41:16W,1.0M,T,NANTES ATLANTIQUE,Navaid|ID:GL|Frequency:369/|Range:25 NM |Magnetic declination:-1|Aligned to true north:FALSE 105 | 72,47:09:39N,01:36:46W,25.0M,T,NANTES ATLANTIQUE,Navaid|ID:NTS|Frequency:115.500/102X|Range:150 NM |Magnetic declination:-1|Aligned to true north:FALSE 106 | 73,48:09:20N,02:15:53E,121.0M,T,PITHIVIERS,Navaid|ID:PTV|Frequency:116.5/|Range:100 NM |Magnetic declination:0.08418|Aligned to true north:FALSE 107 | 74,49:06:20N,02:02:45E,95.0M,T,PONTOISE,Navaid|ID:PON|Frequency:111.6/|Range: NM |Magnetic declination:0.135|Aligned to true north:FALSE 108 | 75,47:57:26N,04:11:05W,84.0M,T,QUIMPER PLUGUFFAN,Navaid|ID:QPR|Frequency:117.800/125X|Range:150 NM |Magnetic declination:-3|Aligned to true north:FALSE 109 | 76,47:58:05N,03:59:54W,101.0M,T,QUIMPER PLUGUFFAN,Navaid|ID:RQ|Frequency:380/|Range:25 NM |Magnetic declination:-3|Aligned to true north:FALSE 110 | 77,47:58:05N,03:59:54W,101.0M,T,QUIMPER PLUGUFFAN,Navaid|ID:RQ|Frequency:380/|Range:25 NM |Magnetic declination:-3|Aligned to true north:FALSE 111 | 78,48:03:11N,01:35:04W,55.0M,T,RENNES SAINT JACQUES,Navaid|ID:RS|Frequency:349/|Range:25 NM |Magnetic declination:-2|Aligned to true north:FALSE 112 | 79,48:04:09N,01:44:30W,30.0M,T,RENNES SAINT JACQUES,Navaid|ID:REN|Frequency:109.250/29Y|Range:150 NM |Magnetic declination:-2|Aligned to true north:FALSE 113 | 80,48:34:03N,02:46:57W,67.0M,T,SAINT BRIEUC ARMOR,Navaid|ID:SB|Frequency:353/|Range:35 NM |Magnetic declination:-2|Aligned to true north:FALSE 114 | 81,45:44:44N,05:05:26E,234.0M,T,SAINT EXUPERY,Navaid|ID:LSE|Frequency:114.75/|Range: NM |Magnetic declination:0.92899|Aligned to true north:FALSE 115 | 82,47:20:01N,02:02:40W,2.0M,T,SAINT NAZAIRE MONTOIR,Navaid|ID:MT|Frequency:398/|Range:50 NM |Magnetic declination:-1|Aligned to true north:FALSE 116 | 83,47:46:09N,02:39:41W,75.0M,T,VANNES MEUCON,Navaid|ID:VA|Frequency:342/|Range:25 NM |Magnetic declination:-1|Aligned to true north:FALSE 117 | -------------------------------------------------------------------------------- /parser.js: -------------------------------------------------------------------------------- 1 | // Import dependencies 2 | var xml2js = require('xml2js'), 3 | fs = require('fs'), 4 | colors = require('colors/safe'), 5 | request = require('request'), 6 | Q = require('q'), 7 | GeoJSON = require('geojson'); 8 | // Declare global vars 9 | var airports = [], 10 | runways = [], 11 | airspaces = [], 12 | navaids = [], 13 | hotspots = [], 14 | pathInput = "./input/", 15 | pathOutput = "./output/", 16 | points = [], 17 | polygons = [], 18 | fileTypes = ['airports', 'airspace', 'hotspot', 'navaid'], 19 | geoBlocks = ['airports', 'airspaces', 'hotspots', 'navaids', 'runways'], 20 | fileStatus = ['listed', 'loaded', 'analysed', 'checked', 'finished'], 21 | allFiles = 0, 22 | datas = []; 23 | var readDir = Q.denodeify(fs.readdir); 24 | var readFile = Q.denodeify(fs.readFile); 25 | init() 26 | .then(readDir) 27 | .then(createFileList) 28 | .then(getDataFromFiles);/* 29 | .then(fnTest) 30 | .catch(function(error){ 31 | console.error(colors.red("ERRROR :\n"+error)); 32 | }) 33 | .done(function(value){ 34 | console.log(colors.cyan("DONE :")); 35 | console.log(colors.cyan(JSON.stringify(value))); 36 | });*/ 37 | function init(){ 38 | // Shows the main menu used by this little script. 39 | console.log(colors.green("################################################################################")); 40 | console.log(colors.green("# #")); 41 | console.log(colors.green("# OpenAIP to GeoJSON converter #")); 42 | console.log(colors.green("# #")); 43 | console.log(colors.green("################################################################################")); 44 | console.log("\n"); 45 | console.log(colors.green("This parser will analyse all datas in folder [input], and will analyse if there \nis any duplicates entries.\n")); 46 | console.log(colors.green("Be sure all your files in the \"input\" folder.\n")); 47 | 48 | console.log(colors.green(">>> reading [input] folder")); 49 | var deferred = Q.defer(); 50 | deferred.resolve(pathInput); 51 | return deferred.promise; 52 | } 53 | function fnTest(response){ 54 | var deferred = Q.defer(); 55 | console.log(colors.gray("TEST :\n")); 56 | console.log(colors.gray(JSON.stringify(response))); 57 | deferred.resolve(response); 58 | return deferred.promise; 59 | } 60 | function createFileList(list){ 61 | console.log(colors.green(">>> Create the list of files to analyse")); 62 | var fileList = []; 63 | for(var i = 0; i < list.length; i++){ 64 | var item = { 65 | type: list[i].split("_")[1], 66 | ext : list[i].slice(-3), 67 | url : pathInput+list[i] 68 | }; 69 | switch(item.ext){ 70 | case 'aip' : fileList.push(item); break; 71 | } 72 | } 73 | allFiles = fileList.length; 74 | console.log(colors.green(">>> "+fileList.length +" files will be analysed")); 75 | return fileList; 76 | } 77 | function getDataFromFiles(list){ 78 | var deferred = Q.defer(); 79 | console.log(colors.green(">>> Getting datas from files")); 80 | for(var i = 0; i < list.length; i++){ 81 | console.log(colors.blue(">>> Parsing datas from xml for " + list[i].url)); 82 | readFile(list[i].url, 'utf8') 83 | .then(parseXMLdatas) 84 | .then(analyseParsedData) 85 | .then(secondPartOfTheJob) 86 | .then(checkDuplicatesInArray) 87 | .then(produceGeoJSON); 88 | } 89 | deferred.resolve(datas); 90 | return deferred.promise; 91 | } 92 | function parseXMLdatas(data){ 93 | var deferred = Q.defer(); 94 | xml2js.parseString(data, function(err, result){ 95 | if(err) { 96 | deferred.reject(new Error(err)); 97 | } else { 98 | deferred.resolve(result); 99 | } 100 | }); 101 | return deferred.promise; 102 | } 103 | function analyseParsedData(data){ 104 | var deferred = Q.defer(); 105 | var count = 0; 106 | if( data.OPENAIP.HOTSPOTS !== undefined){ 107 | count = data.OPENAIP.HOTSPOTS[0].HOTSPOT.length; 108 | for(var i = 0; i < count; i++){ 109 | createHotspot(data.OPENAIP.HOTSPOTS[0].HOTSPOT[i]) 110 | .done(function(result){ 111 | hotspots.push(result); 112 | }); 113 | } 114 | allFiles--; 115 | } else if( data.OPENAIP.AIRSPACES !== undefined){ 116 | count = data.OPENAIP.AIRSPACES[0].ASP.length; 117 | for(var i = 0; i < count ; i++){ 118 | createAirspace(data.OPENAIP.AIRSPACES[0].ASP[i]) 119 | .done(function(result){ 120 | airspaces.push(result); 121 | }); 122 | } 123 | allFiles--; 124 | } else if( data.OPENAIP.NAVAIDS !== undefined){ 125 | count = data.OPENAIP.NAVAIDS[0].NAVAID.length; 126 | for(var i = 0; i < count ; i++){ 127 | createNavaid(data.OPENAIP.NAVAIDS[0].NAVAID[i]) 128 | .done(function(result){ 129 | navaids.push(result); 130 | }); 131 | } 132 | allFiles--; 133 | } else if( data.OPENAIP.WAYPOINTS !== undefined){ 134 | count = data.OPENAIP.WAYPOINTS[0].AIRPORT.length; 135 | for(var i = 0; i < count ; i++){ 136 | createAirport(data.OPENAIP.WAYPOINTS[0].AIRPORT[i]) 137 | .done(function(result){ 138 | airports.push(result); 139 | }); 140 | } 141 | allFiles--; 142 | } else { 143 | throw new Error("There are other data types than airports, airspaces, navaids or hotspots"); 144 | } 145 | console.log(colors.yellow(">>> Found " + count +" items to work on.")); 146 | deferred.resolve(datas); 147 | return deferred.promise; 148 | } 149 | function createHotspot(data){ 150 | var deferred = Q.defer(); 151 | var hotspot = { 152 | guid: "", 153 | aeronautical : "hotspot", 154 | type: data.$.TYPE, 155 | country: data.COUNTRY[0], 156 | name: data.NAME[0], 157 | latitude : parseFloat(data.GEOLOCATION[0].LAT[0]), 158 | longitude : parseFloat(data.GEOLOCATION[0].LON[0]), 159 | elev : parseFloat(data.GEOLOCATION[0].ELEV[0]._), 160 | reliability: parseFloat(data.RELIABILITY[0]), 161 | occurrence: data.OCCURRENCE[0], 162 | conditions:[] 163 | }; 164 | // Working on conditions. 165 | if(data.CONDITIONS != undefined){ 166 | for(var i = 0; i < data.CONDITIONS.length; i++){ 167 | var tmpCond = data.CONDITIONS[i]; 168 | var cond = { 169 | type: tmpCond.$.TYPE, 170 | timeofday: [], 171 | wind:[] 172 | }; 173 | // Work on times 174 | if(tmpCond.TIMEOFDAY != undefined){ 175 | for(var j=0; j < tmpCond.TIMEOFDAY[0].TIME.length; j++){ 176 | cond.timeofday.push(tmpCond.TIMEOFDAY[0].TIME[j]); 177 | } 178 | } 179 | // Work on winds 180 | if(tmpCond.WIND != undefined){ 181 | for(var j = 0; j < tmpCond.WIND[0].DIRECTION.length; j++){ 182 | cond.wind.push(tmpCond.WIND[0].DIRECTION[j]); 183 | } 184 | } 185 | hotspot.conditions.push(cond); 186 | } 187 | } 188 | deferred.resolve(hotspot); 189 | return deferred.promise; 190 | } 191 | function createAirspace(data){ 192 | var deferred = Q.defer(); 193 | var airspace = { 194 | guid: "", 195 | aeronautical : "airspace", 196 | category: data.$.CATEGORY, 197 | version: data.VERSION[0], 198 | id: data.ID[0], 199 | country: data.COUNTRY[0], 200 | name: data.NAME[0], 201 | alt_limits:{ 202 | top:{ 203 | ref:data.ALTLIMIT_TOP[0].$.REFERENCE, 204 | value: data.ALTLIMIT_TOP[0].ALT[0].$.UNIT +" "+ data.ALTLIMIT_TOP[0].ALT[0]._ 205 | }, 206 | bottom:{ 207 | ref:data.ALTLIMIT_BOTTOM[0].$.REFERENCE, 208 | value:data.ALTLIMIT_BOTTOM[0].ALT[0].$.UNIT +" "+ data.ALTLIMIT_BOTTOM[0].ALT[0]._ 209 | } 210 | }, 211 | geometry:[] 212 | }; 213 | // Generate vertexes for airspaces geometry 214 | // A GeoJSON polygon is polygon : [ [ [Coordinates 1] ] ] 215 | var strGeomArr = data.GEOMETRY[0].POLYGON[0].split(', '); 216 | var vertexes = []; 217 | for(var g = 0; g < strGeomArr.length; g++){ 218 | var tmpVertex = strGeomArr[g].split(" "); 219 | var vertex = [ parseFloat(tmpVertex[0]), parseFloat(tmpVertex[1])]; 220 | vertexes.push(vertex); 221 | } 222 | airspace.geometry = [ vertexes ]; 223 | deferred.resolve(airspace); 224 | return deferred.promise; 225 | } 226 | function createNavaid(data){ 227 | var deferred = Q.defer(); 228 | var navaid = { 229 | guid: "", 230 | aeronautical : "navaid", 231 | type: data.$.TYPE, 232 | country: data.COUNTRY[0], 233 | id: data.ID[0], 234 | latitude : parseFloat(data.GEOLOCATION[0].LAT[0]), 235 | longitude : parseFloat(data.GEOLOCATION[0].LON[0]), 236 | elev : parseFloat(data.GEOLOCATION[0].ELEV[0]._), 237 | radios:[], 238 | params:{ 239 | range: (data.PARAMS[0].RANGE != undefined) ? parseFloat(data.PARAMS[0].RANGE[0]._) : null, 240 | declination : parseFloat(data.PARAMS[0].DECLINATION[0]), 241 | alignedtotruenorth : !(data.PARAMS[0].ALIGNEDTOTRUENORTH[0] === "FALSE") 242 | } 243 | }; 244 | // Work on radio 245 | if(data.RADIO != undefined){ 246 | for(var j =0; j < data.RADIO.length; j++){ 247 | var radio = { 248 | frequency: parseFloat(data.RADIO[j].FREQUENCY[0]), 249 | channel: (data.RADIO[j].CHANNEL != undefined) ? data.RADIO[j].CHANNEL[0] : "" 250 | }; 251 | navaid.radios.push(radio); 252 | } 253 | } 254 | deferred.resolve(navaid); 255 | return deferred.promise; 256 | } 257 | function createAirport(data){ 258 | var deferred = Q.defer(); 259 | var airport = { 260 | guid: "", 261 | aeronautical : "airport", 262 | name: data.NAME[0], 263 | type: data.$.TYPE, 264 | country: data.COUNTRY[0], 265 | icao : (data.ICAO != undefined ) ? data.ICAO[0] : "", 266 | radios: [], 267 | latitude : parseFloat(data.GEOLOCATION[0].LAT[0]), 268 | longitude : parseFloat(data.GEOLOCATION[0].LON[0]), 269 | elev : parseFloat(data.GEOLOCATION[0].ELEV[0]._) 270 | }; 271 | // Work on radios 272 | if(data.RADIO != undefined){ 273 | for(var r = 0; r < data.RADIO.length; r++){ 274 | var tempRadio = data.RADIO[r]; 275 | var radio = { 276 | category: tempRadio.$.CATEGORY, 277 | frequency: parseFloat(tempRadio.FREQUENCY[0]), 278 | type: tempRadio.TYPE[0], 279 | spec: (tempRadio.TYPESPEC != undefined ) ? tempRadio.TYPESPEC[0] : "", 280 | description: (tempRadio.DESCRIPTION != undefined) ? tempRadio.DESCRIPTION[0] : "" 281 | }; 282 | airport.radios.push(radio); 283 | } 284 | } 285 | // Work on runways 286 | if(data.RWY != undefined){ 287 | for(var r = 0; r < data.RWY.length; r++){ 288 | createRunway(data.RWY[r], airport) 289 | .done(function(result){ 290 | runways.push(result); 291 | }); 292 | } 293 | } 294 | deferred.resolve(airport); 295 | return deferred.promise; 296 | } 297 | function createRunway(data, airport){ 298 | var deferred = Q.defer(); 299 | var runway = { 300 | guid: "", 301 | aeronautical : "navaid", 302 | operations : data.$.OPERATIONS, 303 | airport : airport.name, 304 | name : data.NAME[0], 305 | sfc : data.SFC[0], 306 | latitude : airport.latitude, 307 | longitude : airport.longitude, 308 | elev : airport.elev, 309 | length : parseFloat(data.LENGTH[0]._), 310 | width : parseFloat(data.WIDTH[0]._), 311 | directions: [] 312 | }; 313 | if( data.DIRECTION != undefined ){ 314 | for(var z = 0; z < data.DIRECTION.length; z++){ 315 | runway.directions.push(data.DIRECTION[z].$.TC); 316 | } 317 | } 318 | deferred.resolve(runway); 319 | return deferred.promise; 320 | } 321 | function secondPartOfTheJob(){ 322 | var deferred = Q.defer(); 323 | if(allFiles == 0){ 324 | var datas = { 325 | airports : airports, 326 | airspaces : airspaces, 327 | hotspots : hotspots, 328 | navaids : navaids, 329 | runways : runways 330 | }; 331 | deferred.resolve(datas); 332 | } 333 | return deferred.promise; 334 | } 335 | function checkDuplicatesInArray(datas){ 336 | var deferred = Q.defer(); 337 | console.log(colors.magenta(">>> Safety : Checking for duplicates entries.")) 338 | var duplicatesCounter = 0; 339 | for(block in datas){ 340 | // Creating a temporary array 341 | var temporaryArray = []; 342 | console.log(colors.magenta(">>> Safety : Checking " + block + " ("+ block.length +" items).")); 343 | for(item in datas[block]){ 344 | // In this block, check for duplicates. 345 | // So, for each entry, loop on all next ones, and check if they are identical. 346 | if(temporaryArray.length == 0){ 347 | // First item, we add it directly to our temporaryArray. 348 | temporaryArray.push(item); 349 | } else { 350 | // Other items, need to check if it's already copied. 351 | var existsInArray = false; 352 | for(var j = 0; j < temporaryArray.length; j++){ 353 | if(temporaryArray[j] == item){ 354 | existsInArray = true; 355 | duplicatesCounter++; 356 | break; 357 | } 358 | } 359 | if(existsInArray === false){ 360 | temporaryArray.push(item); 361 | } 362 | } 363 | } 364 | // Changing the actual array. 365 | datas[block] = temporaryArray; 366 | } 367 | console.log(colors.magenta(">>> Safety : " + duplicatesCounter + " duplicates found and removed")) 368 | deferred.resolve(datas); 369 | return deferred.promise; 370 | } 371 | function produceGeoJSON(datas){ 372 | console.log(colors.white(">>> Generating the GeoJSON Files")); 373 | for(block in datas){ 374 | console.log(colors.white(">>> Generating the GeoJSON for " + block + " ("+ block.length +" items).")); 375 | } 376 | } 377 | function createFile(datas, filename){ 378 | 379 | } 380 | -------------------------------------------------------------------------------- /example_files/input/openaip_navaid_france_fr.cup: -------------------------------------------------------------------------------- 1 | *** 2 | * 3 | * Exported on: 18.11.2016 4 | * This data is owned by Butterfly Avionics GmbH and licensed under the CC BY-NC-SA, 5 | * not to be used for commercial purposes. For more information on commercial licensing visit 6 | * 7 | * http://www.openaip.net/commercial-licensing 8 | * 9 | * openAIP data is not certified and must not be used for primary navigation or flight planning. 10 | * NEVER RELY ON OPENAIP DATA. openAIP data contains errors. Using openAIP data may 11 | * result in serious injury or death, use at your own risk! 12 | * 13 | * OPENAIP OFFERS THE WORK AS-IS AND MAKES NO REPRESENTATIONS OR WARRANTIES OF ANY KIND 14 | * CONCERNING THE WORK, EXPRESS, IMPLIED, STATUTORY OR OTHERWISE, INCLUDING, WITHOUT LIMITATION, 15 | * WARRANTIES OF TITLE, MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, NONINFRINGEMENT, OR 16 | * THE ABSENCE OF LATENT OR OTHER DEFECTS, ACCURACY, OR THE PRESENCE OF ABSENCE OF ERRORS, 17 | * WHETHER OR NOT DISCOVERABLE. SOME JURISDICTIONS DO NOT ALLOW THE EXCLUSION OF IMPLIED 18 | * WARRANTIES, SO THIS EXCLUSION MAY NOT APPLY TO YOU. 19 | * 20 | * EXCEPT TO THE EXTENT REQUIRED BY APPLICABLE LAW, IN NO EVENT WILL OPENAIP BE LIABLE TO YOU ON 21 | * ANY LEGAL THEORY FOR ANY SPECIAL, INCIDENTAL, CONSEQUENTIAL, PUNITIVE OR EXEMPLARY DAMAGES 22 | * ARISING OUT OF THIS LICENSE OR THE USE OF THE WORK, EVEN IF OPENAIP HAS BEEN ADVISED OF THE 23 | * POSSIBILITY OF SUCH DAMAGES. 24 | * 25 | *** 26 | 27 | name,country,lat,lon,elev,desc 28 | "ABBEVILLE","ABBEV",FR,5008.117N,00151.283E,68.0m,1,,,"","Navaid, ID ABB, Frequency 108.45/21Y, Range 60 NM, Magnetic declination -0.31475, Aligned to true north FALSE" 29 | "AGEN-GAUDONVILLE","AGEN-",FR,4353.267N,00052.367E,265.0m,1,,,"","Navaid, ID AGN, Frequency 114.8/95X, Range 100 NM, Magnetic declination -0.12077, Aligned to true north FALSE" 30 | "AJACCIO-COTI CHIAVARI","AJACC",FR,4146.233N,00846.483E,628.0m,1,,,"","Navaid, ID AJO, Frequency 114.8/95X, Range 200 NM, Magnetic declination 1.87235, Aligned to true north FALSE" 31 | "AMBERIEU","AMBER",FR,4559.317N,00519.883E,244.0m,1,,,"","Navaid, ID AMU, Frequency /110X, Range 120 NM, Magnetic declination 1.01494, Aligned to true north FALSE" 32 | "AMBOISE","AMBOI",FR,4725.733N,00103.867E,110.0m,1,,,"","Navaid, ID AMB, Frequency 113.7/84X, Range 80 NM, Magnetic declination -0.30056, Aligned to true north FALSE" 33 | "AMBOISE","AMBOI",FR,4725.083N,00102.467E,106.0m,1,,,"","Navaid, ID AMB, Frequency 341/84X, Range 50 NM, Magnetic declination -0.30598, Aligned to true north FALSE" 34 | "ANGERS","ANGER",FR,4732.217N,00051.117W,86.0m,1,,,"","Navaid, ID ANG, Frequency 113/84X, Range 80 NM, Magnetic declination -0.37491, Aligned to true north FALSE" 35 | "AVIGNON CAUMONT","AVIGN",FR,4354.500N,00454.317E,33.0m,1,,,"","Navaid, ID CM, Frequency 369/84X, Range 20 NM, Magnetic declination 0.96633, Aligned to true north FALSE" 36 | "AVIGNON PUJAUT","AVIGN",FR,4359.717N,00444.783E,44.0m,1,,,"","Navaid, ID AVN, Frequency 114.6/93X, Range 60 NM, Magnetic declination 0.92323, Aligned to true north FALSE" 37 | "AVORD","AVORD",FR,4703.483N,00237.783E,169.0m,1,,,"","Navaid, ID AVD, Frequency /43X, Range NM, Magnetic declination 0.49525, Aligned to true north FALSE" 38 | "AVORD","AVORD",FR,4707.233N,00247.967E,207.0m,1,,,"","Navaid, ID AVD, Frequency 288.500/43X, Range 20 NM, Magnetic declination 0.5408, Aligned to true north FALSE" 39 | "BALE NORTH","BALE ",FR,4739.702N,00728.746E,252.0m,1,,,"","Navaid, ID BN, Frequency 353/43X, Range NM, Magnetic declination 1.89404, Aligned to true north FALSE" 40 | "BALE SOUTH","BALE ",FR,4734.782N,00732.178E,268.0m,1,,,"","Navaid, ID BS, Frequency 376/43X, Range NM, Magnetic declination , Aligned to true north FALSE" 41 | "BASLE/MULHOUSE","BASLE",FR,4737.967N,00729.967E,256.0m,1,,,"","Navaid, ID BLM, Frequency 117.45/43X, Range 60 NM, Magnetic declination 1.40285, Aligned to true north FALSE" 42 | "BASTIA PORETTA","BASTI",FR,4234.417N,00928.483E,2.0m,1,,,"","Navaid, ID BTA, Frequency 114.15/88Y, Range 80 NM, Magnetic declination 2.05495, Aligned to true north FALSE" 43 | "BIARRITZ BAYONNE ANGLET","BIARR",FR,4328.000N,00130.617W,70.0m,1,,,"","Navaid, ID BTZ, Frequency 114.15/88Y, Range 60 NM, Magnetic declination -0.76625, Aligned to true north FALSE" 44 | "BORDEAUX MERIGNAC","BORDE",FR,4449.617N,00043.267W,49.0m,1,,,"","Navaid, ID BMC, Frequency 113.75/84Y, Range 100 NM, Magnetic declination -0.62189, Aligned to true north FALSE" 45 | "BOULOGNE SUR MER","BOULO",FR,5037.483N,00154.433E,168.0m,1,,,"","Navaid, ID BNE, Frequency 113.8/84Y, Range 70 NM, Magnetic declination -0.27113, Aligned to true north FALSE" 46 | "BOURSONNE","BOURS",FR,4911.300N,00303.400E,146.0m,1,,,"","Navaid, ID BSN, Frequency 114.85/95Y, Range 60 NM, Magnetic declination 0.2179, Aligned to true north FALSE" 47 | "BRAY SUR SEINE","BRAY ",FR,4824.417N,00317.683E,78.0m,1,,,"","Navaid, ID BRY, Frequency 114.1/88X, Range 60 NM, Magnetic declination 0.3416, Aligned to true north FALSE" 48 | "BREST BRETAGNE","BREST",FR,4828.650N,00417.133W,111.0m,1,,,"","Navaid, ID GU, Frequency 338/88X, Range 25 NM, Magnetic declination -3, Aligned to true north FALSE" 49 | "BREST BRETAGNE","BREST",FR,4826.667N,00424.983W,93.0m,1,,,"","Navaid, ID BGP, Frequency 387/88X, Range 25 NM, Magnetic declination -3, Aligned to true north FALSE" 50 | "CAEN CARPIQUET","CAEN ",FR,4910.400N,00027.317W,74.0m,1,,,"","Navaid, ID CAN, Frequency 114.45/88X, Range 80 NM, Magnetic declination -0.92415, Aligned to true north FALSE" 51 | "CALVI SAINTE CATHERINE","CALVI",FR,4234.617N,00848.400E,8.0m,1,,,"","Navaid, ID CV, Frequency 375/88X, Range 25 NM, Magnetic declination 1.91392, Aligned to true north FALSE" 52 | "CAMBRAI EPINOY","CAMBR",FR,5013.683N,00309.083E,67.0m,1,,,"","Navaid, ID CMB, Frequency 112.6/73X, Range 80 NM, Magnetic declination 0.17028, Aligned to true north FALSE" 53 | "CANNES TANNERON","CANNE",FR,4333.617N,00652.250E,481.0m,1,,,"","Navaid, ID CNM, Frequency 111.4/73X, Range 40 NM, Magnetic declination 1.4767, Aligned to true north FALSE" 54 | "CHAMBERY","CHAMB",FR,4552.913N,00545.438E,1432.0m,1,,,"","Navaid, ID CBY, Frequency 115.4/102Y, Range NM, Magnetic declination 1.10301, Aligned to true north FALSE" 55 | "CHAMBERY AIX LES BAINS","CHAMB",FR,4535.533N,00553.017E,252.0m,1,,,"","Navaid, ID CH, Frequency 346/102Y, Range 25 NM, Magnetic declination 1.38149, Aligned to true north FALSE" 56 | "CHARTRES LA LOUPE","CHART",FR,4828.800N,00059.217E,213.0m,1,,,"","Navaid, ID CHW, Frequency 115.2/99X, Range 100 NM, Magnetic declination -0.38167, Aligned to true north FALSE" 57 | "CHATEAUDUN","CHATE",FR,4803.350N,00122.517E,126.0m,1,,,"","Navaid, ID CHN, Frequency /39X, Range 40 NM, Magnetic declination -0.22306, Aligned to true north FALSE" 58 | "CHATEAUDUN","CHATE",FR,4803.550N,00123.217E,126.0m,1,,,"","Navaid, ID CAD, Frequency 115.95/106Y, Range 80 NM, Magnetic declination -0.21992, Aligned to true north FALSE" 59 | "CHATEAUDUN","CHATE",FR,4803.800N,00121.817E,130.0m,1,,,"","Navaid, ID CDN, Frequency 359.5/106Y, Range 50 NM, Magnetic declination -0.22934, Aligned to true north FALSE" 60 | "CHATEAUROUX DEOLS","CHATE",FR,4656.200N,00148.067E,165.0m,1,,,"","Navaid, ID CTX, Frequency 428/106Y, Range 50 NM, Magnetic declination -0.01078, Aligned to true north FALSE" 61 | "CHATILLON SUR MARNE","CHATI",FR,4908.267N,00334.667E,195.0m,1,,,"","Navaid, ID CTL, Frequency 117.6/123X, Range 70 NM, Magnetic declination 0.38442, Aligned to true north FALSE" 62 | "CLERMONT FERRAND AUVERGNE","CLERM",FR,4547.250N,00311.533E,321.0m,1,,,"","Navaid, ID CFA, Frequency 114.35/90Y, Range 100 NM, Magnetic declination 0.46249, Aligned to true north FALSE" 63 | "COGNAC CHATEAUBERNARD","COGNA",FR,4539.567N,00018.700W,25.0m,1,,,"","Navaid, ID CNA, Frequency 114.65/93Y, Range 100 NM, Magnetic declination -0.55744, Aligned to true north FALSE" 64 | "COGNAC CHATEAUBERNARD","COGNA",FR,4540.167N,00018.367W,33.0m,1,,,"","Navaid, ID CGC, Frequency 354/93Y, Range 75 NM, Magnetic declination -0.5582, Aligned to true north FALSE" 65 | "COGNAC CHATEAUBERNARD","COGNA",FR,4539.683N,00018.467W,28.0m,1,,,"","Navaid, ID CGC, Frequency /109X, Range 160 NM, Magnetic declination -0.55744, Aligned to true north FALSE" 66 | "COULOMMIERS VOISINS","COULO",FR,4850.683N,00300.833E,139.0m,1,,,"","Navaid, ID CLM, Frequency 112.9/76X, Range 60 NM, Magnetic declination 0.22945, Aligned to true north FALSE" 67 | "DEAUVILLE NORMANDIE","DEAUV",FR,4918.650N,00018.767E,145.0m,1,,,"","Navaid, ID DVL, Frequency 110.2/76X, Range 60 NM, Magnetic declination -0.67814, Aligned to true north FALSE" 68 | "DIEPPE","DIEPP",FR,4955.517N,00110.233E,104.0m,1,,,"","Navaid, ID DPE, Frequency 115.8/76X, Range 40 NM, Magnetic declination -0.45175, Aligned to true north FALSE" 69 | "DIGNE","DIGNE",FR,4359.483N,00606.050E,913.0m,1,,,"","Navaid, ID DGN, Frequency 113.85/76X, Range 90 NM, Magnetic declination 1.28828, Aligned to true north FALSE" 70 | "DIJON-LONGVIC","DIJON",FR,4716.317N,00505.500E,216.0m,1,,,"","Navaid, ID DIJ, Frequency /82X, Range 60 NM, Magnetic declination 0.93049, Aligned to true north FALSE" 71 | "DINARD PLEURTUIT SAINT MALO","DINAR",FR,4835.167N,00204.933W,63.0m,1,,,"","Navaid, ID DIN, Frequency 114.300/90X, Range 80 NM, Magnetic declination -2, Aligned to true north FALSE" 72 | "DINARD PLEURTUIT SAINT MALO","DINAR",FR,4828.917N,00203.167W,62.0m,1,,,"","Navaid, ID DR, Frequency 390/90X, Range 25 NM, Magnetic declination -2, Aligned to true north FALSE" 73 | "EPERNON","EPERN",FR,4837.550N,00139.400E,158.0m,1,,,"","Navaid, ID EPR, Frequency 115.65/103Y, Range 60 NM, Magnetic declination -0.17835, Aligned to true north FALSE" 74 | "EPINAL MIRECOURT","EPINA",FR,4819.067N,00603.567E,343.0m,1,,,"","Navaid, ID EPL, Frequency 113/103Y, Range 60 NM, Magnetic declination 1.16441, Aligned to true north FALSE" 75 | "EVREUX FAUVILLE","EVREU",FR,4901.717N,00112.850E,136.0m,1,,,"","Navaid, ID EVX, Frequency /71X, Range NM, Magnetic declination -0.35649, Aligned to true north FALSE" 76 | "EVREUX FAUVILLE","EVREU",FR,4901.717N,00112.850E,136.0m,1,,,"","Navaid, ID EVX, Frequency 112.4/71X, Range 60 NM, Magnetic declination -0.35649, Aligned to true north FALSE" 77 | "GAILLAC-CASTELNAU DE MONTMIRAIL","GAILL",FR,4357.250N,00149.450E,295.0m,1,,,"","Navaid, ID GAI, Frequency 115.8/71X, Range 100 NM, Magnetic declination 0.17109, Aligned to true north FALSE" 78 | "GROSTENQUIN","GROST",FR,4859.183N,00642.967E,309.0m,1,,,"","Navaid, ID GTQ, Frequency 111.25/49Y, Range 60 NM, Magnetic declination 1.33061, Aligned to true north FALSE" 79 | "GUISCRIFF SCAER","GUISC",FR,4809.600N,00336.150W,227.0m,1,,,"","Navaid, ID GSG, Frequency 395/49Y, Range 25 NM, Magnetic declination -3, Aligned to true north FALSE" 80 | "HERICOURT","HERIC",FR,4733.700N,00643.933E,399.0m,1,,,"","Navaid, ID HR, Frequency 289/49Y, Range 30 NM, Magnetic declination 1.37482, Aligned to true north FALSE" 81 | "ISTRES LE TUBE","ISTRE",FR,4330.017N,00456.400E,15.0m,1,,,"","Navaid, ID ITS, Frequency 112.700/74X, Range NM, Magnetic declination 1, Aligned to true north FALSE" 82 | "L'AIGLE","L'AIG",FR,4847.433N,00031.817E,290.0m,1,,,"","Navaid, ID LGL, Frequency 115.000/74X, Range NM, Magnetic declination -2, Aligned to true north FALSE" 83 | "LA CHATRE","LA CH",FR,4641.483N,00208.967E,269.0m,1,,,"","Navaid, ID LCA, Frequency 112.1/74X, Range NM, Magnetic declination 0.3783, Aligned to true north FALSE" 84 | "LANNION","LANNI",FR,4843.150N,00318.467W,71.0m,1,,,"","Navaid, ID LN, Frequency 345/74X, Range 50 NM, Magnetic declination -3, Aligned to true north FALSE" 85 | "LANVEOC POULMIC","LANVE",FR,4817.017N,00425.933W,76.0m,1,,,"","Navaid, ID BST, Frequency 428/74X, Range 50 NM, Magnetic declination -3, Aligned to true north FALSE" 86 | "LA ROCHE SUR YON LES AJONCS","LA RO",FR,4641.350N,00117.183W,93.0m,1,,,"","Navaid, ID YN, Frequency 334/74X, Range NM, Magnetic declination -1, Aligned to true north FALSE" 87 | "LA TOUR DU PIN","LA TO",FR,4529.340N,00526.344E,641.0m,1,,,"","Navaid, ID LTP, Frequency 115.55/74X, Range NM, Magnetic declination 1.0302, Aligned to true north FALSE" 88 | "LE LUC LE CANNET","LE LU",FR,4322.967N,00615.350E,303.0m,1,,,"","Navaid, ID LUC, Frequency 113.0/77X, Range NM, Magnetic declination 1, Aligned to true north FALSE" 89 | "LEMBEYE","LEMBE",FR,4328.000N,00001.100W,293.0m,1,,,"","Navaid, ID LMB, Frequency 111.8/77X, Range NM, Magnetic declination -1, Aligned to true north FALSE" 90 | "LILLE LESQUIN","LILLE",FR,4328.000N,00001.100W,293.0m,1,,,"","Navaid, ID LEQ, Frequency 109.0/27X, Range NM, Magnetic declination -0.06258, Aligned to true north FALSE" 91 | "LIMOGES","LIMOG",FR,4548.950N,00101.533E,417.0m,1,,,"","Navaid, ID LMG, Frequency 114.5/92X, Range NM, Magnetic declination -1, Aligned to true north FALSE" 92 | "LORIENT LANN BIHOUE","LORIE",FR,4745.783N,00326.433W,44.0m,1,,,"","Navaid, ID LOR, Frequency 359/92X, Range 50 NM, Magnetic declination -2, Aligned to true north FALSE" 93 | "LUXEUIL","LUXEU",FR,4741.300N,00617.733E,316.0m,1,,,"","Navaid, ID LUL, Frequency 117.1/92X, Range NM, Magnetic declination 1, Aligned to true north FALSE" 94 | "LYON SAINT EXUPERY","LYON ",FR,4544.733N,00505.433E,234.0m,1,,,"","Navaid, ID LSE, Frequency 114.75/94Y, Range NM, Magnetic declination 1.22442, Aligned to true north FALSE" 95 | "MELUN","MELUN",FR,4827.350N,00248.800E,102.0m,1,,,"","Navaid, ID MLN, Frequency 113.6/83X, Range 40 NM, Magnetic declination 0.23263, Aligned to true north FALSE" 96 | "MONTMEDY-DUN SUR MEUSE","MONTM",FR,4923.475N,00523.475E,190.0m,1,,,"","Navaid, ID MMD, Frequency 109.4/83X, Range 40 NM, Magnetic declination 1.12985, Aligned to true north FALSE" 97 | "MORLAIX PLOUJEAN","MORLA",FR,4838.800N,00345.767W,120.0m,1,,,"","Navaid, ID MLX, Frequency 371/83X, Range 25 NM, Magnetic declination -3, Aligned to true north FALSE" 98 | "NANTES ATLANTIQUE","NANTE",FR,4703.167N,00141.267W,1.0m,1,,,"","Navaid, ID GL, Frequency 369/83X, Range 25 NM, Magnetic declination -1, Aligned to true north FALSE" 99 | "NANTES ATLANTIQUE","NANTE",FR,4709.650N,00136.767W,25.0m,1,,,"","Navaid, ID NTS, Frequency 115.500/102X, Range 150 NM, Magnetic declination -1, Aligned to true north FALSE" 100 | "PITHIVIERS","PITHI",FR,4809.333N,00215.883E,121.0m,1,,,"","Navaid, ID PTV, Frequency 116.5/102X, Range 100 NM, Magnetic declination 0.08418, Aligned to true north FALSE" 101 | "PONTOISE","PONTO",FR,4906.333N,00202.750E,95.0m,1,,,"","Navaid, ID PON, Frequency 111.6/102X, Range NM, Magnetic declination 0.135, Aligned to true north FALSE" 102 | "QUIMPER PLUGUFFAN","QUIMP",FR,4757.433N,00411.083W,84.0m,1,,,"","Navaid, ID QPR, Frequency 117.800/125X, Range 150 NM, Magnetic declination -3, Aligned to true north FALSE" 103 | "QUIMPER PLUGUFFAN","QUIMP",FR,4758.083N,00359.900W,101.0m,1,,,"","Navaid, ID RQ, Frequency 380/125X, Range 25 NM, Magnetic declination -3, Aligned to true north FALSE" 104 | "QUIMPER PLUGUFFAN","QUIMP",FR,4758.083N,00359.900W,101.0m,1,,,"","Navaid, ID RQ, Frequency 380/125X, Range 25 NM, Magnetic declination -3, Aligned to true north FALSE" 105 | "RENNES SAINT JACQUES","RENNE",FR,4803.183N,00135.067W,55.0m,1,,,"","Navaid, ID RS, Frequency 349/125X, Range 25 NM, Magnetic declination -2, Aligned to true north FALSE" 106 | "RENNES SAINT JACQUES","RENNE",FR,4804.150N,00144.500W,30.0m,1,,,"","Navaid, ID REN, Frequency 109.250/29Y, Range 150 NM, Magnetic declination -2, Aligned to true north FALSE" 107 | "SAINT BRIEUC ARMOR","SAINT",FR,4834.050N,00246.950W,67.0m,1,,,"","Navaid, ID SB, Frequency 353/29Y, Range 35 NM, Magnetic declination -2, Aligned to true north FALSE" 108 | "SAINT EXUPERY","SAINT",FR,4544.730N,00505.435E,234.0m,1,,,"","Navaid, ID LSE, Frequency 114.75/29Y, Range NM, Magnetic declination 0.92899, Aligned to true north FALSE" 109 | "SAINT NAZAIRE MONTOIR","SAINT",FR,4720.017N,00202.667W,2.0m,1,,,"","Navaid, ID MT, Frequency 398/29Y, Range 50 NM, Magnetic declination -1, Aligned to true north FALSE" 110 | "VANNES MEUCON","VANNE",FR,4746.150N,00239.683W,75.0m,1,,,"","Navaid, ID VA, Frequency 342/29Y, Range 25 NM, Magnetic declination -1, Aligned to true north FALSE" 111 | -------------------------------------------------------------------------------- /example_files/output/navaids.geojson: -------------------------------------------------------------------------------- 1 | {"type":"FeatureCollection","features":[{"type":"Feature","geometry":{"type":"Point","coordinates":[1.8547222222222,50.135277777778]},"properties":{"guid":"","aeronautical":"navaid","type":"VOR-DME","country":"FR","id":"ABB","elev":68,"radios":[{"frequency":108.45,"channel":"21Y"}],"params":{"range":60,"declination":-0.31475,"alignedtotruenorth":false}}},{"type":"Feature","geometry":{"type":"Point","coordinates":[0.87277777777778,43.887777777778]},"properties":{"guid":"","aeronautical":"navaid","type":"VOR-DME","country":"FR","id":"AGN","elev":265,"radios":[{"frequency":114.8,"channel":"95X"}],"params":{"range":100,"declination":-0.12077,"alignedtotruenorth":false}}},{"type":"Feature","geometry":{"type":"Point","coordinates":[8.7747222222222,41.770555555556]},"properties":{"guid":"","aeronautical":"navaid","type":"VOR-DME","country":"FR","id":"AJO","elev":628,"radios":[{"frequency":114.8,"channel":"95X"}],"params":{"range":200,"declination":1.87235,"alignedtotruenorth":false}}},{"type":"Feature","geometry":{"type":"Point","coordinates":[5.3313888888889,45.988611111111]},"properties":{"guid":"","aeronautical":"navaid","type":"TACAN","country":"FR","id":"AMU","elev":244,"radios":[{"frequency":null,"channel":"110X"}],"params":{"range":120,"declination":1.01494,"alignedtotruenorth":false}}},{"type":"Feature","geometry":{"type":"Point","coordinates":[1.0644444444444,47.428888888889]},"properties":{"guid":"","aeronautical":"navaid","type":"VOR-DME","country":"FR","id":"AMB","elev":110,"radios":[{"frequency":113.7,"channel":"84X"}],"params":{"range":80,"declination":-0.30056,"alignedtotruenorth":false}}},{"type":"Feature","geometry":{"type":"Point","coordinates":[1.0411111111111,47.418055555556]},"properties":{"guid":"","aeronautical":"navaid","type":"NDB","country":"FR","id":"AMB","elev":106,"radios":[{"frequency":341,"channel":""}],"params":{"range":50,"declination":-0.30598,"alignedtotruenorth":false}}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-0.85194444444444,47.536944444444]},"properties":{"guid":"","aeronautical":"navaid","type":"VOR","country":"FR","id":"ANG","elev":86,"radios":[{"frequency":113,"channel":""}],"params":{"range":80,"declination":-0.37491,"alignedtotruenorth":false}}},{"type":"Feature","geometry":{"type":"Point","coordinates":[4.9052777777778,43.908333333333]},"properties":{"guid":"","aeronautical":"navaid","type":"NDB","country":"FR","id":"CM","elev":33,"radios":[{"frequency":369,"channel":""}],"params":{"range":20,"declination":0.96633,"alignedtotruenorth":false}}},{"type":"Feature","geometry":{"type":"Point","coordinates":[4.7463888888889,43.995277777778]},"properties":{"guid":"","aeronautical":"navaid","type":"VOR-DME","country":"FR","id":"AVN","elev":44,"radios":[{"frequency":114.6,"channel":"93X"}],"params":{"range":60,"declination":0.92323,"alignedtotruenorth":false}}},{"type":"Feature","geometry":{"type":"Point","coordinates":[2.6297222222222,47.058055555556]},"properties":{"guid":"","aeronautical":"navaid","type":"TACAN","country":"FR","id":"AVD","elev":169,"radios":[{"frequency":null,"channel":"43X"}],"params":{"range":null,"declination":0.49525,"alignedtotruenorth":false}}},{"type":"Feature","geometry":{"type":"Point","coordinates":[2.7994444444444,47.120555555556]},"properties":{"guid":"","aeronautical":"navaid","type":"NDB","country":"FR","id":"AVD","elev":207,"radios":[{"frequency":288.5,"channel":""}],"params":{"range":20,"declination":0.5408,"alignedtotruenorth":false}}},{"type":"Feature","geometry":{"type":"Point","coordinates":[7.4791,47.6617]},"properties":{"guid":"","aeronautical":"navaid","type":"NDB","country":"FR","id":"BN","elev":252,"radios":[{"frequency":353,"channel":""}],"params":{"range":null,"declination":1.89404,"alignedtotruenorth":false}}},{"type":"Feature","geometry":{"type":"Point","coordinates":[7.5363,47.5797]},"properties":{"guid":"","aeronautical":"navaid","type":"NDB","country":"FR","id":"BS","elev":268,"radios":[{"frequency":376,"channel":""}],"params":{"range":null,"declination":null,"alignedtotruenorth":false}}},{"type":"Feature","geometry":{"type":"Point","coordinates":[7.4994444444444,47.632777777778]},"properties":{"guid":"","aeronautical":"navaid","type":"DVOR-DME","country":"FR","id":"BLM","elev":256,"radios":[{"frequency":117.45,"channel":""}],"params":{"range":60,"declination":1.40285,"alignedtotruenorth":false}}},{"type":"Feature","geometry":{"type":"Point","coordinates":[9.4747222222222,42.573611111111]},"properties":{"guid":"","aeronautical":"navaid","type":"VOR-DME","country":"FR","id":"BTA","elev":2,"radios":[{"frequency":114.15,"channel":"88Y"}],"params":{"range":80,"declination":2.05495,"alignedtotruenorth":false}}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-1.5102777777778,43.466666666667]},"properties":{"guid":"","aeronautical":"navaid","type":"VOR-DME","country":"FR","id":"BTZ","elev":70,"radios":[{"frequency":114.15,"channel":"88Y"}],"params":{"range":60,"declination":-0.76625,"alignedtotruenorth":false}}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-0.72111111111111,44.826944444444]},"properties":{"guid":"","aeronautical":"navaid","type":"VOR-DME","country":"FR","id":"BMC","elev":49,"radios":[{"frequency":113.75,"channel":"84Y"}],"params":{"range":100,"declination":-0.62189,"alignedtotruenorth":false}}},{"type":"Feature","geometry":{"type":"Point","coordinates":[1.9072222222222,50.624722222222]},"properties":{"guid":"","aeronautical":"navaid","type":"VOR","country":"FR","id":"BNE","elev":168,"radios":[{"frequency":113.8,"channel":""}],"params":{"range":70,"declination":-0.27113,"alignedtotruenorth":false}}},{"type":"Feature","geometry":{"type":"Point","coordinates":[3.0566666666667,49.188333333333]},"properties":{"guid":"","aeronautical":"navaid","type":"DME","country":"FR","id":"BSN","elev":146,"radios":[{"frequency":114.85,"channel":"95Y"}],"params":{"range":60,"declination":0.2179,"alignedtotruenorth":false}}},{"type":"Feature","geometry":{"type":"Point","coordinates":[3.2947222222222,48.406944444444]},"properties":{"guid":"","aeronautical":"navaid","type":"VOR-DME","country":"FR","id":"BRY","elev":78,"radios":[{"frequency":114.1,"channel":"88X"}],"params":{"range":60,"declination":0.3416,"alignedtotruenorth":false}}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-4.2855555555556,48.4775]},"properties":{"guid":"","aeronautical":"navaid","type":"NDB","country":"FR","id":"GU","elev":111,"radios":[{"frequency":338,"channel":""}],"params":{"range":25,"declination":-3,"alignedtotruenorth":false}}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-4.4163888888889,48.444444444444]},"properties":{"guid":"","aeronautical":"navaid","type":"NDB","country":"FR","id":"BGP","elev":93,"radios":[{"frequency":387,"channel":""}],"params":{"range":25,"declination":-3,"alignedtotruenorth":false}}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-0.45527777777778,49.173333333333]},"properties":{"guid":"","aeronautical":"navaid","type":"VOR","country":"FR","id":"CAN","elev":74,"radios":[{"frequency":114.45,"channel":""}],"params":{"range":80,"declination":-0.92415,"alignedtotruenorth":false}}},{"type":"Feature","geometry":{"type":"Point","coordinates":[8.8066666666667,42.576944444444]},"properties":{"guid":"","aeronautical":"navaid","type":"NDB","country":"FR","id":"CV","elev":8,"radios":[{"frequency":375,"channel":""}],"params":{"range":25,"declination":1.91392,"alignedtotruenorth":false}}},{"type":"Feature","geometry":{"type":"Point","coordinates":[3.1513888888889,50.228055555556]},"properties":{"guid":"","aeronautical":"navaid","type":"VOR-DME","country":"FR","id":"CMB","elev":67,"radios":[{"frequency":112.6,"channel":"73X"}],"params":{"range":80,"declination":0.17028,"alignedtotruenorth":false}}},{"type":"Feature","geometry":{"type":"Point","coordinates":[6.8708333333333,43.560277777778]},"properties":{"guid":"","aeronautical":"navaid","type":"VOR","country":"FR","id":"CNM","elev":481,"radios":[{"frequency":111.4,"channel":""}],"params":{"range":40,"declination":1.4767,"alignedtotruenorth":false}}},{"type":"Feature","geometry":{"type":"Point","coordinates":[5.757306,45.88188]},"properties":{"guid":"","aeronautical":"navaid","type":"VOR-DME","country":"FR","id":"CBY","elev":1432,"radios":[{"frequency":115.4,"channel":"102Y"}],"params":{"range":null,"declination":1.10301,"alignedtotruenorth":false}}},{"type":"Feature","geometry":{"type":"Point","coordinates":[5.8836111111111,45.592222222222]},"properties":{"guid":"","aeronautical":"navaid","type":"NDB","country":"FR","id":"CH","elev":252,"radios":[{"frequency":346,"channel":""}],"params":{"range":25,"declination":1.38149,"alignedtotruenorth":false}}},{"type":"Feature","geometry":{"type":"Point","coordinates":[0.98694444444444,48.48]},"properties":{"guid":"","aeronautical":"navaid","type":"VOR-DME","country":"FR","id":"CHW","elev":213,"radios":[{"frequency":115.2,"channel":"99X"}],"params":{"range":100,"declination":-0.38167,"alignedtotruenorth":false}}},{"type":"Feature","geometry":{"type":"Point","coordinates":[1.3752777777778,48.055833333333]},"properties":{"guid":"","aeronautical":"navaid","type":"TACAN","country":"FR","id":"CHN","elev":126,"radios":[{"frequency":null,"channel":"39X"}],"params":{"range":40,"declination":-0.22306,"alignedtotruenorth":false}}},{"type":"Feature","geometry":{"type":"Point","coordinates":[1.3869444444444,48.059166666667]},"properties":{"guid":"","aeronautical":"navaid","type":"VOR-DME","country":"FR","id":"CAD","elev":126,"radios":[{"frequency":115.95,"channel":"106Y"}],"params":{"range":80,"declination":-0.21992,"alignedtotruenorth":false}}},{"type":"Feature","geometry":{"type":"Point","coordinates":[1.3636111111111,48.063333333333]},"properties":{"guid":"","aeronautical":"navaid","type":"NDB","country":"FR","id":"CDN","elev":130,"radios":[{"frequency":359.5,"channel":""}],"params":{"range":50,"declination":-0.22934,"alignedtotruenorth":false}}},{"type":"Feature","geometry":{"type":"Point","coordinates":[1.8011111111111,46.936666666667]},"properties":{"guid":"","aeronautical":"navaid","type":"DME","country":"FR","id":"CTX","elev":165,"radios":[{"frequency":428,"channel":""}],"params":{"range":50,"declination":-0.01078,"alignedtotruenorth":false}}},{"type":"Feature","geometry":{"type":"Point","coordinates":[3.5777777777778,49.137777777778]},"properties":{"guid":"","aeronautical":"navaid","type":"VOR-DME","country":"FR","id":"CTL","elev":195,"radios":[{"frequency":117.6,"channel":"123X"}],"params":{"range":70,"declination":0.38442,"alignedtotruenorth":false}}},{"type":"Feature","geometry":{"type":"Point","coordinates":[3.1922222222222,45.7875]},"properties":{"guid":"","aeronautical":"navaid","type":"VOR-DME","country":"FR","id":"CFA","elev":321,"radios":[{"frequency":114.35,"channel":"90Y"}],"params":{"range":100,"declination":0.46249,"alignedtotruenorth":false}}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-0.31166666666667,45.659444444444]},"properties":{"guid":"","aeronautical":"navaid","type":"VOR-DME","country":"FR","id":"CNA","elev":25,"radios":[{"frequency":114.65,"channel":"93Y"}],"params":{"range":100,"declination":-0.55744,"alignedtotruenorth":false}}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-0.30611111111111,45.669444444444]},"properties":{"guid":"","aeronautical":"navaid","type":"NDB","country":"FR","id":"CGC","elev":33,"radios":[{"frequency":354,"channel":""}],"params":{"range":75,"declination":-0.5582,"alignedtotruenorth":false}}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-0.30777777777778,45.661388888889]},"properties":{"guid":"","aeronautical":"navaid","type":"TACAN","country":"FR","id":"CGC","elev":28,"radios":[{"frequency":null,"channel":"109X"}],"params":{"range":160,"declination":-0.55744,"alignedtotruenorth":false}}},{"type":"Feature","geometry":{"type":"Point","coordinates":[3.0138888888889,48.844722222222]},"properties":{"guid":"","aeronautical":"navaid","type":"VOR-DME","country":"FR","id":"CLM","elev":139,"radios":[{"frequency":112.9,"channel":"76X"}],"params":{"range":60,"declination":0.22945,"alignedtotruenorth":false}}},{"type":"Feature","geometry":{"type":"Point","coordinates":[0.31277777777778,49.310833333333]},"properties":{"guid":"","aeronautical":"navaid","type":"VOR","country":"FR","id":"DVL","elev":145,"radios":[{"frequency":110.2,"channel":""}],"params":{"range":60,"declination":-0.67814,"alignedtotruenorth":false}}},{"type":"Feature","geometry":{"type":"Point","coordinates":[1.1705555555556,49.925277777778]},"properties":{"guid":"","aeronautical":"navaid","type":"VOR","country":"FR","id":"DPE","elev":104,"radios":[{"frequency":115.8,"channel":""}],"params":{"range":40,"declination":-0.45175,"alignedtotruenorth":false}}},{"type":"Feature","geometry":{"type":"Point","coordinates":[6.1008333333333,43.991388888889]},"properties":{"guid":"","aeronautical":"navaid","type":"VOR","country":"FR","id":"DGN","elev":913,"radios":[{"frequency":113.85,"channel":""}],"params":{"range":90,"declination":1.28828,"alignedtotruenorth":false}}},{"type":"Feature","geometry":{"type":"Point","coordinates":[5.0916666666667,47.271944444444]},"properties":{"guid":"","aeronautical":"navaid","type":"TACAN","country":"FR","id":"DIJ","elev":216,"radios":[{"frequency":null,"channel":"82X"}],"params":{"range":60,"declination":0.93049,"alignedtotruenorth":false}}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-2.0822222222222,48.586111111111]},"properties":{"guid":"","aeronautical":"navaid","type":"VOR-DME","country":"FR","id":"DIN","elev":63,"radios":[{"frequency":114.3,"channel":"90X"}],"params":{"range":80,"declination":-2,"alignedtotruenorth":false}}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-2.0527777777778,48.481944444444]},"properties":{"guid":"","aeronautical":"navaid","type":"NDB","country":"FR","id":"DR","elev":62,"radios":[{"frequency":390,"channel":""}],"params":{"range":25,"declination":-2,"alignedtotruenorth":false}}},{"type":"Feature","geometry":{"type":"Point","coordinates":[1.6566666666667,48.625833333333]},"properties":{"guid":"","aeronautical":"navaid","type":"VOR-DME","country":"FR","id":"EPR","elev":158,"radios":[{"frequency":115.65,"channel":"103Y"}],"params":{"range":60,"declination":-0.17835,"alignedtotruenorth":false}}},{"type":"Feature","geometry":{"type":"Point","coordinates":[6.0594444444444,48.317777777778]},"properties":{"guid":"","aeronautical":"navaid","type":"VOR","country":"FR","id":"EPL","elev":343,"radios":[{"frequency":113,"channel":""}],"params":{"range":60,"declination":1.16441,"alignedtotruenorth":false}}},{"type":"Feature","geometry":{"type":"Point","coordinates":[1.2141666666667,49.028611111111]},"properties":{"guid":"","aeronautical":"navaid","type":"TACAN","country":"FR","id":"EVX","elev":136,"radios":[{"frequency":null,"channel":"71X"}],"params":{"range":null,"declination":-0.35649,"alignedtotruenorth":false}}},{"type":"Feature","geometry":{"type":"Point","coordinates":[1.2141666666667,49.028611111111]},"properties":{"guid":"","aeronautical":"navaid","type":"VORTAC","country":"FR","id":"EVX","elev":136,"radios":[{"frequency":112.4,"channel":"71X"}],"params":{"range":60,"declination":-0.35649,"alignedtotruenorth":false}}},{"type":"Feature","geometry":{"type":"Point","coordinates":[1.8241666666667,43.954166666667]},"properties":{"guid":"","aeronautical":"navaid","type":"VOR","country":"FR","id":"GAI","elev":295,"radios":[{"frequency":115.8,"channel":""}],"params":{"range":100,"declination":0.17109,"alignedtotruenorth":false}}},{"type":"Feature","geometry":{"type":"Point","coordinates":[6.7161111111111,48.986388888889]},"properties":{"guid":"","aeronautical":"navaid","type":"VOR-DME","country":"FR","id":"GTQ","elev":309,"radios":[{"frequency":111.25,"channel":"49Y"}],"params":{"range":60,"declination":1.33061,"alignedtotruenorth":false}}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-3.6025,48.16]},"properties":{"guid":"","aeronautical":"navaid","type":"NDB","country":"FR","id":"GSG","elev":227,"radios":[{"frequency":395,"channel":""}],"params":{"range":25,"declination":-3,"alignedtotruenorth":false}}},{"type":"Feature","geometry":{"type":"Point","coordinates":[6.7322222222222,47.561666666667]},"properties":{"guid":"","aeronautical":"navaid","type":"NDB","country":"FR","id":"HR","elev":399,"radios":[{"frequency":289,"channel":""}],"params":{"range":30,"declination":1.37482,"alignedtotruenorth":false}}},{"type":"Feature","geometry":{"type":"Point","coordinates":[4.94,43.500277777778]},"properties":{"guid":"","aeronautical":"navaid","type":"VORTAC","country":"FR","id":"ITS","elev":15,"radios":[{"frequency":112.7,"channel":"74X"}],"params":{"range":null,"declination":1,"alignedtotruenorth":false}}},{"type":"Feature","geometry":{"type":"Point","coordinates":[0.53027777777778,48.790555555556]},"properties":{"guid":"","aeronautical":"navaid","type":"VOR","country":"FR","id":"LGL","elev":290,"radios":[{"frequency":115,"channel":""}],"params":{"range":null,"declination":-2,"alignedtotruenorth":false}}},{"type":"Feature","geometry":{"type":"Point","coordinates":[2.1494444444444,46.691388888889]},"properties":{"guid":"","aeronautical":"navaid","type":"VOR","country":"FR","id":"LCA","elev":269,"radios":[{"frequency":112.1,"channel":""}],"params":{"range":null,"declination":0.3783,"alignedtotruenorth":false}}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-3.3077777777778,48.719166666667]},"properties":{"guid":"","aeronautical":"navaid","type":"NDB","country":"FR","id":"LN","elev":71,"radios":[{"frequency":345,"channel":""}],"params":{"range":50,"declination":-3,"alignedtotruenorth":false}}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-4.4322222222222,48.283611111111]},"properties":{"guid":"","aeronautical":"navaid","type":"DME","country":"FR","id":"BST","elev":76,"radios":[{"frequency":428,"channel":""}],"params":{"range":50,"declination":-3,"alignedtotruenorth":false}}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-1.2863888888889,46.689166666667]},"properties":{"guid":"","aeronautical":"navaid","type":"NDB","country":"FR","id":"YN","elev":93,"radios":[{"frequency":334,"channel":""}],"params":{"range":null,"declination":-1,"alignedtotruenorth":false}}},{"type":"Feature","geometry":{"type":"Point","coordinates":[5.43906,45.489]},"properties":{"guid":"","aeronautical":"navaid","type":"VOR-DME","country":"FR","id":"LTP","elev":641,"radios":[{"frequency":115.55,"channel":""}],"params":{"range":null,"declination":1.0302,"alignedtotruenorth":false}}},{"type":"Feature","geometry":{"type":"Point","coordinates":[6.2558333333333,43.382777777778]},"properties":{"guid":"","aeronautical":"navaid","type":"VOR-DME","country":"FR","id":"LUC","elev":303,"radios":[{"frequency":113,"channel":"77X"}],"params":{"range":null,"declination":1,"alignedtotruenorth":false}}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-0.018333333333333,43.466666666667]},"properties":{"guid":"","aeronautical":"navaid","type":"VOR","country":"FR","id":"LMB","elev":293,"radios":[{"frequency":111.8,"channel":""}],"params":{"range":null,"declination":-1,"alignedtotruenorth":false}}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-0.018333333333333,43.466666666667]},"properties":{"guid":"","aeronautical":"navaid","type":"VOR","country":"FR","id":"LEQ","elev":293,"radios":[{"frequency":109,"channel":"27X"}],"params":{"range":null,"declination":-0.06258,"alignedtotruenorth":false}}},{"type":"Feature","geometry":{"type":"Point","coordinates":[1.0255555555556,45.815833333333]},"properties":{"guid":"","aeronautical":"navaid","type":"VOR-DME","country":"FR","id":"LMG","elev":417,"radios":[{"frequency":114.5,"channel":"92X"}],"params":{"range":null,"declination":-1,"alignedtotruenorth":false}}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-3.4405555555556,47.763055555556]},"properties":{"guid":"","aeronautical":"navaid","type":"NDB","country":"FR","id":"LOR","elev":44,"radios":[{"frequency":359,"channel":""}],"params":{"range":50,"declination":-2,"alignedtotruenorth":false}}},{"type":"Feature","geometry":{"type":"Point","coordinates":[6.2955555555556,47.688333333333]},"properties":{"guid":"","aeronautical":"navaid","type":"VOR","country":"FR","id":"LUL","elev":316,"radios":[{"frequency":117.1,"channel":""}],"params":{"range":null,"declination":1,"alignedtotruenorth":false}}},{"type":"Feature","geometry":{"type":"Point","coordinates":[5.0905555555556,45.745555555556]},"properties":{"guid":"","aeronautical":"navaid","type":"VOR-DME","country":"FR","id":"LSE","elev":234,"radios":[{"frequency":114.75,"channel":"94Y"}],"params":{"range":null,"declination":1.22442,"alignedtotruenorth":false}}},{"type":"Feature","geometry":{"type":"Point","coordinates":[2.8133333333333,48.455833333333]},"properties":{"guid":"","aeronautical":"navaid","type":"VOR-DME","country":"FR","id":"MLN","elev":102,"radios":[{"frequency":113.6,"channel":"83X"}],"params":{"range":40,"declination":0.23263,"alignedtotruenorth":false}}},{"type":"Feature","geometry":{"type":"Point","coordinates":[5.39125,49.39125]},"properties":{"guid":"","aeronautical":"navaid","type":"VOR","country":"FR","id":"MMD","elev":190,"radios":[{"frequency":109.4,"channel":""}],"params":{"range":40,"declination":1.12985,"alignedtotruenorth":false}}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-3.7627777777778,48.646666666667]},"properties":{"guid":"","aeronautical":"navaid","type":"NDB","country":"FR","id":"MLX","elev":120,"radios":[{"frequency":371,"channel":""}],"params":{"range":25,"declination":-3,"alignedtotruenorth":false}}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-1.6877777777778,47.052777777778]},"properties":{"guid":"","aeronautical":"navaid","type":"NDB","country":"FR","id":"GL","elev":1,"radios":[{"frequency":369,"channel":""}],"params":{"range":25,"declination":-1,"alignedtotruenorth":false}}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-1.6127777777778,47.160833333333]},"properties":{"guid":"","aeronautical":"navaid","type":"VOR-DME","country":"FR","id":"NTS","elev":25,"radios":[{"frequency":115.5,"channel":"102X"}],"params":{"range":150,"declination":-1,"alignedtotruenorth":false}}},{"type":"Feature","geometry":{"type":"Point","coordinates":[2.2647222222222,48.155555555556]},"properties":{"guid":"","aeronautical":"navaid","type":"VOR","country":"FR","id":"PTV","elev":121,"radios":[{"frequency":116.5,"channel":""}],"params":{"range":100,"declination":0.08418,"alignedtotruenorth":false}}},{"type":"Feature","geometry":{"type":"Point","coordinates":[2.0458333333333,49.105555555556]},"properties":{"guid":"","aeronautical":"navaid","type":"VOR","country":"FR","id":"PON","elev":95,"radios":[{"frequency":111.6,"channel":""}],"params":{"range":null,"declination":0.135,"alignedtotruenorth":false}}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-4.1847222222222,47.957222222222]},"properties":{"guid":"","aeronautical":"navaid","type":"VOR-DME","country":"FR","id":"QPR","elev":84,"radios":[{"frequency":117.8,"channel":"125X"}],"params":{"range":150,"declination":-3,"alignedtotruenorth":false}}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-3.9983333333333,47.968055555556]},"properties":{"guid":"","aeronautical":"navaid","type":"NDB","country":"FR","id":"RQ","elev":101,"radios":[{"frequency":380,"channel":""}],"params":{"range":25,"declination":-3,"alignedtotruenorth":false}}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-3.9983333333333,47.968055555556]},"properties":{"guid":"","aeronautical":"navaid","type":"NDB","country":"FR","id":"RQ","elev":101,"radios":[{"frequency":380,"channel":""}],"params":{"range":25,"declination":-3,"alignedtotruenorth":false}}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-1.5844444444444,48.053055555556]},"properties":{"guid":"","aeronautical":"navaid","type":"NDB","country":"FR","id":"RS","elev":55,"radios":[{"frequency":349,"channel":""}],"params":{"range":25,"declination":-2,"alignedtotruenorth":false}}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-1.7416666666667,48.069166666667]},"properties":{"guid":"","aeronautical":"navaid","type":"VOR-DME","country":"FR","id":"REN","elev":30,"radios":[{"frequency":109.25,"channel":"29Y"}],"params":{"range":150,"declination":-2,"alignedtotruenorth":false}}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-2.7825,48.5675]},"properties":{"guid":"","aeronautical":"navaid","type":"NDB","country":"FR","id":"SB","elev":67,"radios":[{"frequency":353,"channel":""}],"params":{"range":35,"declination":-2,"alignedtotruenorth":false}}},{"type":"Feature","geometry":{"type":"Point","coordinates":[5.09058,45.7455]},"properties":{"guid":"","aeronautical":"navaid","type":"VOR-DME","country":"FR","id":"LSE","elev":234,"radios":[{"frequency":114.75,"channel":""}],"params":{"range":null,"declination":0.92899,"alignedtotruenorth":false}}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-2.0444444444444,47.333611111111]},"properties":{"guid":"","aeronautical":"navaid","type":"NDB","country":"FR","id":"MT","elev":2,"radios":[{"frequency":398,"channel":""}],"params":{"range":50,"declination":-1,"alignedtotruenorth":false}}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-2.6613888888889,47.769166666667]},"properties":{"guid":"","aeronautical":"navaid","type":"NDB","country":"FR","id":"VA","elev":75,"radios":[{"frequency":342,"channel":""}],"params":{"range":25,"declination":-1,"alignedtotruenorth":false}}}]} -------------------------------------------------------------------------------- /example_files/input/openaip_hotspot_france_fr.aip: -------------------------------------------------------------------------------- 1 | 2 | 3 | 26 | 27 | 28 | 29 | 30 | FR 31 | Beynes 32 | 33 | 43.968807501452 34 | 6.24768066413 35 | 1573 36 | 37 | 0.65 38 | IRREGULAR_INTERVAL 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | PARAGLIDER 47 | HANG_GLIDER 48 | GLIDER 49 | 50 | 51 | 52 | FR 53 | Carton 54 | 55 | 44.176535459337 56 | 6.46931399238 57 | 1932 58 | 59 | 0.65 60 | IRREGULAR_INTERVAL 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 180 70 | 225 71 | 270 72 | 315 73 | 74 | 75 | 76 | PARAGLIDER 77 | HANG_GLIDER 78 | GLIDER 79 | 80 | Sometimes necessary to check the whole ridge, but a very reliable thermal, altitude 2123m MSL ! 81 | 82 | 83 | FR 84 | Chapeau de Gendarme 85 | 86 | 44.338171403802 87 | 6.6610412598196 88 | 2535 89 | 90 | 0.65 91 | IRREGULAR_INTERVAL 92 | 93 | 94 | 95 | 96 | 97 | 98 | 0 99 | 180 100 | 225 101 | 270 102 | 315 103 | 104 | 105 | 106 | PARAGLIDER 107 | HANG_GLIDER 108 | GLIDER 109 | 110 | 111 | 112 | FR 113 | Cheval Blanc 114 | 115 | 44.119590976755 116 | 6.4214019776016 117 | 2239 118 | 119 | 0.65 120 | IRREGULAR_INTERVAL 121 | 122 | 123 | 124 | 125 | 126 | 127 | 128 | PARAGLIDER 129 | HANG_GLIDER 130 | GLIDER 131 | 132 | 133 | 134 | FR 135 | Coupe 136 | 137 | 44.026969991215 138 | 6.317031860418 139 | 1555 140 | 141 | 0.65 142 | IRREGULAR_INTERVAL 143 | 144 | 145 | 146 | 147 | 148 | 149 | 270 150 | 315 151 | 152 | 153 | 154 | HANG_GLIDER 155 | GLIDER 156 | 157 | 158 | 159 | FR 160 | Crête de Leman (Bleyeul) 161 | 162 | 44.193608006011 163 | 6.294372558659 164 | 1424 165 | 166 | 0.65 167 | IRREGULAR_INTERVAL 168 | 169 | 170 | 171 | 172 | 173 | 174 | 180 175 | 225 176 | 270 177 | 178 | 179 | 180 | PARAGLIDER 181 | HANG_GLIDER 182 | GLIDER 183 | 184 | Along the complete ridge of Crête de Leman strong thermals can be found. Outlanding field Marcoux is nearby. 185 | 186 | 187 | FR 188 | Crête de Serres 189 | 190 | 43.962506231452 191 | 6.5563278198822 192 | 1620 193 | 194 | 0.65 195 | IRREGULAR_INTERVAL 196 | 197 | 198 | 199 | 200 | 201 | 202 | 203 | PARAGLIDER 204 | HANG_GLIDER 205 | GLIDER 206 | 207 | 208 | 209 | FR 210 | Crête du Teillon 211 | 212 | 43.844512226672 213 | 6.6018180847691 214 | 1869 215 | 216 | 0.65 217 | IRREGULAR_INTERVAL 218 | 219 | 220 | 221 | 222 | 223 | 224 | 225 | PARAGLIDER 226 | HANG_GLIDER 227 | GLIDER 228 | 229 | 230 | 231 | FR 232 | Crêtes de Peyrolle 233 | 234 | 44.941673501189 235 | 6.643875122127 236 | 2609 237 | 238 | 0.65 239 | IRREGULAR_INTERVAL 240 | 241 | 242 | 243 | 244 | 245 | 246 | 180 247 | 225 248 | 270 249 | 315 250 | 251 | 252 | 253 | PARAGLIDER 254 | HANG_GLIDER 255 | GLIDER 256 | 257 | 258 | 259 | FR 260 | Dormillouse 261 | 262 | 44.40933876306 263 | 6.3836364746784 264 | 2410 265 | 266 | 0.65 267 | IRREGULAR_INTERVAL 268 | 269 | 270 | 271 | 272 | 273 | 274 | 275 | 180 276 | 225 277 | 270 278 | 279 | 280 | 281 | PARAGLIDER 282 | HANG_GLIDER 283 | GLIDER 284 | 285 | Use caution due to lot of traffic, especially paragliders from the nearby St.Vincent ! 286 | 287 | 288 | FR 289 | Grand Bérard 290 | 291 | 44.435084929 292 | 6.6540031433624 293 | 2746 294 | 295 | 0.65 296 | IRREGULAR_INTERVAL 297 | 298 | 299 | 300 | 301 | 302 | 303 | 135 304 | 180 305 | 225 306 | 270 307 | 308 | 309 | 310 | HANG_GLIDER 311 | GLIDER 312 | 313 | Very difficult in Mistral-situation due to lee-effect! 314 | 315 | 316 | FR 317 | Grand Cheval de Bois 318 | 319 | 44.290391738902 320 | 6.6375236511753 321 | 2762 322 | 323 | 0.65 324 | IRREGULAR_INTERVAL 325 | 326 | 327 | 328 | 329 | 330 | 331 | 332 | PARAGLIDER 333 | HANG_GLIDER 334 | GLIDER 335 | 336 | 337 | 338 | FR 339 | Gréolières 340 | 341 | 43.800957731115 342 | 6.9654769895465 343 | 1000 344 | 345 | 0.65 346 | NEARLY_CONSTANT 347 | 348 | 349 | 350 | 351 | 352 | 353 | 354 | 135 355 | 180 356 | 225 357 | 315 358 | 359 | 360 | 361 | PARAGLIDER 362 | 363 | Thermal activity in the morning, soaring+ thermal activity in the afternoon. 364 | 365 | 366 | FR 367 | Marcelly 368 | 369 | 46.128278914261 370 | 6.573230743225 371 | 1980 372 | 373 | 0.65 374 | IRREGULAR_INTERVAL 375 | 376 | 377 | 378 | 379 | 380 | 381 | 135 382 | 180 383 | 225 384 | 270 385 | 386 | 387 | 388 | HANG_GLIDER 389 | GLIDER 390 | 391 | 392 | 393 | FR 394 | Montdenier 395 | 396 | 43.898961999271 397 | 6.2524871826835 398 | 1667 399 | 400 | 0.65 401 | IRREGULAR_INTERVAL 402 | 403 | 404 | 405 | 406 | 407 | 408 | 409 | PARAGLIDER 410 | HANG_GLIDER 411 | GLIDER 412 | 413 | 414 | 415 | FR 416 | Mont Guillaume 417 | 418 | 44.587123276436 419 | 6.4323883057255 420 | 2478 421 | 422 | 0.65 423 | IRREGULAR_INTERVAL 424 | 425 | 426 | 427 | 428 | 429 | 430 | 180 431 | 225 432 | 270 433 | 315 434 | 435 | 436 | 437 | HANG_GLIDER 438 | GLIDER 439 | 440 | 441 | 442 | FR 443 | Morgon 444 | 445 | 44.486708771656 446 | 6.3991912776389 447 | 1961 448 | 449 | 0.65 450 | IRREGULAR_INTERVAL 451 | 452 | 453 | 454 | 455 | 456 | 457 | 458 | 180 459 | 225 460 | 270 461 | 462 | 463 | 464 | PARAGLIDER 465 | HANG_GLIDER 466 | GLIDER 467 | 468 | Important before crossing to Guillaume, altitude 2327m 469 | 470 | 471 | FR 472 | Mte. de la Grisonnière 473 | 474 | 44.250873528601 475 | 6.3981418610204 476 | 1978 477 | 478 | 0.65 479 | IRREGULAR_INTERVAL 480 | 481 | 482 | 483 | 484 | 485 | 486 | 225 487 | 270 488 | 315 489 | 490 | 491 | 492 | PARAGLIDER 493 | HANG_GLIDER 494 | GLIDER 495 | 496 | 497 | 498 | FR 499 | Pente de la chapelle (Challes) 500 | 501 | 45.550603171946 502 | 5.9966630934054 503 | 700 504 | 505 | 0.65 506 | NEARLY_CONSTANT 507 | 508 | 509 | 510 | 511 | 512 | 513 | 270 514 | 315 515 | 516 | 517 | 518 | GLIDER 519 | 520 | Used a lot by local gliding club. 521 | May sometime to be difficult to go above 1000m. 522 | 523 | 524 | FR 525 | Prachaval 526 | 527 | 44.695260824108 528 | 6.6625213620381 529 | 2176 530 | 531 | 0.65 532 | SCHEDULED_INTERVAL 533 | 534 | 535 | 536 | 537 | 538 | 539 | 180 540 | 225 541 | 270 542 | 315 543 | 544 | 545 | 546 | PARAGLIDER 547 | HANG_GLIDER 548 | GLIDER 549 | 550 | Be careful from morning to noon, often an inversion situation in 2200m 551 | 552 | 553 | FR 554 | Simmonet des Graux 555 | 556 | 44.217451984038 557 | 6.6616407547996 558 | 2335 559 | 560 | 0.65 561 | IRREGULAR_INTERVAL 562 | 563 | 564 | 565 | 566 | 567 | 568 | 569 | 570 | 135 571 | 180 572 | 225 573 | 270 574 | 575 | 576 | 577 | GLIDER 578 | 579 | Altitude 2552m 580 | 581 | 582 | FR 583 | Tête d'Amont 584 | 585 | 44.852053425665 586 | 6.5340118408785 587 | 2758 588 | 589 | 0.65 590 | IRREGULAR_INTERVAL 591 | 592 | 593 | 594 | 595 | 596 | 597 | 598 | PARAGLIDER 599 | HANG_GLIDER 600 | GLIDER 601 | 602 | 603 | 604 | FR 605 | Tête de Lucy 606 | 607 | 44.610408084882 608 | 6.3857822418845 609 | 2598 610 | 611 | 0.65 612 | IRREGULAR_INTERVAL 613 | 614 | 615 | 616 | 617 | 618 | 619 | 180 620 | 225 621 | 270 622 | 315 623 | 624 | 625 | 626 | HANG_GLIDER 627 | GLIDER 628 | 629 | 630 | 631 | FR 632 | Tête de Siguret 633 | 634 | 44.435697794794 635 | 6.7722778320776 636 | 2558 637 | 638 | 0.65 639 | IRREGULAR_INTERVAL 640 | 641 | 642 | 643 | 644 | 645 | 646 | 647 | 180 648 | 225 649 | 270 650 | 315 651 | 652 | 653 | 654 | PARAGLIDER 655 | HANG_GLIDER 656 | GLIDER 657 | 658 | One of the best thermals in the region, especially also working in the evening. Start at the round building in ca. 2500m MSL, sometimes difficult if lower 659 | 660 | 661 | FR 662 | Tête du Peyron 663 | 664 | 44.773506048914 665 | 6.6182975769598 666 | 2520 667 | 668 | 0.65 669 | SCHEDULED_INTERVAL 670 | 671 | 672 | 673 | 674 | 675 | 676 | 225 677 | 270 678 | 315 679 | 680 | 681 | 682 | PARAGLIDER 683 | HANG_GLIDER 684 | GLIDER 685 | 686 | Good reliable thermals 687 | 688 | 689 | FR 690 | Vachière 691 | 692 | 44.198660087436 693 | 6.4954107730056 694 | 1919 695 | 696 | 0.65 697 | IRREGULAR_INTERVAL 698 | 699 | 700 | 701 | 702 | 703 | 704 | 705 | 706 | 180 707 | 225 708 | 270 709 | 315 710 | 711 | 712 | 713 | PARAGLIDER 714 | HANG_GLIDER 715 | 716 | Mostly even better than Carton direct in the South 717 | 718 | 719 | -------------------------------------------------------------------------------- /example_files/input/openaip_navaid_france_fr.aip: -------------------------------------------------------------------------------- 1 | 2 | 3 | 26 | 27 | 28 | 29 | 30 | FR 31 | ABBEVILLE 32 | ABB 33 | 34 | 50.135277777778 35 | 1.8547222222222 36 | 68 37 | 38 | 39 | 108.45 40 | 21Y 41 | 42 | 43 | 60 44 | -0.31475 45 | FALSE 46 | 47 | 48 | 49 | FR 50 | AGEN-GAUDONVILLE 51 | AGN 52 | 53 | 43.887777777778 54 | 0.87277777777778 55 | 265 56 | 57 | 58 | 114.8 59 | 95X 60 | 61 | 62 | 100 63 | -0.12077 64 | FALSE 65 | 66 | 67 | 68 | FR 69 | AJACCIO-COTI CHIAVARI 70 | AJO 71 | 72 | 41.770555555556 73 | 8.7747222222222 74 | 628 75 | 76 | 77 | 114.8 78 | 95X 79 | 80 | 81 | 200 82 | 1.87235 83 | FALSE 84 | 85 | 86 | 87 | FR 88 | AMBERIEU 89 | AMU 90 | 91 | 45.988611111111 92 | 5.3313888888889 93 | 244 94 | 95 | 96 | 97 | 110X 98 | 99 | 100 | 120 101 | 1.01494 102 | FALSE 103 | 104 | 105 | 106 | FR 107 | AMBOISE 108 | AMB 109 | 110 | 47.428888888889 111 | 1.0644444444444 112 | 110 113 | 114 | 115 | 113.7 116 | 84X 117 | 118 | 119 | 80 120 | -0.30056 121 | FALSE 122 | 123 | 124 | 125 | FR 126 | AMBOISE 127 | AMB 128 | 129 | 47.418055555556 130 | 1.0411111111111 131 | 106 132 | 133 | 134 | 341 135 | 136 | 137 | 50 138 | -0.30598 139 | FALSE 140 | 141 | 142 | 143 | FR 144 | ANGERS 145 | ANG 146 | 147 | 47.536944444444 148 | -0.85194444444444 149 | 86 150 | 151 | 152 | 113 153 | 154 | 155 | 80 156 | -0.37491 157 | FALSE 158 | 159 | 160 | 161 | FR 162 | AVIGNON CAUMONT 163 | CM 164 | 165 | 43.908333333333 166 | 4.9052777777778 167 | 33 168 | 169 | 170 | 369 171 | 172 | 173 | 20 174 | 0.96633 175 | FALSE 176 | 177 | 178 | 179 | FR 180 | AVIGNON PUJAUT 181 | AVN 182 | 183 | 43.995277777778 184 | 4.7463888888889 185 | 44 186 | 187 | 188 | 114.6 189 | 93X 190 | 191 | 192 | 60 193 | 0.92323 194 | FALSE 195 | 196 | 197 | 198 | FR 199 | AVORD 200 | AVD 201 | 202 | 47.058055555556 203 | 2.6297222222222 204 | 169 205 | 206 | 207 | 208 | 43X 209 | 210 | 211 | 0.49525 212 | FALSE 213 | 214 | 215 | 216 | FR 217 | AVORD 218 | AVD 219 | 220 | 47.120555555556 221 | 2.7994444444444 222 | 207 223 | 224 | 225 | 288.500 226 | 227 | 228 | 20 229 | 0.5408 230 | FALSE 231 | 232 | 233 | 234 | FR 235 | BALE NORTH 236 | BN 237 | 238 | 47.6617 239 | 7.4791 240 | 252 241 | 242 | 243 | 353 244 | 245 | 246 | 1.89404 247 | FALSE 248 | 249 | 250 | 251 | FR 252 | BALE SOUTH 253 | BS 254 | 255 | 47.5797 256 | 7.5363 257 | 268 258 | 259 | 260 | 376 261 | 262 | 263 | 264 | FALSE 265 | 266 | 267 | 268 | FR 269 | BASLE/MULHOUSE 270 | BLM 271 | 272 | 47.632777777778 273 | 7.4994444444444 274 | 256 275 | 276 | 277 | 117.45 278 | 279 | 280 | 60 281 | 1.40285 282 | FALSE 283 | 284 | 285 | 286 | FR 287 | BASTIA PORETTA 288 | BTA 289 | 290 | 42.573611111111 291 | 9.4747222222222 292 | 2 293 | 294 | 295 | 114.15 296 | 88Y 297 | 298 | 299 | 80 300 | 2.05495 301 | FALSE 302 | 303 | 304 | 305 | FR 306 | BIARRITZ BAYONNE ANGLET 307 | BTZ 308 | 309 | 43.466666666667 310 | -1.5102777777778 311 | 70 312 | 313 | 314 | 114.15 315 | 88Y 316 | 317 | 318 | 60 319 | -0.76625 320 | FALSE 321 | 322 | 323 | 324 | FR 325 | BORDEAUX MERIGNAC 326 | BMC 327 | 328 | 44.826944444444 329 | -0.72111111111111 330 | 49 331 | 332 | 333 | 113.75 334 | 84Y 335 | 336 | 337 | 100 338 | -0.62189 339 | FALSE 340 | 341 | 342 | 343 | FR 344 | BOULOGNE SUR MER 345 | BNE 346 | 347 | 50.624722222222 348 | 1.9072222222222 349 | 168 350 | 351 | 352 | 113.8 353 | 354 | 355 | 70 356 | -0.27113 357 | FALSE 358 | 359 | 360 | 361 | FR 362 | BOURSONNE 363 | BSN 364 | 365 | 49.188333333333 366 | 3.0566666666667 367 | 146 368 | 369 | 370 | 114.85 371 | 95Y 372 | 373 | 374 | 60 375 | 0.2179 376 | FALSE 377 | 378 | 379 | 380 | FR 381 | BRAY SUR SEINE 382 | BRY 383 | 384 | 48.406944444444 385 | 3.2947222222222 386 | 78 387 | 388 | 389 | 114.1 390 | 88X 391 | 392 | 393 | 60 394 | 0.3416 395 | FALSE 396 | 397 | 398 | 399 | FR 400 | BREST BRETAGNE 401 | GU 402 | 403 | 48.4775 404 | -4.2855555555556 405 | 111 406 | 407 | 408 | 338 409 | 410 | 411 | 25 412 | -3 413 | FALSE 414 | 415 | 416 | 417 | FR 418 | BREST BRETAGNE 419 | BGP 420 | 421 | 48.444444444444 422 | -4.4163888888889 423 | 93 424 | 425 | 426 | 387 427 | 428 | 429 | 25 430 | -3 431 | FALSE 432 | 433 | 434 | 435 | FR 436 | CAEN CARPIQUET 437 | CAN 438 | 439 | 49.173333333333 440 | -0.45527777777778 441 | 74 442 | 443 | 444 | 114.45 445 | 446 | 447 | 80 448 | -0.92415 449 | FALSE 450 | 451 | 452 | 453 | FR 454 | CALVI SAINTE CATHERINE 455 | CV 456 | 457 | 42.576944444444 458 | 8.8066666666667 459 | 8 460 | 461 | 462 | 375 463 | 464 | 465 | 25 466 | 1.91392 467 | FALSE 468 | 469 | 470 | 471 | FR 472 | CAMBRAI EPINOY 473 | CMB 474 | 475 | 50.228055555556 476 | 3.1513888888889 477 | 67 478 | 479 | 480 | 112.6 481 | 73X 482 | 483 | 484 | 80 485 | 0.17028 486 | FALSE 487 | 488 | 489 | 490 | FR 491 | CANNES TANNERON 492 | CNM 493 | 494 | 43.560277777778 495 | 6.8708333333333 496 | 481 497 | 498 | 499 | 111.4 500 | 501 | 502 | 40 503 | 1.4767 504 | FALSE 505 | 506 | 507 | 508 | FR 509 | CHAMBERY 510 | CBY 511 | 512 | 45.88188 513 | 5.757306 514 | 1432 515 | 516 | 517 | 115.4 518 | 102Y 519 | 520 | 521 | 1.10301 522 | FALSE 523 | 524 | 525 | 526 | FR 527 | CHAMBERY AIX LES BAINS 528 | CH 529 | 530 | 45.592222222222 531 | 5.8836111111111 532 | 252 533 | 534 | 535 | 346 536 | 537 | 538 | 25 539 | 1.38149 540 | FALSE 541 | 542 | 543 | 544 | FR 545 | CHARTRES LA LOUPE 546 | CHW 547 | 548 | 48.48 549 | 0.98694444444444 550 | 213 551 | 552 | 553 | 115.2 554 | 99X 555 | 556 | 557 | 100 558 | -0.38167 559 | FALSE 560 | 561 | 562 | 563 | FR 564 | CHATEAUDUN 565 | CHN 566 | 567 | 48.055833333333 568 | 1.3752777777778 569 | 126 570 | 571 | 572 | 573 | 39X 574 | 575 | 576 | 40 577 | -0.22306 578 | FALSE 579 | 580 | 581 | 582 | FR 583 | CHATEAUDUN 584 | CAD 585 | 586 | 48.059166666667 587 | 1.3869444444444 588 | 126 589 | 590 | 591 | 115.95 592 | 106Y 593 | 594 | 595 | 80 596 | -0.21992 597 | FALSE 598 | 599 | 600 | 601 | FR 602 | CHATEAUDUN 603 | CDN 604 | 605 | 48.063333333333 606 | 1.3636111111111 607 | 130 608 | 609 | 610 | 359.5 611 | 612 | 613 | 50 614 | -0.22934 615 | FALSE 616 | 617 | 618 | 619 | FR 620 | CHATEAUROUX DEOLS 621 | CTX 622 | 623 | 46.936666666667 624 | 1.8011111111111 625 | 165 626 | 627 | 628 | 428 629 | 630 | 631 | 50 632 | -0.01078 633 | FALSE 634 | 635 | 636 | 637 | FR 638 | CHATILLON SUR MARNE 639 | CTL 640 | 641 | 49.137777777778 642 | 3.5777777777778 643 | 195 644 | 645 | 646 | 117.6 647 | 123X 648 | 649 | 650 | 70 651 | 0.38442 652 | FALSE 653 | 654 | 655 | 656 | FR 657 | CLERMONT FERRAND AUVERGNE 658 | CFA 659 | 660 | 45.7875 661 | 3.1922222222222 662 | 321 663 | 664 | 665 | 114.35 666 | 90Y 667 | 668 | 669 | 100 670 | 0.46249 671 | FALSE 672 | 673 | 674 | 675 | FR 676 | COGNAC CHATEAUBERNARD 677 | CNA 678 | 679 | 45.659444444444 680 | -0.31166666666667 681 | 25 682 | 683 | 684 | 114.65 685 | 93Y 686 | 687 | 688 | 100 689 | -0.55744 690 | FALSE 691 | 692 | 693 | 694 | FR 695 | COGNAC CHATEAUBERNARD 696 | CGC 697 | 698 | 45.669444444444 699 | -0.30611111111111 700 | 33 701 | 702 | 703 | 354 704 | 705 | 706 | 75 707 | -0.5582 708 | FALSE 709 | 710 | 711 | 712 | FR 713 | COGNAC CHATEAUBERNARD 714 | CGC 715 | 716 | 45.661388888889 717 | -0.30777777777778 718 | 28 719 | 720 | 721 | 722 | 109X 723 | 724 | 725 | 160 726 | -0.55744 727 | FALSE 728 | 729 | 730 | 731 | FR 732 | COULOMMIERS VOISINS 733 | CLM 734 | 735 | 48.844722222222 736 | 3.0138888888889 737 | 139 738 | 739 | 740 | 112.9 741 | 76X 742 | 743 | 744 | 60 745 | 0.22945 746 | FALSE 747 | 748 | 749 | 750 | FR 751 | DEAUVILLE NORMANDIE 752 | DVL 753 | 754 | 49.310833333333 755 | 0.31277777777778 756 | 145 757 | 758 | 759 | 110.2 760 | 761 | 762 | 60 763 | -0.67814 764 | FALSE 765 | 766 | 767 | 768 | FR 769 | DIEPPE 770 | DPE 771 | 772 | 49.925277777778 773 | 1.1705555555556 774 | 104 775 | 776 | 777 | 115.8 778 | 779 | 780 | 40 781 | -0.45175 782 | FALSE 783 | 784 | 785 | 786 | FR 787 | DIGNE 788 | DGN 789 | 790 | 43.991388888889 791 | 6.1008333333333 792 | 913 793 | 794 | 795 | 113.85 796 | 797 | 798 | 90 799 | 1.28828 800 | FALSE 801 | 802 | 803 | 804 | FR 805 | DIJON-LONGVIC 806 | DIJ 807 | 808 | 47.271944444444 809 | 5.0916666666667 810 | 216 811 | 812 | 813 | 814 | 82X 815 | 816 | 817 | 60 818 | 0.93049 819 | FALSE 820 | 821 | 822 | 823 | FR 824 | DINARD PLEURTUIT SAINT MALO 825 | DIN 826 | 827 | 48.586111111111 828 | -2.0822222222222 829 | 63 830 | 831 | 832 | 114.300 833 | 90X 834 | 835 | 836 | 80 837 | -2 838 | FALSE 839 | 840 | 841 | 842 | FR 843 | DINARD PLEURTUIT SAINT MALO 844 | DR 845 | 846 | 48.481944444444 847 | -2.0527777777778 848 | 62 849 | 850 | 851 | 390 852 | 853 | 854 | 25 855 | -2 856 | FALSE 857 | 858 | 859 | 860 | FR 861 | EPERNON 862 | EPR 863 | 864 | 48.625833333333 865 | 1.6566666666667 866 | 158 867 | 868 | 869 | 115.65 870 | 103Y 871 | 872 | 873 | 60 874 | -0.17835 875 | FALSE 876 | 877 | 878 | 879 | FR 880 | EPINAL MIRECOURT 881 | EPL 882 | 883 | 48.317777777778 884 | 6.0594444444444 885 | 343 886 | 887 | 888 | 113 889 | 890 | 891 | 60 892 | 1.16441 893 | FALSE 894 | 895 | 896 | 897 | FR 898 | EVREUX FAUVILLE 899 | EVX 900 | 901 | 49.028611111111 902 | 1.2141666666667 903 | 136 904 | 905 | 906 | 907 | 71X 908 | 909 | 910 | -0.35649 911 | FALSE 912 | 913 | 914 | 915 | FR 916 | EVREUX FAUVILLE 917 | EVX 918 | 919 | 49.028611111111 920 | 1.2141666666667 921 | 136 922 | 923 | 924 | 112.4 925 | 71X 926 | 927 | 928 | 60 929 | -0.35649 930 | FALSE 931 | 932 | 933 | 934 | FR 935 | GAILLAC-CASTELNAU DE MONTMIRAIL 936 | GAI 937 | 938 | 43.954166666667 939 | 1.8241666666667 940 | 295 941 | 942 | 943 | 115.8 944 | 945 | 946 | 100 947 | 0.17109 948 | FALSE 949 | 950 | 951 | 952 | FR 953 | GROSTENQUIN 954 | GTQ 955 | 956 | 48.986388888889 957 | 6.7161111111111 958 | 309 959 | 960 | 961 | 111.25 962 | 49Y 963 | 964 | 965 | 60 966 | 1.33061 967 | FALSE 968 | 969 | 970 | 971 | FR 972 | GUISCRIFF SCAER 973 | GSG 974 | 975 | 48.16 976 | -3.6025 977 | 227 978 | 979 | 980 | 395 981 | 982 | 983 | 25 984 | -3 985 | FALSE 986 | 987 | 988 | 989 | FR 990 | HERICOURT 991 | HR 992 | 993 | 47.561666666667 994 | 6.7322222222222 995 | 399 996 | 997 | 998 | 289 999 | 1000 | 1001 | 30 1002 | 1.37482 1003 | FALSE 1004 | 1005 | 1006 | 1007 | FR 1008 | ISTRES LE TUBE 1009 | ITS 1010 | 1011 | 43.500277777778 1012 | 4.94 1013 | 15 1014 | 1015 | 1016 | 112.700 1017 | 74X 1018 | 1019 | 1020 | 1 1021 | FALSE 1022 | 1023 | 1024 | 1025 | FR 1026 | L'AIGLE 1027 | LGL 1028 | 1029 | 48.790555555556 1030 | 0.53027777777778 1031 | 290 1032 | 1033 | 1034 | 115.000 1035 | 1036 | 1037 | -2 1038 | FALSE 1039 | 1040 | 1041 | 1042 | FR 1043 | LA CHATRE 1044 | LCA 1045 | 1046 | 46.691388888889 1047 | 2.1494444444444 1048 | 269 1049 | 1050 | 1051 | 112.1 1052 | 1053 | 1054 | 0.3783 1055 | FALSE 1056 | 1057 | 1058 | 1059 | FR 1060 | LANNION 1061 | LN 1062 | 1063 | 48.719166666667 1064 | -3.3077777777778 1065 | 71 1066 | 1067 | 1068 | 345 1069 | 1070 | 1071 | 50 1072 | -3 1073 | FALSE 1074 | 1075 | 1076 | 1077 | FR 1078 | LANVEOC POULMIC 1079 | BST 1080 | 1081 | 48.283611111111 1082 | -4.4322222222222 1083 | 76 1084 | 1085 | 1086 | 428 1087 | 1088 | 1089 | 50 1090 | -3 1091 | FALSE 1092 | 1093 | 1094 | 1095 | FR 1096 | LA ROCHE SUR YON LES AJONCS 1097 | YN 1098 | 1099 | 46.689166666667 1100 | -1.2863888888889 1101 | 93 1102 | 1103 | 1104 | 334 1105 | 1106 | 1107 | -1 1108 | FALSE 1109 | 1110 | 1111 | 1112 | FR 1113 | LA TOUR DU PIN 1114 | LTP 1115 | 1116 | 45.48900 1117 | 5.439060 1118 | 641 1119 | 1120 | 1121 | 115.55 1122 | 1123 | 1124 | 1.0302 1125 | FALSE 1126 | 1127 | 1128 | 1129 | FR 1130 | LE LUC LE CANNET 1131 | LUC 1132 | 1133 | 43.382777777778 1134 | 6.2558333333333 1135 | 303 1136 | 1137 | 1138 | 113.0 1139 | 77X 1140 | 1141 | 1142 | 1 1143 | FALSE 1144 | 1145 | 1146 | 1147 | FR 1148 | LEMBEYE 1149 | LMB 1150 | 1151 | 43.466666666667 1152 | -0.018333333333333 1153 | 293 1154 | 1155 | 1156 | 111.8 1157 | 1158 | 1159 | -1 1160 | FALSE 1161 | 1162 | 1163 | 1164 | FR 1165 | LILLE LESQUIN 1166 | LEQ 1167 | 1168 | 43.466666666667 1169 | -0.018333333333333 1170 | 293 1171 | 1172 | 1173 | 109.0 1174 | 27X 1175 | 1176 | 1177 | -0.06258 1178 | FALSE 1179 | 1180 | 1181 | 1182 | FR 1183 | LIMOGES 1184 | LMG 1185 | 1186 | 45.815833333333 1187 | 1.0255555555556 1188 | 417 1189 | 1190 | 1191 | 114.5 1192 | 92X 1193 | 1194 | 1195 | -1 1196 | FALSE 1197 | 1198 | 1199 | 1200 | FR 1201 | LORIENT LANN BIHOUE 1202 | LOR 1203 | 1204 | 47.763055555556 1205 | -3.4405555555556 1206 | 44 1207 | 1208 | 1209 | 359 1210 | 1211 | 1212 | 50 1213 | -2 1214 | FALSE 1215 | 1216 | 1217 | 1218 | FR 1219 | LUXEUIL 1220 | LUL 1221 | 1222 | 47.688333333333 1223 | 6.2955555555556 1224 | 316 1225 | 1226 | 1227 | 117.1 1228 | 1229 | 1230 | 1 1231 | FALSE 1232 | 1233 | 1234 | 1235 | FR 1236 | LYON SAINT EXUPERY 1237 | LSE 1238 | 1239 | 45.745555555556 1240 | 5.0905555555556 1241 | 234 1242 | 1243 | 1244 | 114.75 1245 | 94Y 1246 | 1247 | 1248 | 1.22442 1249 | FALSE 1250 | 1251 | 1252 | 1253 | FR 1254 | MELUN 1255 | MLN 1256 | 1257 | 48.455833333333 1258 | 2.8133333333333 1259 | 102 1260 | 1261 | 1262 | 113.6 1263 | 83X 1264 | 1265 | 1266 | 40 1267 | 0.23263 1268 | FALSE 1269 | 1270 | 1271 | 1272 | FR 1273 | MONTMEDY-DUN SUR MEUSE 1274 | MMD 1275 | 1276 | 49.39125 1277 | 5.39125 1278 | 190 1279 | 1280 | 1281 | 109.4 1282 | 1283 | 1284 | 40 1285 | 1.12985 1286 | FALSE 1287 | 1288 | 1289 | 1290 | FR 1291 | MORLAIX PLOUJEAN 1292 | MLX 1293 | 1294 | 48.646666666667 1295 | -3.7627777777778 1296 | 120 1297 | 1298 | 1299 | 371 1300 | 1301 | 1302 | 25 1303 | -3 1304 | FALSE 1305 | 1306 | 1307 | 1308 | FR 1309 | NANTES ATLANTIQUE 1310 | GL 1311 | 1312 | 47.052777777778 1313 | -1.6877777777778 1314 | 1 1315 | 1316 | 1317 | 369 1318 | 1319 | 1320 | 25 1321 | -1 1322 | FALSE 1323 | 1324 | 1325 | 1326 | FR 1327 | NANTES ATLANTIQUE 1328 | NTS 1329 | 1330 | 47.160833333333 1331 | -1.6127777777778 1332 | 25 1333 | 1334 | 1335 | 115.500 1336 | 102X 1337 | 1338 | 1339 | 150 1340 | -1 1341 | FALSE 1342 | 1343 | 1344 | 1345 | FR 1346 | PITHIVIERS 1347 | PTV 1348 | 1349 | 48.155555555556 1350 | 2.2647222222222 1351 | 121 1352 | 1353 | 1354 | 116.5 1355 | 1356 | 1357 | 100 1358 | 0.08418 1359 | FALSE 1360 | 1361 | 1362 | 1363 | FR 1364 | PONTOISE 1365 | PON 1366 | 1367 | 49.105555555556 1368 | 2.0458333333333 1369 | 95 1370 | 1371 | 1372 | 111.6 1373 | 1374 | 1375 | 0.135 1376 | FALSE 1377 | 1378 | 1379 | 1380 | FR 1381 | QUIMPER PLUGUFFAN 1382 | QPR 1383 | 1384 | 47.957222222222 1385 | -4.1847222222222 1386 | 84 1387 | 1388 | 1389 | 117.800 1390 | 125X 1391 | 1392 | 1393 | 150 1394 | -3 1395 | FALSE 1396 | 1397 | 1398 | 1399 | FR 1400 | QUIMPER PLUGUFFAN 1401 | RQ 1402 | 1403 | 47.968055555556 1404 | -3.9983333333333 1405 | 101 1406 | 1407 | 1408 | 380 1409 | 1410 | 1411 | 25 1412 | -3 1413 | FALSE 1414 | 1415 | 1416 | 1417 | FR 1418 | QUIMPER PLUGUFFAN 1419 | RQ 1420 | 1421 | 47.968055555556 1422 | -3.9983333333333 1423 | 101 1424 | 1425 | 1426 | 380 1427 | 1428 | 1429 | 25 1430 | -3 1431 | FALSE 1432 | 1433 | 1434 | 1435 | FR 1436 | RENNES SAINT JACQUES 1437 | RS 1438 | 1439 | 48.053055555556 1440 | -1.5844444444444 1441 | 55 1442 | 1443 | 1444 | 349 1445 | 1446 | 1447 | 25 1448 | -2 1449 | FALSE 1450 | 1451 | 1452 | 1453 | FR 1454 | RENNES SAINT JACQUES 1455 | REN 1456 | 1457 | 48.069166666667 1458 | -1.7416666666667 1459 | 30 1460 | 1461 | 1462 | 109.250 1463 | 29Y 1464 | 1465 | 1466 | 150 1467 | -2 1468 | FALSE 1469 | 1470 | 1471 | 1472 | FR 1473 | SAINT BRIEUC ARMOR 1474 | SB 1475 | 1476 | 48.5675 1477 | -2.7825 1478 | 67 1479 | 1480 | 1481 | 353 1482 | 1483 | 1484 | 35 1485 | -2 1486 | FALSE 1487 | 1488 | 1489 | 1490 | FR 1491 | SAINT EXUPERY 1492 | LSE 1493 | 1494 | 45.74550 1495 | 5.090580 1496 | 234 1497 | 1498 | 1499 | 114.75 1500 | 1501 | 1502 | 0.92899 1503 | FALSE 1504 | 1505 | 1506 | 1507 | FR 1508 | SAINT NAZAIRE MONTOIR 1509 | MT 1510 | 1511 | 47.333611111111 1512 | -2.0444444444444 1513 | 2 1514 | 1515 | 1516 | 398 1517 | 1518 | 1519 | 50 1520 | -1 1521 | FALSE 1522 | 1523 | 1524 | 1525 | FR 1526 | VANNES MEUCON 1527 | VA 1528 | 1529 | 47.769166666667 1530 | -2.6613888888889 1531 | 75 1532 | 1533 | 1534 | 342 1535 | 1536 | 1537 | 25 1538 | -1 1539 | FALSE 1540 | 1541 | 1542 | 1543 | --------------------------------------------------------------------------------