Komplett databasesett over Norges postnummer (med koordinater)

mars 12th, 2010 av David Steinsland Skriv en kommentar »

Her kommer det er oversikt over absolutt alle postnummer i Norge med tilhørende fylke, kommune og poststed. Hvert postnummer har også en lengde- og breddegrad tilknyttet seg. På denne måten kan du koble opp postnummeret til f.eks Google Maps.

Det er i alt fire tabeller i databasesettet:

  • Comments
  • County
  • Municipal
  • Zip
    • _codes
    • _places

Første tabell inneholder bare seks rader, som forklarer om postnummeret er av typene:

  • Firma med eige postnummer
  • Fleire bruksområde
  • Gateadresser
  • Gateadresser og postboksar
  • Postboksar
  • Serviceboksar

Databasesettet er generert med hjelp av Postnummer-dugnaden Yr.no arrangerte sommeren 2009.

Ved hjelp av lengde- og breddegradene kan du jo også regne deg frem til avstanden mellom to steder, eller finne nærmeste postkontor til en bruker.

For å få lett oversikt over alle postkoder, kjører du følgende spørring:

SELECT
z.zip, c.name as fylke, m.name as kommune, p.name as poststed, cc.comment, z.lat, z.lon
FROM `zip_codes` z
INNER JOIN zip_places p
ON p.place_id = z.place_id
INNER JOIN municipal m
ON m.id = p.municipal_id
INNER JOIN county c
ON c.county_id = m.county_id
INNER JOIN comments cc
ON cc.comment_id = z.comment_id
ORDER BY
z.zip ASC, fylke ASC, kommune ASC, poststed ASC

Med enhver sak kan det forekomme feil, så om dere kommer over noe som skulle vise seg til å være en bug: si i fra.

Liste over alle postnummer:
http://trunk.davidsteinsland.net/zip_codes.htm

Oppdateringer

  • Ser ut til at Jan Mayen og Svalbard har klart å falle ut. Dette er pga. øyene ikke tilhører noe fylke. Skal ordnes.
  • Fikset nå. Poststeder på øyene er plassert i et eget dummy-fylke kalt “Svalbard og Jan Mayen”
  • Fylkene har nå fått korrekt fylkesnummer basert på ISO 3166-2:NO. Fikset opp i kommuner på Jan Mayen og Svalbard

Laste ned

Norske postnummer.zip, lisensiert under Creative Commons.

Tips & triks

Hvordan finne et originalpunkt basert på gitt bredde- og lengdegrad?

Basert på sfærisk trigonometri kan vi “enkelt” regne oss frem til dette. Først av alt må vi gjøre punktene våres om til radianer (fra grader) for at funksjonen skal gjelde. Vi benytter oss også av jordradien i meter.

Distansen mellom punktene er gitt ved s:

s = \cos^{-1}\big( \sin \phi \cdot \sin \phi_0 + \cos \phi \cdot \cos \phi_0 \cdot \cos \Delta \lambda \big) \cdot R_\oplus

Breddegradene (\phi) og lengdegradene (\lambda) må først gjøres om til radianer. Dette gjør du med følgende formel:

{rad} = \frac{180^\circ}{\pi} \cdot {deg}

Dette er igrunn irrelevant, for dette har jeg allerede tatt høyde for i kodene.

For å løse det i MySQL, kan man gjøre det slik:

 SET @MY_LAT = 59.7022480, @MY_LON = 5.3764340;

SELECT z.zip, p.name, z.lat, z.lon, acos(SIN( RADIANS(@MY_LAT)) * SIN( RADIANS(z.lat))
+(cos(RADIANS(@MY_LAT)) * COS( RADIANS(z.lat)) * COS(RADIANS(z.lon) - RADIANS(@MY_LON))
)) * 6378137 AS distance
FROM zip_codes z
INNER JOIN zip_places p
ON z.place_id = p.place_id
HAVING distance <= 2000
ORDER BY distance ASC

Her har jeg satt variablene utenfor selve spørringen slik at det blir litt lettere å få det med seg.

I PHP kan man gjøre det slik:

$lat_1 = deg2rad (59.7022480);
$lat_2 = deg2rad (59.7022480);

$lon_1 = deg2rad (5.3764340);
$lon_2 = deg2rad (5.3764340);

$R = 6378137; // meters

$distance = acos ( sin($lat_1) * sin($lat_2) + cos ($lat_1) * cos($lat_2) * cos ($lon_2 - $lon_1)) * $R;
echo 'Distance: ' . (int)$distance/1000 . ' km'; 

Hva betyr dette? Hva kan man nytte det til?
Dersom du bruker en pakkeløsning hvor du kan dra frem koordinatene til en bruker basert på hans IP, kan du finne ut en circa-plassering på hvor han er i Norge. Formelen har en feilkilde på rundt 1 meter.

Bruke jQuerys Ajax-funksjonalitet til å hente ut data om postnummer

1. Opprett en fil kalt “get_postal.php” med følgende kode:
http://norskwebforum.no/pastebin/11243

2. Opprett så index.html med følgende kode:
http://norskwebforum.no/pastebin/11244

3. Opprett en mappen “cache”

Test ved å skrive inn et postnummer (fire siffer langt) eller et poststed. Informasjon om postnummeret/-stedet vil etterhvert poppe opp i avsnittet under skjemaet.

Del innhold:
  • Facebook
  • Digg
  • Google Bookmarks
  • del.icio.us
  • LinkedIn
  • Live
  • Twitter
  • RSS
  • PDF
  • Print
  • email

Relaterte innlegg:

  1. LaTeX på nett: matematiske formler til bilder
  • Veldig kuuult! Og nyttig! Har du et oversiktskart også? Et Norgeskart med hvor i Norge tallseriene er?
  • davidsteinsland
    Dette har Posten på sine nettsider her:
    http://epab.posten.no/Norsk/Nedlasting/_files/Postnummerkart.pdf

    :)
  • Sweet det her :) Men hvorfor heter tabellen "munincipial"? Burde det ikke hete "municipal" i stedet?
  • davidsteinsland
    Du har selvfølgelig helt rett i det du sier! Husket jeg merket meg det før, men tok meg aldri tid til å endre. Skal gjøres! ;-)
  • Datasettet mitt var korrekt så vidt eg hugsar. Svalbard skal vere fylke nr 21, Jan Mayen 22 og Kontinentalsokkelen 23. :-)
  • davidsteinsland
    Kan hende jeg drog frem feil datasett, men Jan Mayen og Svalbard tilhørte kommunen "#N/A#" som skapte problemer med løsningen min. Jeg laget derfor en "dummy-kommune" for disse øyene.
  • Kult at du tek i bruk datasettet! Dette er definitivt eit nyttig script!

    Ver obs på at eg oppdaterer basane i ny og ne, du bør difor sikre at filene dine nyttar siste versjon.
  • davidsteinsland
    Prøver å oppdatere så snart jeg får med meg endringer! Har du lagt merke til endringen jeg gjorde på Jan Mayen og Svalbard?
blog comments powered by Disqus