SVG
Børre Stenseth
Eksempler > Norge >Fylker1

Norske fylker

Hva

I dette eksempelet lager vi SVG for å lage en mer abstrakt oversikt over norke fylker. Framstillingen er ikke "geografisk korrekt", men idikerer plassering av fylker som passer ganske bra med en intuitiv oversikt over landet. Fordelen er blandt annet at vi får en klar markering av hovedstaden.

En slik framstilling kan trolig med fordel brukes når vi skal framstille data som er fylkesbasert. Nedenfor er det ikke lagt inn meningsfulle data. Det eneste du kan gjøre er å veksle mellom fylkesnummer og fylksenavn. Det vil være enkelt å legge ut sammenlignbare verdier i form tekst, tall eller som bakrunnsfarge. På samme måte som det vil være enkelt å plane "onclick"-metoder for inspeksjon. I så fall kan vi betrakte kartet rett og slett som en meny.

Javascript-koden som produserer hele kartet er slik:

//--------------------------------
// filling a SVG-element with hexagon paths,
// one for each fylke
// hexagon surrounding circle radius
var R=70;
var pattern=
'<path style="fill:#dddddd;stroke:red" id="ID" label="name"\
 d="M x1,y1 L x2,y2 x3,y3 x4,y4 x5,y5 x6,y6 z" \>'; 
// convenient
var sin60=Math.sin(Math.PI*(60.0/360.0));
var cos60=Math.cos(Math.PI*(60.0/360.0));
// toggling content
var showId=true;
// the svg element
var svgE=null;
function hexagon(x,y,id,name) {
    var T=pattern;
    T=T.replace("x1",x)            .replace("y1",y-R);
    T=T.replace("x2",x+cos60*R)    .replace("y2",y-sin60*R);
    T=T.replace("x3",x+cos60*R)    .replace("y3",y+sin60*R);
    T=T.replace("x4",x)            .replace("y4",y+R);
    T=T.replace("x5",x-cos60*R)    .replace("y5",y+sin60*R);
    T=T.replace("x6",x-cos60*R)    .replace("y6",y-sin60*R);
    T=T.replace("ID",id);
    T=T.replace("name",name);
    //console.log(T);
    var sv=document.getElementById("svg1").innerHTML+=T;    
}
function setUp(svgId){
    // adjust viewBox to set radius
    // the drawing w:h is approx is 3:4
    svgE=document.getElementById(svgId);
    svgE.setAttribute("viewBox",'0 0 '+R*12+' '+ R*16);
    // top-right hexagon center
    var rootX=10*R;//250;
    var rootY=2*R//50;
    // strategy is to draw hexagons in down-left series
    // steplengths
    var dx=R*cos60;
    var dy=(R+R*sin60);
    
    hexagon(rootX        ,rootY,'20','Finnmark');
    rootX-=2*R*cos60;
    hexagon(rootX        ,rootY,'19','Troms');
    hexagon(rootX-1*dx     ,rootY+1*dy,'18','Nordland');
    hexagon(rootX-2*dx     ,rootY+2*dy,'17','Nord Trøndelag');
    hexagon(rootX-3*dx    ,rootY+3*dy,'15','Møre og Romsdal');
    hexagon(rootX-4*dx    ,rootY+4*dy,'14','Sogn og Fjordane');
    hexagon(rootX-5*dx    ,rootY+5*dy,'12','Hordaland');
    hexagon(rootX-6*dx    ,rootY+6*dy,'11','Rogaland');
    rootX=rootX-1*dx;
    rootY=rootY+3*dy;
    hexagon(rootX         ,rootY,'16','Sør Trøndelag');
    hexagon(rootX-1*dx    ,rootY+1*dy,'05','Oppland');
    hexagon(rootX-2*dx    ,rootY+2*dy,'06','Buskerud');
    hexagon(rootX-3*dx    ,rootY+3*dy,'08','Telemark');
    hexagon(rootX-4*dx    ,rootY+4*dy,'10','Vest Agder');
    rootX=rootX+1*dx;
    rootY=rootY+1*dy;
    hexagon(rootX        ,rootY,'04','Hedmark');
    hexagon(rootX-1*dx    ,rootY+1*dy,'03','Oslo');
    hexagon(rootX-2*dx    ,rootY+2*dy,'07','Vestfold');
    hexagon(rootX-3*dx    ,rootY+3*dy,'09','Aust Agder');
    rootX=rootX+1*dx;
    rootY=rootY+1*dy;
    hexagon(rootX        ,rootY,'02','Akershus');
    hexagon(rootX+1*dx    ,rootY+1*dy,'01','Østfold');
    
    // add text holder
    svgE.innerHTML+='<g id="textkeeper"></g>';
    showID();
    //showName();
}
function findCenterInHexagonPath(FP){
    // conpare pattrn, assuming start with absolute move: M
    var pos= FP.getAttribute("d").split("M")[1].split(",");
    pos[0]=parseInt(pos[0]);
    pos[1]=parseInt(pos[1])+R;
    return pos;
}
function showID(){
    var fyPaths=document.querySelectorAll("#svg1 path");
    //console.log(fyPaths.length);
    var tKeeper=document.querySelector("#svg1 #textkeeper");
    tKeeper.innerHTML="";
    for (var i=0; i< fyPaths.length;i++){
        var FP=fyPaths[i];
        var ID=FP.getAttribute("id");
        var pos=findCenterInHexagonPath(FP);
        //console.log(ID,pos);
        tKeeper.innerHTML+= 
          '<text text-anchor="middle" x="'+
          pos[0]+'" y="'+pos[1]+
          '" font-size="40px" fill="blue" >'+ID+'</text>';
    }
}
function showName(){
    var fyPaths=document.querySelectorAll("#svg1 path");
    //console.log(fyPaths.length);
    var tKeeper=document.querySelector("#svg1 #textkeeper");
    tKeeper.innerHTML="";
    for (var i=0; i< fyPaths.length;i++){
        var FP=fyPaths[i];
        var pos=findCenterInHexagonPath(FP);
        var words=FP.getAttribute("label").split(" ");
        var LH=0;
        if(words.length >1)
            LH=26;
        for(var wix=0;wix < words.length;wix++){
        tKeeper.innerHTML+= 
            '<text  text-anchor="middle" x="'+
            pos[0]+'" y="'+parseInt(pos[1]+LH*(wix-1))+
            '" font-size="26px" fill="blue" >'+words[wix]+'</text>';
        }
    }
}
function toggleContent(){
    if(showId)
        showName();
    else
        showID();
    showId=!showId;
}

Du kan teste på en egen side og inspisere kildekoden:
fylker.html https://borres.hiof.no/wep/svg/norge/f1/fylker.html .

Eksempler > Norge >Fylker1