package se.kodapan.osm.sweden.ext.se.posten.postnummer.local;
import org.apache.commons.lang3.StringEscapeUtils;
import org.apache.lucene.document.Document;
import org.apache.lucene.document.Field;
import org.apache.lucene.document.FieldType;
import java.util.*;
/**
* @author kalle
* @since 2013-09-04 10:45 PM
*/
public class Geocoder {
public static void main(String[] args) throws Exception {
Root root = new Root();
Postort postort = new Postort();
postort.setIdentity("LUND");
Postnummer postnummer = new Postnummer();
postnummer.setIdentity("22224");
postnummer.setPostort(postort);
postort.getPostnummer().add(postnummer);
PostnummerSegment segment = new PostnummerSegment();
segment.setPostnummer(postnummer);
segment.setGatunamn("Stora fiskaregatan");
segment.setStarthusnummer(1);
segment.setSluthusnummer(10);
postnummer.getSegmentsByName().add(segment);
postort.getSegmentsByName().add(segment);
root.getSegmentsByName().add(segment);
Geocoder geocoder = new Geocoder(root);
geocoder.constructIndex();
// geocoder.geocode("Stora fiskaregatan 8, 22224, Lund");
}
private Root localPosten;
public Geocoder(Root localPosten) {
this.localPosten = localPosten;
textType = new FieldType();
textType.setIndexed(true);
textType.freeze();
jsonType = new FieldType();
jsonType.setIndexed(false);
jsonType.setStored(true);
jsonType.freeze();
}
public class Response {
}
private FieldType textType;
private FieldType jsonType;
public void constructIndex() throws Exception {
List<PostnummerSegment> segments = new ArrayList<PostnummerSegment>(100000);
for (Set<PostnummerSegment> postnummerSegments : localPosten.getSegmentsByName().getMap().values()) {
for (PostnummerSegment segment : postnummerSegments) {
segments.add(segment);
}
}
Collections.sort(segments, new Comparator<PostnummerSegment>() {
@Override
public int compare(PostnummerSegment o1, PostnummerSegment o2) {
int ret = o1.getPostnummer().getIdentity().compareTo(o2.getPostnummer().getIdentity());
if (ret == 0) {
ret = o1.getGatunamn().compareTo(o2.getGatunamn());
if (ret == 0) {
ret = o1.getStarthusnummer() - o2.getStarthusnummer();
}
}
return ret;
}
});
System.currentTimeMillis();
PostnummerSegment previousSegment = null;
List<PostnummerSegment> streetNameSegments = new ArrayList<PostnummerSegment>();
for (PostnummerSegment segment : segments) {
if (previousSegment == null || segment.getGatunamn().equals(previousSegment.getGatunamn())) {
streetNameSegments.add(segment);
} else {
// todo get coordinate of each house number
for (PostnummerSegment streetNameSegment : streetNameSegments) {
for (int houseNumber = streetNameSegment.getStarthusnummer(); houseNumber < streetNameSegment.getSluthusnummer(); houseNumber++) {
// is this exact house number registered in osm?
StringBuilder text = new StringBuilder();
text.append(streetNameSegment.getGatunamn()).append(" ");
text.append(String.valueOf(houseNumber)).append(", ");
text.append(streetNameSegment.getPostnummer().getIdentity()).append(", ");
text.append(streetNameSegment.getPostnummer().getPostort().getDisplayName());
StringBuilder json = new StringBuilder();
json.append("{");
json.append("streetName\":\"").append(StringEscapeUtils.escapeEcmaScript(streetNameSegment.getGatunamn())).append("\",");
json.append("houseNumber\":").append(String.valueOf(houseNumber)).append(",");
json.append("postnummer\":").append(segment.getPostnummer().getIdentity()).append(",");
json.append("postort\":").append(StringEscapeUtils.escapeEcmaScript(segment.getPostnummer().getPostort().getDisplayName())).append(",");
json.append("latitude\":").append("").append(",");
json.append("longitude\":").append("").append(",");
json.append("precision\":\"").append("").append("\"");
json.append("}");
Document document = new Document();
document.add(new Field("text", text.toString(), textType));
document.add(new Field("json", json.toString(), jsonType));
System.currentTimeMillis();
}
System.currentTimeMillis();
}
streetNameSegments.clear();
}
previousSegment = segment;
}
}
}