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; } } }