package com.opendoorlogistics.components.geocode.postcodes.builder;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.util.ArrayList;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import com.opendoorlogistics.api.geometry.LatLong;
import com.opendoorlogistics.core.geometry.operations.GridTransforms;
import com.opendoorlogistics.core.gis.postcodes.UKPostcodes;
import com.vividsolutions.jts.geom.Coordinate;
import com.vividsolutions.jts.geom.GeometryFactory;
import com.vividsolutions.jts.geom.Point;
public class CodePointOpen2GeonamesFormat {
public static void process(String sdir, String outfile) {
File file = new File(sdir);
// Output to this format
// country code : iso country code, 2 characters
// postal code : varchar(20)
// place name : varchar(180)
// admin name1 : 1. order subdivision (state) varchar(100)
// admin code1 : 1. order subdivision (state) varchar(20)
// admin name2 : 2. order subdivision (county/province) varchar(100)
// admin code2 : 2. order subdivision (county/province) varchar(20)
// admin name3 : 3. order subdivision (community) varchar(100)
// admin code3 : 3. order subdivision (community) varchar(20)
// latitude : estimated latitude (wgs84)
// longitude : estimated longitude (wgs84)
// accuracy : accuracy of lat/lng from 1=estimated to 6=centroid
try {
// 27700 is British national grid
GridTransforms coordConverter = new GridTransforms("27700");
FileWriter fw = new FileWriter(new File(outfile).getAbsoluteFile());
BufferedWriter bw = new BufferedWriter(fw);
for (File child : file.listFiles()) {
if (child.getName().toLowerCase().endsWith(".csv")) {
System.out.println("Reading " + child);
try (BufferedReader br = new BufferedReader(new FileReader(child))) {
String line;
while ((line = br.readLine()) != null) {
// process the line.
String[] tokens = line.split(",(?=([^\"]*\"[^\"]*\")*[^\"]*$)", -1);
if (tokens.length != 10) {
throw new RuntimeException("Invalid line " + line);
}
// Line is Postcode,Positional_quality_indicator,Eastings,Northings,Country_code,NHS_regional_HA_code,NHS_HA_code,Admin_county_code,Admin_district_code,Admin_ward_code
bw.write("GB\t"); // countrycode
String pc =tokens[0].replaceAll("\"", "");
Matcher ukUnit = UKPostcodes.unitWithWithoutSpaceGroupedForSpace.matcher(pc);
if(ukUnit.matches()){
pc = ukUnit.group(1) + " " + ukUnit.group(2);
}
bw.write(pc); // postal
// place name, admin name1, ..., admin code3
for(int i =1 ; i <=8 ; i++){
bw.write("\t");
}
double easting = Double.parseDouble(tokens[2]);
double northing = Double.parseDouble(tokens[3]);
Point point = (Point)coordConverter.gridToWGS84(new GeometryFactory().createPoint(new Coordinate(easting, northing)));
bw.write(point.getCoordinate().y + "\t");
bw.write(point.getCoordinate().x + "\t");
bw.write("6");
bw.write(System.lineSeparator());
}
}
}
}
bw.close();
} catch (Exception e) {
throw new RuntimeException(e);
}
}
}