Sweden/Postnummer

From OpenStreetMap Wiki
Jump to navigation Jump to search

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: