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) { 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); // String featureName = tokens.get(7); // String geonameId = tokens.get(0); // String name = tokens.get(1); // Double lat = Double.parseDouble(tokens.get(4)); // Double lng = Double.parseDouble(tokens.get(5)); // switch (featureName) { // case "ADM1": // case "ADM4": // String adminCode1 = tokens.get(10); // System.out.println( // geonameId + " " + featureName + " " + lat + "," + lng + " " + adminCode1 + " " + name); // break; // default: // break; // } } }; csvParser.setSeparator('\t'); csvParser.setNoHeader(true); csvParser.parse(in, StandardCharsets.UTF_8); } 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); // } } }