Sweden/Postnummer
< Sweden
Det finns inga postnummerpolygner i OSM, men Posten tillhandahåller en tjänst man kan ställa frågor mot. Med den och koordinater från OSM kan man det kan man estimera fram polygonerna.
var koordinaterPerPostort = (new Map<Postort, LanLon>) OverpassAPI.query("[k=ref:se:pts:postort]"); // <http://wiki.openstreetmap.org/wiki/Overpass_API> var postortspolygoner = (Map<Postort, Polygon>)new Voronoi(koordinaterPerPostort).createClusters();
// Sedan letar jag upp alla kända punkter inom varje postnummer: // var koordinaterPerPostnummer = new Map<Postnummer, LatLon>(); // for (var state in new [1,2]) { for (var postort, polygon in postortspolygoner) for (var gata in postort.gator) // Gatunamn är inte unika per postort, // därför söker jag bara bland de som bara sträcker sig inom ett postnummer. if (gata.postnummer.length() == 1) { // En punkt för postnummer varje 50m av gatan. for (var way in postort.findLimitPolygon(polygon, "[name=" + gata.namn+"]")) for (var node in interpolateLine(50, way.nodes)) koordinaterPerPostummer.get(gata.postnummer).add(node.koordinat); // En punkt för postnummer på exakta husnummer längst gatan. for (var node in postort.findLimitPolygon(polygon, "[addr:street=" + gata.namn+" && addr:housenumber=*]")) koordinaterPerPostummer.get(gata.postnummer).add(node.koordinat); } } // Postnummer blir ofta 5-6 polygoner, // dessutom finns ofta andra postnummer inbakade i en polygon som skall exkluderas. // var polygonPerPostnummer = (Map<Postnummer, Collection<Polygon>>)new Voronoi(koordinaterPerPostnummer).createClusters();
Man vill köra flera iterationer.
Första gången kör man med gatunamn som är unika för ett postnummer för hela landet. Skapa ny postortspolygon från alla postnummerpolygoner i postorten.
Andra gången kör man med gatunamn som är unikt för ett postnummer för den postorten. Skapa ny postortspolygon från postnummergränserna. Upprepa andra iterationens momentet tills du är nöjd.
Lämpliga Java-API finns här:
- <https://github.com/karlwettin/osm-common/>Overpass, Nominatim, etc.
- <https://github.com/karlwettin/osm-sweden/> Posten, etc.
- <http://www.vividsolutions.com/jts/JTSHome.htm> Voronoi, etc.