package org.argeo.support.geonames; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.nio.charset.StandardCharsets; import java.nio.file.Files; import java.nio.file.Paths; import java.util.HashMap; import java.util.List; import java.util.Map; import org.argeo.util.CsvParser; import org.argeo.util.CsvWriter; /** Import GeoNames administrative division from the main table. */ public class ImportGeonamesAdmin { // private Log log = LogFactory.getLog(ImportGeonamesAdmin.class); private Map geonamesAdms = new HashMap<>(); /** Loads the data. */ public void parse(InputStream in) { Map countryGeonameIds = new HashMap<>(); Map admin1GeonameIds = new HashMap<>(); CsvParser csvParser = new CsvParser() { @Override protected void processLine(Integer lineNumber, List header, List tokens) { if (!"A".equals(tokens.get(6))) return; GeonamesAdm geonamesAdm = new GeonamesAdm(tokens); geonamesAdms.put(geonamesAdm.getGeonameId(), geonamesAdm); if (geonamesAdm.getAdmLevel().equals("PCLI")) countryGeonameIds.put(geonamesAdm.getCountryCode(), geonamesAdm.getGeonameId()); if (geonamesAdm.getAdmLevel().equals("ADM1")) admin1GeonameIds.put(geonamesAdm.getAdminCode1(), geonamesAdm.getGeonameId()); } }; csvParser.setSeparator('\t'); csvParser.setNoHeader(true); csvParser.parse(in, StandardCharsets.UTF_8); // fill upper levels for (GeonamesAdm adm : geonamesAdms.values()) { adm.getUpperLevelIds()[0] = countryGeonameIds.get(adm.getCountryCode()); if (adm.getLevel() > 0) adm.getUpperLevelIds()[1] = admin1GeonameIds.get(adm.getAdminCode1()); adm.mapUpperLevels(geonamesAdms); } } public Map getGeonamesAdms() { return geonamesAdms; } /** * Copies only the Geonames of feature class 'A' (administrative subdivisions). */ public static void filterGeonamesAdm(InputStream in, OutputStream out) { CsvWriter csvWriter = new CsvWriter(out, StandardCharsets.UTF_8); csvWriter.setSeparator('\t'); CsvParser csvParser = new CsvParser() { @Override protected void processLine(Integer lineNumber, List header, List tokens) { if (tokens.size() < 7 || !"A".equals(tokens.get(6))) return; csvWriter.writeLine(tokens); } }; csvParser.setSeparator('\t'); csvParser.setNoHeader(true); csvParser.parse(in, StandardCharsets.UTF_8); } public static void main(String[] args) throws IOException { // String country = "allCountries"; String country = "CI"; // try (InputStream in = Files // .newInputStream(Paths.get(System.getProperty("user.home") + "/gis/data/geonames/" + country + ".txt")); // OutputStream out = Files.newOutputStream( // Paths.get(System.getProperty("user.home") + "/gis/data/geonames/" + country + "-adm.txt"))) { // ImportGeonamesAdmin.filterGeonamesAdm(in, out); // } try (InputStream in = Files.newInputStream( Paths.get(System.getProperty("user.home") + "/gis/data/geonames/" + country + "-adm.txt"))) { ImportGeonamesAdmin importGeonamesAdmin = new ImportGeonamesAdmin(); importGeonamesAdmin.parse(in); } } }