From 56e0ce8ed36343091ebd9f31150ef5d02ef454c3 Mon Sep 17 00:00:00 2001 From: Mathieu Baudier Date: Wed, 28 Oct 2020 13:09:57 +0100 Subject: [PATCH] Introduce Geonames support. --- dep/org.argeo.suite.dep.ui.rap/pom.xml | 5 + .../org.argeo.support.geonames/.classpath | 7 ++ .../org.argeo.support.geonames/.gitignore | 2 + knowledge/org.argeo.support.geonames/.project | 28 +++++ .../META-INF/.gitignore | 1 + knowledge/org.argeo.support.geonames/bnd.bnd | 0 .../build.properties | 4 + knowledge/org.argeo.support.geonames/pom.xml | 22 ++++ .../argeo/support/geonames/GeonamesAdm.java | 113 ++++++++++++++++++ .../support/geonames/ImportGeonamesAdmin.java | 94 +++++++++++++++ knowledge/pom.xml | 1 + 11 files changed, 277 insertions(+) create mode 100644 knowledge/org.argeo.support.geonames/.classpath create mode 100644 knowledge/org.argeo.support.geonames/.gitignore create mode 100644 knowledge/org.argeo.support.geonames/.project create mode 100644 knowledge/org.argeo.support.geonames/META-INF/.gitignore create mode 100644 knowledge/org.argeo.support.geonames/bnd.bnd create mode 100644 knowledge/org.argeo.support.geonames/build.properties create mode 100644 knowledge/org.argeo.support.geonames/pom.xml create mode 100644 knowledge/org.argeo.support.geonames/src/org/argeo/support/geonames/GeonamesAdm.java create mode 100644 knowledge/org.argeo.support.geonames/src/org/argeo/support/geonames/ImportGeonamesAdmin.java diff --git a/dep/org.argeo.suite.dep.ui.rap/pom.xml b/dep/org.argeo.suite.dep.ui.rap/pom.xml index fa251f4..bcaa6a4 100644 --- a/dep/org.argeo.suite.dep.ui.rap/pom.xml +++ b/dep/org.argeo.suite.dep.ui.rap/pom.xml @@ -65,6 +65,11 @@ org.argeo.support.odk 2.1.16-SNAPSHOT + + org.argeo.suite + org.argeo.support.geonames + 2.1.16-SNAPSHOT + diff --git a/knowledge/org.argeo.support.geonames/.classpath b/knowledge/org.argeo.support.geonames/.classpath new file mode 100644 index 0000000..e801ebf --- /dev/null +++ b/knowledge/org.argeo.support.geonames/.classpath @@ -0,0 +1,7 @@ + + + + + + + diff --git a/knowledge/org.argeo.support.geonames/.gitignore b/knowledge/org.argeo.support.geonames/.gitignore new file mode 100644 index 0000000..09e3bc9 --- /dev/null +++ b/knowledge/org.argeo.support.geonames/.gitignore @@ -0,0 +1,2 @@ +/bin/ +/target/ diff --git a/knowledge/org.argeo.support.geonames/.project b/knowledge/org.argeo.support.geonames/.project new file mode 100644 index 0000000..3c8181f --- /dev/null +++ b/knowledge/org.argeo.support.geonames/.project @@ -0,0 +1,28 @@ + + + org.argeo.support.geonames + + + + + + org.eclipse.jdt.core.javabuilder + + + + + org.eclipse.pde.ManifestBuilder + + + + + org.eclipse.pde.SchemaBuilder + + + + + + org.eclipse.pde.PluginNature + org.eclipse.jdt.core.javanature + + diff --git a/knowledge/org.argeo.support.geonames/META-INF/.gitignore b/knowledge/org.argeo.support.geonames/META-INF/.gitignore new file mode 100644 index 0000000..4854a41 --- /dev/null +++ b/knowledge/org.argeo.support.geonames/META-INF/.gitignore @@ -0,0 +1 @@ +/MANIFEST.MF diff --git a/knowledge/org.argeo.support.geonames/bnd.bnd b/knowledge/org.argeo.support.geonames/bnd.bnd new file mode 100644 index 0000000..e69de29 diff --git a/knowledge/org.argeo.support.geonames/build.properties b/knowledge/org.argeo.support.geonames/build.properties new file mode 100644 index 0000000..34d2e4d --- /dev/null +++ b/knowledge/org.argeo.support.geonames/build.properties @@ -0,0 +1,4 @@ +source.. = src/ +output.. = bin/ +bin.includes = META-INF/,\ + . diff --git a/knowledge/org.argeo.support.geonames/pom.xml b/knowledge/org.argeo.support.geonames/pom.xml new file mode 100644 index 0000000..83244c2 --- /dev/null +++ b/knowledge/org.argeo.support.geonames/pom.xml @@ -0,0 +1,22 @@ + + + 4.0.0 + + org.argeo.suite + knowledge + 2.1.16-SNAPSHOT + .. + + org.argeo.support.geonames + Geonames support + jar + + + org.argeo.commons + org.argeo.cms + ${version.argeo-commons} + + + diff --git a/knowledge/org.argeo.support.geonames/src/org/argeo/support/geonames/GeonamesAdm.java b/knowledge/org.argeo.support.geonames/src/org/argeo/support/geonames/GeonamesAdm.java new file mode 100644 index 0000000..ff1de75 --- /dev/null +++ b/knowledge/org.argeo.support.geonames/src/org/argeo/support/geonames/GeonamesAdm.java @@ -0,0 +1,113 @@ +package org.argeo.support.geonames; + +import java.time.LocalDate; +import java.time.ZoneId; +import java.util.Arrays; +import java.util.List; + +/** A Geonames administrative subdivision. */ +public class GeonamesAdm { + private Long geonameId; + private String countryCode; + private String admLevel; + private Integer level; + private String name; + private String asciiName; + private List alternateNames; + private Double lat; + private Double lng; + private LocalDate lastUpdated; + private ZoneId timeZone; + + private List row; + + public GeonamesAdm() { + } + + /** Initialise from a row in the main Geonames table. */ + public GeonamesAdm(List row) { + geonameId = Long.parseLong(row.get(0)); + admLevel = row.get(7); + countryCode = row.get(8); + if (admLevel.startsWith("ADM") && !admLevel.endsWith("H")) { + level = Integer.parseInt(admLevel.substring(3)); + } else if (admLevel.equals("PCLI")) { + level = 0; + } + name = row.get(1); + asciiName = row.get(2); + alternateNames = Arrays.asList(row.get(3).split(",")); + lat = Double.parseDouble(row.get(4)); + lng = Double.parseDouble(row.get(5)); + lastUpdated = LocalDate.parse(row.get(18)); + timeZone = ZoneId.of(row.get(17)); + this.row = row; + } + + public Long getGeonameId() { + return geonameId; + } + + public Integer getLevel() { + return level; + } + + public String getName() { + return name; + } + + public String getAsciiName() { + return asciiName; + } + + public List getAlternateNames() { + return alternateNames; + } + + public Double getLat() { + return lat; + } + + public Double getLng() { + return lng; + } + + public String getCountryCode() { + return countryCode; + } + + public String getAdmLevel() { + return admLevel; + } + + public List getRow() { + return row; + } + + public LocalDate getLastUpdated() { + return lastUpdated; + } + + public ZoneId getTimeZone() { + return timeZone; + } + + @Override + public int hashCode() { + return geonameId.intValue(); + } + + @Override + public boolean equals(Object obj) { + if (!(obj instanceof GeonamesAdm)) + return false; + GeonamesAdm other = (GeonamesAdm) obj; + return geonameId.equals(other.geonameId); + } + + @Override + public String toString() { + return name + " (ADM" + level + " " + geonameId + ")"; + } + +} diff --git a/knowledge/org.argeo.support.geonames/src/org/argeo/support/geonames/ImportGeonamesAdmin.java b/knowledge/org.argeo.support.geonames/src/org/argeo/support/geonames/ImportGeonamesAdmin.java new file mode 100644 index 0000000..1801fef --- /dev/null +++ b/knowledge/org.argeo.support.geonames/src/org/argeo/support/geonames/ImportGeonamesAdmin.java @@ -0,0 +1,94 @@ +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); +// } + } + +} diff --git a/knowledge/pom.xml b/knowledge/pom.xml index 4a8c550..6316767 100644 --- a/knowledge/pom.xml +++ b/knowledge/pom.xml @@ -12,5 +12,6 @@ pom org.argeo.support.odk + org.argeo.support.geonames -- 2.30.2