Detta är en gammal version, gå till senaste versionen:  https://lankadedata.se/spec/skoldata.

metasolutions logo 1 600dpi.png

Rapport
Skoldata i svenska kommuner

Tabulär modell, CSV uttryck samt annotering för konvertering till RDF

Författare                Matthias Palmér, MetaSolutions AB & Magnus Burell, Hemnet

Licens                        CC BY-SA 4.0

Datum                        2017-03-19

Permanent adress        https://lankadedata.se/spec/skoldata/1.0/

Versionshistorik

  • 2018-11-22 - Småfixar
  • La till permanent adress till specifikationen
  • Översatte rubriken på versionshistorik till svenska
  • Ändrade kapitalisering i kolumn 4 från GrundSkola till GRundskola så det blir tydligt vad koden ‘GR’ står för.
  • 2017-03-19 - Slutrevision A
  • Slut granskning gjord
  • Publicering av Lunds kommun gjord enligt specifikation
  • 2016-11-17 - Renodlad specifikation
  • Separation av modell och format
  • Förtydling av förväntade värden per kolumn
  • Fler kolumner baserat på exempel från Haninge
  • Tabell annotering enligt CSV on the web för validering och konvertering till RDF
  • 2016-10-21 - Utkast av Magnus Burell på Hemnet
  • Förslag på CSV uttryck
  • Förslag på kolumner från tidigare inhämtad data

Specifikation för skoldata

Vad ingår och terminologi

Med skoldata menas kontakt- och platsinformation om förskolor, familjedaghem, grundskolor och gymnasier inom en kommun. I texten nedan används för enkelhets skull ordet “skola” för att benämna alla dessa former.

Datamodell och format

Denna specifikation definierar en enkel tabulär datamodell för skoldata som passar utmärkt att leverera i formatet CSV, dvs kommaseparerade värden enligt RFC4180. Inget hindrar att ytterligare format stöds, men som grund förutsätts CSV kunna levereras då det är praktiskt och skapar förutsägbarhet för mottagare av informationen.

CSV formatet

Utöver det som sägs i RFC4180 krävs alltid att informationen är uttryckt med teckenkodning UTF-8 samt att den första raden ser ut som:

source,id,name,type,operation,street,postalcode,locality,lat,long,email,phone,url,capacity,open.from,open.to

På grund av att CSV har funnits länge och det finns en uppsjö av olika ramverk och program som inte alla följer RFC4180 så uppmanas man följa devisen:

"Be conservative in what you do, be liberal in what you accept from others"

För den här specifikationen innebär det att implementatörer rekommenderas även stödja semikolonseparerade filer[1]. För att särskilja skoldata som är semikolonseparerade från kommaseparerade måste första raden i detta fall se ut som:

source;id;name;type;operation;street;postalcode;locality;lat;long;email;phone;url;capacity;open.from;open.to

Leverans av CSV formatet

Om skoldata görs tillgängligt på en webbadress bör följande gälla:

  • Content-type ska vara text/csv (även för skoldata med semikolonseparerade värden)
  • Last-modified ska ange när skoldatat senast ändrats
  • HEAD requests ska stödjas där Last-modified ingår

Datamodell

Datamodellen är tabulär, där varje rad motsvarar exakt en skola och varje kolumn motsvarar en egenskap för denna skola[2]. 16 kolumner är definierade, där de första 8 är obligatoriska, kolumn 9 och 10 är starkt rekommenderade för att skolinformationen ska få spridning[3]. Övriga kolumner 11 till 16 är frivilliga.

#

Kolumn-
namn

Värde-
mängd

Exempel och förklaring

1

source

heltal

Ange SCB:s kommunkod för er kommun. Exempel: "0163" för Sollentuna kommun.

2

id

text

Ange en unik och stabil  identifierare för skolan inom er kommun, förslagsvis ett heltal, men en text är också acceptabelt. Undvik mellanslag och andra tecken som inte passar bra i en URI (webbadress). Man använda namnet för skolan, men då ersätta mellanrum med “_”, t.ex. “Förskolan_Bikupan”.

3

name

text

Ange skolans namn. Exempel: "Förskolan Bikupan"

4

type

FS|FD|GR|GY

Ange typ av skola, alternativen motsvarar:
FörSkola, FamiljeDaghem, GRundskola, GYmnasium

Använd de angivna förkortningarna i versaler.

5

operation

K|F

Ange ett av alternativen: "Kommunal", "Fristående/Privat".

Använd de angivna förkortningarna i versaler.

6

street

text

Ange gatuadress (för besöksadressen) inklusive gatunummer. Exempel: "Drevkarlsstigen 5"

7

postalcode

heltal

Ange postnummer utan mellanslag. Exempel: “19253"

8

locality

text

Ange postort. Exempel: "Sollentuna"

9

lat

WGS84[4]

Ange latitud enligt WGS84. Exempel: 59.4434403

10

long

WGS84

Ange longitud enligt WGS84. Exempel: 17.967933

11

email

email

Ange e-postadress för allmänna frågor till skolan. Uttryckt i enlighet med RFC 6068 utan “mailto:” scheme delen, t.ex. “johan@example.com”

12

phone

heltal och -

Ange telefonnummer (inklusive riktnummer) till skolans växel eller motsvarande. Använd - inte mellanrum om du vill öka läsbarheten (detta för att öka kompatibiliteten med RFC3966). T.ex.: 018-727-00-00

Ange inte landskod, +, parentes eller liknande.

13

url

URL

Ange i första hand fullständig webbadress till skolan, i andra hand webbadressen till en samlingssida för skolor på kommunens webbplats. Exempel: https://www.sollentuna.se/sv/uweb/gardesskolan-med-forskolor/vara-verksamheter1/Forskolan/

Notera att man måste ange URL:en med protokoll, dvs inklusive http:// eller https://.

14

capacity

heltal

Antal platser / elever som skolan kan ta emot.

15

open.from

hh:mm

Ange timme och minut i ett format som är kompatibelt med ISO 8601, t.ex. 07:30.

16

open.to

hh:mm

Ange timme och minut i ett format som är kompatibelt med ISO 8601, t.ex. 17:00.

Länka, konvertera och validera skoldatan

Du som är nöjd med att leverera eller använd skoldatat direkt som CSV kan ignorera detta avsnitt.

Schemat (tabellannoteringen) nedan är för dig som vill:

  • länka ihop skoldatan med andra datakällor
  • konvertera skoldatan till länkade data
  • validera CSV-uttrycken

Uitfrån schemat nedan (tabellannoteringen[5]) kan du validera och konvertera rader i den tabulära modellen ovan till instanser av schema.orgs EducationalOrganization.

Vi har valt schema.org eftersom den tillhandahåller en mängd egenskaper som till stor del täcker in skolinformationen. För dig som är intresserad går det att hitta andra representationer av skolor som RDF/länkade data.

{

  "@context": ["http://www.w3.org/ns/csvw", {

     "@language": "sv",

     "skd": "http://terms.lankadedata.se/skoldata/",

     "schema": "http://schema.org/",

     "dct": "http://purl.org/dc/terms/",

     "vcard": "http://www.w3.org/2006/vcard/ns#"

  }],

  "dialect": {"trim": true},

  "tableSchema": {

    "columns": [{

      "name": "source",

      "titles": "Kommunkod",

      "required": true,

      "propertyUrl": "schema:parentOrganization",

      "valueUrl": "http://lankadedata.se/municipality/{source}"

    }, {

      "name": "id",

      "titles": "Identifierare",

      "required": true,

      "propertyUrl": "dct:identifier"

    }, {

      "name": "name",

      "titles": "Namn",

      "required": true,

      "propertyUrl": "schema:name"

    }, {

      "name": "type",

      "titles": "Skoltyp",

      "required": true,

      "datatype": {"base": "string", "format": "FS|FD|GR|GY"},

      "propertyUrl": "rdf:type",

      "valueUrl": "skd:{type}"

    }, {

      "name": "operation",

      "titles": "Driftsform",

      "required": true,

      "datatype": {"base": "string", "format": "K|F"},

      "propertyUrl": "rdf:type",

      "valueUrl": "skd:{operation}"  

    }, {

      "name": "street",

      "titles": "Gata",

      "required": true,

      "datatype": "string",

      "aboutUrl": "/{source}/{id}#address",

      "propertyUrl": "schema:streetAddress"

    }, {

      "name": "postalcode",

      "title": "Postkod",

      "required": true,

      "aboutUrl": "/{source}/{id}#address",

      "datatype": {"base": "integer", "minimum": 10000, "maximum": 99999},

      "propertyUrl": "schema:postalCode"

    }, {

      "name": "locality",

      "title": "Postort",

      "required": true,

      "datatype": "string",

      "aboutUrl": "/{source}/{id}#address",

      "propertyUrl": "schema:addressLocality"

    }, {

      "name": "lat",

      "title": "Latitud",

      "aboutUrl": "/{source}/{id}#geo",

      "datatype": {"base": "decimal", "format": "#0.#####"},

      "propertyUrl": "schema:latitude"

    }, {

      "name": "long",

      "title": "Longitud",

      "aboutUrl": "/{source}/{id}#geo",

      "datatype": {"base": "decimal", "format": "#0.#####"},

      "propertyUrl": "schema:longitude"

    }, {

      "name": "email",

      "title": "Epost",

      "propertyUrl": "schema:email"

    }, {

      "name": "phone",

      "title": "Telefon",

      "propertyUrl": "schema:phone"

    }, {

      "name": "url",

      "title": "Webbadress",

      "propertyUrl": "schema:url"

    }, {

      "name": "capacity",

      "title": "Antal platser",

      "datatype": "integer",

      "propertyUrl": "skd:capacity"

    }, {

      "name": "open.from",

      "title": "Öppet från",

      "datatype": {"base": "date", "format": "HH:mm"},

      "suppressOutput": true

    }, {

      "name": "open.to",

      "title": "Öppet till",

      "datatype": {"base": "date", "format": "HH:mm"},

      "suppressOutput": true

    }, {

      "name": "vcard-telephone",

      "virtual": true,

      "propertyUrl": "vcard:hasTelephone",

      "valueUrl": "tel:{phone};phone-context=+46"

    }, {

      "name": "openinghours",

      "virtual": true,

      "aboutUrl": "/{source}/{id}#place",

      "propertyUrl": "schema:openingHours",

      "value": "Mo-Fr {open.from}-{open.to}"

    }, {

      "name": "place_relation",

      "virtual": true,

      "propertyUrl": "schema:location",

      "valueUrl": "/{source}/{id}#place"

    }, {

      "name": "place_type",

      "virtual": true,

      "aboutUrl": "/{source}/{id}#place",

      "propertyUrl": "rdf:type",

      "valueUrl": "schema:CivicStructure"

    }, {

      "name": "address_relation",

      "virtual": true,

      "aboutUrl": "/{source}/{id}#place",

      "propertyUrl": "schema:address",

      "valueUrl": "/{source}/{id}#address"

    }, {

      "name": "address_type",

      "virtual": true,

      "aboutUrl": "/{source}/{id}#address",

      "propertyUrl": "rdf:type",

      "valueUrl": "schema:PostalAddress"

    }, {

      "name": "geo_relation",

      "virtual": true,

      "aboutUrl": "/{source}/{id}#place",

      "propertyUrl": "schema:geo",

      "valueUrl": "/{source}/{id}#geo"

    }, {

      "name": "geo_type",

      "virtual": true,

      "aboutUrl": "/{source}/{id}#geo",

      "propertyUrl": "schema:geo",

      "valueUrl": "schema:GeoCoordinates"

    }]

  },

  "primaryKey": "id",

  "aboutUrl": "/{source}/{id}"

}


[1] Detta på grund av hur en del program, bland annat Microsoft Excel för operativsystem inställda på det svenska språket inte tycker att komma är en lämplig avskiljare då vi använder det bland annat i decimaltal.

[2] Notera att undantaget är första kolumnen (source) som inte är en egenskap utan motsvarar vart skolorna tillhör och kommer således vara samma för alla rader som kommer från en kommun. Det kan tyckas onödigt att upprepa detta för varje rad. Alternativet (som valts bort) är att varje mängd skoldata måste kompletteras med information om tillhörighet i en separat metadata fil.

[3] Med kolumn 8 och 9 blir det möjligt för aktörer som t.ex. Hemnet att enkelt visa skolor på en karta.

[4] WGS84 är samma koordinatsystem som används av GPS samt av de flesta karttjänster som t.ex. Google Maps, Bing Maps, OpenStreetMap, Mapquest, Esri, Mapbox

[5] Se W3C rekommendationen om CSV on the Web, https://www.w3.org/TR/tabular-data-model/