-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathgns2osm.pl
446 lines (377 loc) · 21.4 KB
/
gns2osm.pl
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
=pod
gns2osm.pl
from https://wiki.openstreetmap.org/wiki/User:Ewmjc/GNS_2_OSM_Conversion_Script
Script to read a GNS Country file and convert it to a .osm file.
You can get individual country files or one big file for the whole world at
http://earth-info.nga.mil/gns/html/namefiles.htm
This is complete and working for the Philippines.
For other countries you will probably need to extend the &fdc2osm subroutine
which maps GNS 'DSG' Feature Designation Code to OSM tags.
You may also want to add regexp rules to code handling the ADM1 Feature Designation
Code to work out whether the place is a province, state, city or whatever.
(c) 2007 Michael Collinson - You may use this script for whatever purpose you like
without restriction and without payment of any fee or royalty.
=head1 GNS File Specification
=head2 Feature Classification:
Nine (9) major Geoname feature categories into which similar feature designations are grouped.
A = Administrative region type feature : states, provinces, big cities
P = Populated place type feature : towns, villages, ?hamlets
V = Vegetation type feature, e.g. a forest
L = Locality or area type feature
U = Undersea type feature
R = Streets, highways, roads, or railroad type feature
T = Hypsographic type feature : hill(s), mountain(s), island(s), valley, spur, headland ...
H = Hydrographic type feature
S = Spot type feature
=head2 Features Designation Codes
http://www.oziexplorer3.com/namesearch/fd_cross_ref.html
ADM1 first-order administrative division (for example, a state in the USA or a province)
ADM2 A subdivision of a first-order administrative division, such as a county in the United States
PPL P POPULATED PLACE
PPLA P CAPTIAL OF A FIRST-ORDER ADMINISTRATIVE DIVISION
PPLC P CAPTIAL OF A COUNTRY (PCLD, PCLF, PCLI, PCLS)
PPLL P POPULATED LOCALITY
PPLQ P ABANDONED POPULATED PLACE
PPLR P RELIGIOUS POPULATED PLACE
PPLS P POPULATED PLACES
PPLW P DESTROYED POPULATED PLACE
PPLX P SECTION OF POPULATED PLACE
Undersea Features Designation Codes and their Definitions
http://earth-info.nga.mil/gns/html/acuf/feature_designation_name.html
=head2 Name Type:
C = Conventional name
N = BGN Standard name
NS = BGN Standard name in non-Roman script
P = Provisional name
PS = Provisional name in non-Roman script
H = Historic name
HS = Historic name in non-Roman script
D = Not verified or daggered name
DS = Not verified name in non-Roman script
V = Variant or alternate name
VS = Variant name in non-Roman script
=head1 What the output should look like
<?xml version='1.0' encoding='UTF-8'?>
<osm version='0.5' generator='JOSM'>
<node id='-1' action='modify' visible='true' lat='0.5475095511261509' lon='166.9191543291018'>
<tag k='name' v='MyName' />
<tag k='is_in:country' v='Philippines' />
<tag k='place' v='village' />
</node>
</osm>
=cut
use strict;
# Configuration - start
my $gns_file = 'Countries_populatedplaces_p.txt';
my $osm_file = 'nga.osm';
#my $gns_repository = '/home/devel';
#my $gns_file = $gns_repository.'/Countries_populatedplaces_p.txt';
#my $osm_file = $gns_repository.'/countries.osm';
#my $fips_country_code = 'rp'; # This is used by the GNS file
#my $iso_country_code = 'ph'; # For unofficial is_in:country_code tag
#my $country_name= 'Philippines'; # For is_in:country tag
#$gns_file = $gns_repository.'/geonames_dd_dms_date_20071218.txt';
#$gns_file = $gns_repository.'/sw.txt';
#$fips_country_code = 'sw'; # This is used by the GNS file
#$iso_country_code = 'se'; # For unofficial is_in:country_code tag
#$country_name= 'Sweden';
# Configuration - end
#
# Do an initial read to find top level place names from ADM1 POIs
#
#my %adm1_names = (); # For resolving what top level province/city a POI is in
my $line;
#open( GNSFILE, '<'.$gns_file ) || die "Cannot open file $gns_file .. [$!]";
#while ($line = <GNSFILE>) {
#
# chomp $line;
#
# my (undef, undef, undef, undef, undef,undef,undef,undef,undef,
# undef, $feature_designation_code,
# undef,
# undef ,$adm1,$adm2,undef,undef,
# undef,$name_type,undef,
# undef,undef,undef,$full_name
# ) = split('\t',$line);
#
#
# if ($name_type =~ /V/i) {next;} # Just ignore Variant names
#
# if ($feature_designation_code =~ /^ADM1/i)
# {
# # Capture the xxx, we can use this to resolve what province / city at populated place is in.
# $adm1_names{$adm1} = $full_name;
#
# }
#
#}
#close(GNSFILE);
#
# Now read for real
#
open( OSM_FILE, '>'.$osm_file ) || die "Cannot open file $osm_file .. [$!]";
print OSM_FILE "<?xml version='1.0' encoding='UTF-8'?>\n";
print OSM_FILE "<osm version='0.6' generator='GNS_Converter'>\n";
my $counter = 0;
my $id = -2000000000;
open( TICKERS, '<'.$gns_file ) || die "Cannot open file $gns_file .. [$!]";
while ($line = <TICKERS>) {
chomp $line;
#print $line;
#my @fields = split('\t',$line);
# Field definitions: http://earth-info.nga.mil/gns/html/gis_countryfiles.htm
my (undef, undef, $uni, $lat, $lon,undef,undef,undef,undef,
$feature_classification, $feature_designation_code,
$populated_place_classification,
$primary_country_code,$adm1,$population,$elevation,
$secondary_country_code,$name_type,$lang_code,
$short_form_name,undef,undef,$full_name
) = split('\t',$line);
# unless ($primary_country_code =~ /rp/i) {next;}
#unless ($feature_classification =~ /H/i) {next;}
# unless ($feature_designation_code =~ /ADM2/i) {next;}
# unless ($lat > 14.0) {next;}
# if ($name_type =~ /V/i) {next;} # Just ignore Variant names
#unless ($secondary_country_code) {next;}
# If we have got here, this is a POI we want to write an OSM node for
$counter++;
#if ($counter > 50) {next;} # for testing
#
# Start generating the OSM tags for this POI
#
my %osm_tags = (); # OSM tags to include for this node.
if ($lang_code) {
$osm_tags{'name:'.$lang_code} = $full_name;
} else {
$osm_tags{'name'} = $full_name;
}
# $osm_tags{'source'} = 'GNS';
# $osm_tags{'gns_uni'} = $uni;
# $osm_tags{'gns_classification'} = $feature_designation_code;
# $osm_tags{'is_in:country'} = $country_name;
# $osm_tags{'is_in:country_code'} = $iso_country_code;
$osm_tags{'country_code_fips'} = $primary_country_code;
# Work out where it is
#if ($adm1 && $adm1_names{$adm1}) {
#
# # Look for province and city names
# if ($adm1_names{$adm1}=~ /^Province\s+?of\s+?(.*)/) {
# $osm_tags{'is_in:state'} = $adm1_names{$adm1};
# } elsif ($adm1_names{$adm1} =~ /\bcity\b/i) {
# $osm_tags{'is_in:city'} = $adm1_names{$adm1};
# } else {
# # Dunno
# $osm_tags{'is_in'} = $adm1_names{$adm1};
# }
# }
# if ($elevation) {$osm_tags{ele} = $elevation } # Elevation in meters.
# if ($population) {$osm_tags{population} = $population }
if ($populated_place_classification) {$osm_tags{gns_populated_place_classification} = $populated_place_classification }
# Create OSM tags depending on the GNS "Feature Classification Code", e.g. ADM1, CAVE ...
unless (fdc2osm($feature_classification, $feature_designation_code,\%osm_tags))
{
# Unmatched code found:
print ' fc='.$feature_classification.' fdc='.$feature_designation_code .
' nt='.$name_type.' adm1='.$adm1.' name='. $full_name."\n";
next;
}
# NOT nt='.$name_type.' '
# $adm2 not encountered
print OSM_FILE "<node id='".++$id."' action='modify' visible='true' lat='".$lat."' lon='".$lon."'>\n";
foreach my $key (keys %osm_tags) {
#"In case that the name contains a ' character,
#we use the " container for the tags
print OSM_FILE '<tag k="'.$key.'" v="'.$osm_tags{$key}.'" />'."\n";
}
print OSM_FILE "</node>\n";
}
print OSM_FILE "</osm>\n";
close(OSM_FILE);
exit;
=head2 fdc2osm
Maps GNS 'DSG' Feature Designation Code to OSM tags.
GNS 'DSG' Feature Designation Code is a two to five-character code used to identify
the type of Geoname feature a name is applied to.
IN: string - Feature Designation Code
ref to hash - OSM tags
OUT: void
=cut
sub fdc2osm {
my $feature_classification = shift;
my $fdc = shift;
my $osm_tags_ref = shift;
my $matched = 1;
if ($fdc =~ /^PCLI$/i ) {$$osm_tags_ref{'place'} = 'country' }
elsif ($fdc =~ /^ADM1/i)
{
# Look for province and city names
if ($$osm_tags_ref{'name'} =~ /^Province\s+?of\s+?(.*)/) {
$$osm_tags_ref{'name'} = $1;
$$osm_tags_ref{'place'} = 'state';
#print '--->'.$osm_tags{'name'}."\n";
} else {
# Assume it is a city
$$osm_tags_ref{'place'} = 'city';
}
next;
}
elsif ($fdc =~ /^ADM2$/i ) {$$osm_tags_ref{place} = 'town' } # ? valid 'municipality'
elsif ($fdc =~ /^PPLC$/i ) { } # Capital city, assume already tagged
elsif ($fdc =~ /^PPL$/i ) {$$osm_tags_ref{place} = 'village' } # Hmm, could be a town, village, or hamlet - not possible to distingish
elsif ($fdc =~ /^PPLX$/i ) {$$osm_tags_ref{place} = 'suburb' }
elsif ($fdc =~ /^PPLQ$/i ) {$$osm_tags_ref{place} = 'locality' } # Abandoned populated place
elsif ($fdc =~ /^LCTY$/i ) {$$osm_tags_ref{place} = 'locality' }
elsif ($fdc =~ /^AREA$/i ) {$$osm_tags_ref{place} = 'region' }
elsif ($fdc =~ /^RGN$/i ) {$$osm_tags_ref{place} = 'region' }
elsif ($fdc =~ /^RGNE$/i ) {$$osm_tags_ref{place} = 'region' }
elsif ($fdc =~ /^INDS$/i ) {$$osm_tags_ref{place} = 'suburb'; $$osm_tags_ref{landuse} = 'industrial';} # Industrial area
elsif ($fdc =~ /^PRK$/i ) {$$osm_tags_ref{place} = 'national_park' } # Not a Map Features tag
elsif ($fdc =~ /^PRT$/i ) {$$osm_tags_ref{place} = 'port' } # Not a Map Features tag
elsif ($fdc =~ /^NVB$/i ) {$$osm_tags_ref{place} = 'locality'; $$osm_tags_ref{landuse} = 'military';} # nAVAL Base
elsif ($fdc =~ /^RES$/i ) {$$osm_tags_ref{place} = 'locality'; } # Reserve
elsif ($fdc =~ /^RESA$/i ) {$$osm_tags_ref{place} = 'locality'; $$osm_tags_ref{landuse} = 'agriculture';} #
elsif ($fdc =~ /^RESF$/i ) {$$osm_tags_ref{natural} = 'wood' }
elsif ($fdc =~ /^TRB$/i ) {$$osm_tags_ref{place} = 'locality'; } # Tribal Area
elsif ($fdc =~ /^FRST$/i ) {$$osm_tags_ref{natural} = 'wood' }
elsif ($fdc =~ /^RR$/i ) {$$osm_tags_ref{railway} = 'rail' }
elsif ($fdc =~ /^RD$/i ) {$$osm_tags_ref{highway} = 'unclassified' }
# Geographic land features
elsif ($fdc =~ /^RK$/i ) {$$osm_tags_ref{place} = 'island' } # Rock
elsif ($fdc =~ /^RKS$/i ) {$$osm_tags_ref{place} = 'locality' } # Rock
elsif ($fdc =~ /^ATOL$/i ) {$$osm_tags_ref{place} = 'island' }
elsif ($fdc =~ /^ISL/i ) {$$osm_tags_ref{place} = 'island' }
elsif ($fdc =~ /^ISLS$/i ) {$$osm_tags_ref{place} = 'region' }
elsif ($fdc =~ /^MT$/i ) {$$osm_tags_ref{natural} = 'peak' }
elsif ($fdc =~ /^MTS$/i ) {$$osm_tags_ref{place} = 'region' }
elsif ($fdc =~ /^HLL$/i ) {$$osm_tags_ref{natural} = 'peak' }
elsif ($fdc =~ /^HLLS$/i ) {$$osm_tags_ref{place} = 'region' }
elsif ($fdc =~ /^PK$/i ) {$$osm_tags_ref{natural} = 'peak' }
elsif ($fdc =~ /^PKS$/i ) {$$osm_tags_ref{natural} = 'region' }
elsif ($fdc =~ /^VLC$/i ) {$$osm_tags_ref{natural} = 'volcano' }
elsif ($fdc =~ /^BCH$/i ) {$$osm_tags_ref{natural} = 'beach' }
elsif ($fdc =~ /^CLF$/i ) {$$osm_tags_ref{natural} = 'cliff' }
elsif ($fdc =~ /^PT$/i ) {$$osm_tags_ref{place} = 'locality' } # Headland
elsif ($fdc =~ /^CNYN$/i ) {$$osm_tags_ref{place} = 'locality' } # Canyon
elsif ($fdc =~ /^CAPE$/i ) {$$osm_tags_ref{place} = 'locality' } # Cape
elsif ($fdc =~ /^DLTA$/i ) {$$osm_tags_ref{place} = 'locality'; $$osm_tags_ref{natural} = 'delta'; $$osm_tags_ref{geomorphology} = 'delta' } # Delta
elsif ($fdc =~ /^DPR$/i ) {$$osm_tags_ref{place} = 'locality' } # Depression
elsif ($fdc =~ /^GRGE$/i ) {$$osm_tags_ref{place} = 'locality' } # Gorge
elsif ($fdc =~ /^PASS$/i ) {$$osm_tags_ref{place} = 'locality'; $$osm_tags_ref{mountain_pass} = 'yes'; } # Pass
elsif ($fdc =~ /^PEN$/i ) {$$osm_tags_ref{place} = 'region' } # Peninsula
elsif ($fdc =~ /^PLAT$/i ) {$$osm_tags_ref{place} = 'region' } # Plateau
elsif ($fdc =~ /^PLN$/i ) {$$osm_tags_ref{place} = 'region' } # Plain
elsif ($fdc =~ /^HDLD$/i ) {$$osm_tags_ref{place} = 'locality' } # Headland
elsif ($fdc =~ /^ISTH$/i ) {$$osm_tags_ref{place} = 'locality' } # Isthmus
elsif ($fdc =~ /^PT$/i ) {$$osm_tags_ref{place} = 'locality' } # Headland
elsif ($fdc =~ /^RDGE$/i ) {$$osm_tags_ref{place} = 'locality' } # Ridge
elsif ($fdc =~ /^VAL$/i ) {$$osm_tags_ref{place} = 'locality' } # Valley
elsif ($fdc =~ /^SDL$/i ) {$$osm_tags_ref{place} = 'locality' } # Saddle
elsif ($fdc =~ /^SPUR$/i ) {$$osm_tags_ref{natural} = 'peak' } # Spur
# Water
elsif ($fdc =~ /^SEA$/i ) {$$osm_tags_ref{place} = 'sea' } # Sea
elsif ($fdc =~ /^AIRS$/i ) {$$osm_tags_ref{place} = 'locality' } # Seaplane landing area
elsif ($fdc =~ /^GULF$/i ) {$$osm_tags_ref{place} = 'locality' } # Gulf
elsif ($fdc =~ /^STRT$/i ) {$$osm_tags_ref{place} = 'locality' } # Strait
elsif ($fdc =~ /^ANCH$/i ) {$$osm_tags_ref{place} = 'locality' } # Anchorage
elsif ($fdc =~ /^DCKB$/i ) {$$osm_tags_ref{place} = 'locality' } # Docking Basin
elsif ($fdc =~ /^NRWS$/i ) {$$osm_tags_ref{place} = 'locality' } # Narrows
elsif ($fdc =~ /^RDST$/i ) {$$osm_tags_ref{place} = 'locality' } # "Roadstead" marine
elsif ($fdc =~ /^RPDS$/i ) {$$osm_tags_ref{place} = 'locality' } # Rapids
elsif ($fdc =~ /^SD$/i ) {$$osm_tags_ref{place} = 'locality' } # Sound
elsif ($fdc =~ /^BNK$/i ) {$$osm_tags_ref{natural} = 'bank' } # Bank
elsif ($fdc =~ /^CHNM$/i ) {$$osm_tags_ref{place} = 'locality' } # Marine Channel
elsif ($fdc =~ /^HBR$/i ) {$$osm_tags_ref{place} = 'port' } # Harbour
elsif ($fdc =~ /^SHOL$/i ) {$$osm_tags_ref{natural} = 'shoal' } # Shoal
elsif ($fdc =~ /^BAY$/i ) {$$osm_tags_ref{natural} = 'bay' }
elsif ($fdc =~ /^COVE$/i ) {$$osm_tags_ref{natural} = 'bay' }
elsif ($fdc =~ /^INLT$/i ) {$$osm_tags_ref{natural} = 'bay' }
elsif ($fdc =~ /^RF/i ) {$$osm_tags_ref{natural} = 'reef' } # Reef - Not a Map Features tag
elsif ($fdc =~ /^LGN$/i ) {$$osm_tags_ref{natural} = 'water' } # Lagoon
elsif ($fdc =~ /^LK$/i ) {$$osm_tags_ref{natural} = 'water' } # Lake
elsif ($fdc =~ /^LKI$/i ) {$$osm_tags_ref{natural} = 'water' } # Intermittent Lake
elsif ($fdc =~ /^LKS$/i ) {$$osm_tags_ref{natural} = 'water' } # Lakes
elsif ($fdc =~ /^RSV$/i ) {$$osm_tags_ref{natural} = 'water' } # Reservoir
elsif ($fdc =~ /^PND/i ) {$$osm_tags_ref{natural} = 'water' } # Pond(s) - various types
elsif ($fdc =~ /^MRSH$/i ) {$$osm_tags_ref{natural} = 'marsh' } # Marsh
elsif ($fdc =~ /^BOG$/i ) {$$osm_tags_ref{natural} = 'marsh' } # Bog
elsif ($fdc =~ /^SWMP$/i ) {$$osm_tags_ref{natural} = 'marsh' } # Swamp
elsif ($fdc =~ /^CNL$/i ) {$$osm_tags_ref{waterway} = 'canal' } # Canal
elsif ($fdc =~ /^CNFL$/i ) {$$osm_tags_ref{waterway} = 'river' } # Confuence
elsif ($fdc =~ /^CRKT$/i ) {$$osm_tags_ref{waterway} = 'river' } # Tidal Creek(s)
elsif ($fdc =~ /^STM$/i ) {$$osm_tags_ref{waterway} = 'river' } # STM 'stream' appears to cover rivers and streams of all sizes
elsif ($fdc =~ /^STMD$/i ) {$$osm_tags_ref{waterway} = 'river' } # Distributary(s)
elsif ($fdc =~ /^STMI$/i ) {$$osm_tags_ref{waterway} = 'stream' } # INtermittent river/stream
elsif ($fdc =~ /^STMQ$/i ) {$$osm_tags_ref{waterway} = 'stream' } # Abandoned water course
elsif ($fdc =~ /^STMX$/i ) {$$osm_tags_ref{waterway} = 'river' } # Section of river/stream
elsif ($fdc =~ /^CHN$/i ) {$$osm_tags_ref{waterway} = 'stream' } # Channel (CHECK COULD BE SEA NOT LAND
elsif ($fdc =~ /^CHNL$/i ) {$$osm_tags_ref{waterway} = 'stream' } # Lake Channel
elsif ($fdc =~ /^STMM$/i ) {$$osm_tags_ref{waterway} = 'river' } # River/stream mouth
elsif ($fdc =~ /^SPNG$/i ) {$$osm_tags_ref{natural} = 'spring' } # Spring
elsif ($fdc =~ /^FLLS$/i ) {$$osm_tags_ref{natural} = 'waterfall' } # Waterfall(s)
# Spot Feature
elsif ($fdc =~ /^AGR/i ) {$$osm_tags_ref{landuse} = 'farm' } #
elsif ($fdc =~ /^AIRB$/i ) {$$osm_tags_ref{aeroway} = 'airfield'; $$osm_tags_ref{landuse} = 'military'; $$osm_tags_ref{military} = 'airfield';} #
elsif ($fdc =~ /^AIRF$/i ) {$$osm_tags_ref{aeroway} = 'airfield' } #
elsif ($fdc =~ /^AIRP$/i ) {$$osm_tags_ref{aeroway} = 'airfield' } #
elsif ($fdc =~ /^AIRH$/i ) {$$osm_tags_ref{aeroway} = 'helipad' } # # Heliport
elsif ($fdc =~ /^AIRQ$/i ) {$$osm_tags_ref{aeroway} = 'runway' } # # Abandoned
elsif ($fdc =~ /^AIRS$/i ) {$$osm_tags_ref{aeroway} = 'runway' } # # Seaplane
elsif ($fdc =~ /^CSTL$/i ) {$$osm_tags_ref{historic} = 'castle' }
elsif ($fdc =~ /^CAVE$/i ) {$$osm_tags_ref{natural} = 'cave_mouth' } #
elsif ($fdc =~ /^CH$/i ) {$$osm_tags_ref{amenity} = 'place_of_worship'; $$osm_tags_ref{religion} = 'christian' } # Church
elsif ($fdc =~ /^MSQE$/i ) {$$osm_tags_ref{amenity} = 'place_of_worship'; $$osm_tags_ref{religion} = 'islam' } # Mosque
elsif ($fdc =~ /^TMPL$/i ) {$$osm_tags_ref{amenity} = 'place_of_worship' } #
elsif ($fdc =~ /^BTYD$/i ) {$$osm_tags_ref{waterway} = 'boatyard' }
elsif ($fdc =~ /^CMP$/i ) {$$osm_tags_ref{place} = 'camp' } # (Non-leisure) Camp
elsif ($fdc =~ /^CMPMN$/i ) {$$osm_tags_ref{place} = 'camp' } # Mining Camp
elsif ($fdc =~ /^CMTY$/i ) {$$osm_tags_ref{amenity} = 'grave_yard' } #
elsif ($fdc =~ /^DAM$/i ) {$$osm_tags_ref{man_made} = 'dam' } # Dam
elsif ($fdc =~ /^HSE$/i ) {$$osm_tags_ref{building} = 'house' }
elsif ($fdc =~ /^LDNG$/i ) {$$osm_tags_ref{waterway} = 'landing' } #
elsif ($fdc =~ /^EST$/i ) {$$osm_tags_ref{landuse} = 'farm' } # Estate
elsif ($fdc =~ /^ESTR$/i ) {$$osm_tags_ref{landuse} = 'farm';$$osm_tags_ref{produce} = 'rubber' } # Estate
elsif ($fdc =~ /^ESTY$/i ) {
if ($feature_classification =~ /S/i) {
$$osm_tags_ref{landuse} = 'farm'; #Estate of some sort
} else {
$$osm_tags_ref{waterway} = 'river'; # Estuary
}
}
elsif ($fdc =~ /^RNCH$/i ) {$$osm_tags_ref{landuse} = 'farm' } # Ranch
elsif ($fdc =~ /^FRMT$/i ) {$$osm_tags_ref{landuse} = 'farm'; $$osm_tags_ref{building} = 'farm' }
elsif ($fdc =~ /^FRM/i ) {$$osm_tags_ref{landuse} = 'farm'; }
elsif ($fdc =~ /^FY$/i ) {$$osm_tags_ref{amenity} = 'ferry_terminal' } #
elsif ($fdc =~ /^BRKS$/i ) {$$osm_tags_ref{military} = 'barracks' } # Fort
elsif ($fdc =~ /^FT$/i ) {$$osm_tags_ref{landuse} = 'military' } # Fort
elsif ($fdc =~ /^INSM$/i ) {$$osm_tags_ref{landuse} = 'military' } # "Military installation"
elsif ($fdc =~ /^LTHSE$/i ) {$$osm_tags_ref{man_made} = 'lighthouse' } #
elsif ($fdc =~ /^BCN$/i ) {$$osm_tags_ref{man_made} = 'lighthouse' }
elsif ($fdc =~ /^MFG$/i ) {$$osm_tags_ref{man_made} = 'factory' } #
elsif ($fdc =~ /^ML$/i ) {$$osm_tags_ref{man_made} = 'factory' }
elsif ($fdc =~ /^MLSW$/i ) {$$osm_tags_ref{man_made} = 'factory' }
elsif ($fdc =~ /^MN$/i ) {$$osm_tags_ref{man_made} = 'mine' } #
elsif ($fdc =~ /^MNAU$/i ) {$$osm_tags_ref{man_made} = 'mine'; $$osm_tags_ref{mine_ore} = 'gold';} #
elsif ($fdc =~ /^MNC$/i ) {$$osm_tags_ref{man_made} = 'mine'; $$osm_tags_ref{mine_ore} = 'coal';}
elsif ($fdc =~ /^MNCR$/i ) {$$osm_tags_ref{man_made} = 'mine'; $$osm_tags_ref{mine_ore} = 'chrome';}
elsif ($fdc =~ /^MNCU$/i ) {$$osm_tags_ref{man_made} = 'mine'; $$osm_tags_ref{mine_ore} = 'copper';}
elsif ($fdc =~ /^MNFE$/i ) {$$osm_tags_ref{man_made} = 'mine'; $$osm_tags_ref{mine_ore} = 'iron';}
elsif ($fdc =~ /^PRN$/i ) {$$osm_tags_ref{amenity} = 'prison' } #
elsif ($fdc =~ /^PP$/i ) {$$osm_tags_ref{amenity} = 'police_station' } #
elsif ($fdc =~ /^RSTN$/i ) {$$osm_tags_ref{railway} = 'station' } #
elsif ($fdc =~ /^RSTP$/i ) {$$osm_tags_ref{railway} = 'halt' }
elsif ($fdc =~ /^RUIN$/i ) {$$osm_tags_ref{historic} = 'ruin' } #
elsif ($fdc =~ /^HSPL$/i ) {$$osm_tags_ref{amenity} = 'hospital' }
elsif ($fdc =~ /^SCH$/i ) {$$osm_tags_ref{amenity} = 'school' } #
elsif ($fdc =~ /^SCHA$/i ) {$$osm_tags_ref{amenity} = 'college' } #
elsif ($fdc =~ /^SCHC$/i ) {$$osm_tags_ref{amenity} = 'college' } #
elsif ($fdc =~ /^SCHM$/i ) {$$osm_tags_ref{amenity} = 'college'; $$osm_tags_ref{landuse} = 'military';$$osm_tags_ref{military} = 'school'} #
elsif ($fdc =~ /^PS$/i ) {$$osm_tags_ref{man_made} = 'power_station' } #
elsif ($fdc =~ /^STNR$/i ) {$$osm_tags_ref{man_made} = 'radio_station' } # Radio Station
elsif ($fdc =~ /^TRIG$/i ) {$$osm_tags_ref{man_made} = 'trig_point' } #
elsif ($fdc =~ /^WHRF$/i ) {$$osm_tags_ref{man_made} = 'wharf' } #
# Underwater
elsif ($fdc =~ /^RFU/i ) {$$osm_tags_ref{subsea} = 'reef' } # Not a Map Features tag
elsif ($fdc =~ /^PLTU$/i ) {$$osm_tags_ref{subsea} = 'plateau' } # Not a Map Features tag
else {$matched = 0;}
return $matched;
}