Annotating ski resorts, lifts and slopes with schema.org

Schema.org is awesome. It provides useful terms to annotate a great variety of entities on the web. Events, articles, products, people, hotels… for almost every item the modern webmaster wants to annotate, there’s a schema.org class for it. But since the initiative, driven by Bing, Google, Yahoo! and Yandex , is reatively young (2011), it’s pretty easy to hit the wall. That is what happens if one tries to annotate the ski lifts and slopes of a ski resort. The class schema.org/SkiResort is a subclass of schema.org/SportsActivitieLocation but does not introduce any new attributes. This article describes the approach to extend the schema.org vocabulary by two new classes and some new attributes to meet the requirements for the proper annotation of ski resorts.

This article describes a schema.org extension which is currently under review by the schema.org steering committee and not yet part of schema.org!

What’s new

Ski resort

To properly annotate a ski resort, apart from the properties inherited from LocalBusiness, Place, Organization and Thing, we need two new properties to add lifts and slopes. So we introduced hasSkiLift which expects the newly introduced type SkiLift and hasSkiSlope which expects the newly introduced type SkiSlope.

Ski lift

The type SkiLift is, like the ski resort itself, inherited from SportsActivityLocation. The new attributes describe the length, the elevation at the start (elevationStart) and the elevation at the end (elevationEnd) of the lift, the type (liftType: T-Bar lift, chair lift or cable car), the number of stops (numberOfStops) and the transport capacity (transportCapacity).

Ski slope

The newly introduced SkiSlope is inherited from SportsActivityLocation as well. The newly introduced attributes identify the ski slope by a number (slopeNumber), describe the difficulty and the length.

Example

The following example uses Microdata and describes a ski resort with two ski lifts and three ski slopes.

<div itemtype="http://schema.org/SkiResort" itemid="http://www.stanzach.at/familienskilifte.html" itemscope>
  <meta itemprop="name" content="Familienskilifte Stanzach" />
  <link itemprop="sameAs" href="http://www.naturpark-lechtal.at/winter/ski-und-snowboard/ski-und-snowboard.html?aid=55" />
  <link itemprop="sameAs" href="http://www.lechtal.at/winter/winter-aktiv-lechtal/skifahrenimlechtal/skigebiete/familienskigebiet-stanzach.html" />
  <link itemprop="image" href="http://www.naturpark-lechtal.at/index.php?rex_resize=990c__300h__p1230074.jpg" />
  <div itemprop="hasSkiLift" itemtype="http://schema.org/SkiLift" itemscope>
    <meta itemprop="length" content="550" />
    <meta itemprop="transportCapacity" content="2" />
    <meta itemprop="numberOfStops" content="2" />
    <meta itemprop="elevationEnd" content="1190" />
    <meta itemprop="elevationStart" content="940" />
    <meta itemprop="name" content="Stoamandllift" />
    <meta itemprop="liftType" content="T-bar lift" />
  </div>
  <div itemprop="hasSkiSlope" itemtype="http://schema.org/SkiSlope" itemscope>
    <meta itemprop="length" content="1330" />
    <meta itemprop="name" content="Familienabfahrt" />
    <meta itemprop="difficulty" content="blue" />
    <meta itemprop="slopeNumber" content="1a" />
  </div>
  <div itemprop="hasSkiSlope" itemtype="http://schema.org/SkiSlope" itemscope>
    <meta itemprop="length" content="1820" />
    <meta itemprop="name" content="Rennstrecke" />
    <meta itemprop="difficulty" content="red" />
    <meta itemprop="slopeNumber" content="1b" />
  </div>
  <div itemprop="hasSkiSlope" itemtype="http://schema.org/SkiSlope" itemscope>
    <meta itemprop="length" content="2575" />
    <meta itemprop="name" content="Wald Verbindungslift" />
    <meta itemprop="difficulty" content="Skiroute" />
    <meta itemprop="slopeNumber" content="2" />
  </div>
</div>

The same example in JSON-LD looks like this:

<script type="application/ld+json">
   {
       "@context": "http://schema.org",
       "@type": "SkiResort",
       "@id": "http://www.stanzach.at/familienskilifte.html",
       "name": "Familienskilifte Stanzach",
       "sameAs": [
           "http://www.naturpark-lechtal.at/winter/ski-und-snowboard/ski-und-snowboard.html?aid=55",
           "http://www.lechtal.at/winter/winter-aktiv-lechtal/skifahrenimlechtal/skigebiete/familienskigebiet-stanzach.html"
       ],
       "image": "http://www.naturpark-lechtal.at/index.php?rex_resize=990c__300h__p1230074.jpg",
       "hasSkiLift": {
           "@type": "SkiLift",
           "name": "Stoamandllift",
           "liftType": "T-bar lift",
           "transportCapacity": "2",
           "elevationStart": "940",
           "elevationEnd": "1190",
           "length": "550",
           "numberOfStops": "2"
       },
       "hasSkiSlope": [{
           "@type": "SkiSlope",
           "name": "Familienabfahrt",
           "slopeNumber": "1a",
           "length": "1330",
           "difficulty": "blue"
       },{
           "@type": "SkiSlope",
           "name": "Rennstrecke",
           "slopeNumber": "1b",
           "length": "1820",
           "difficulty": "red"
       },{
           "@type": "SkiSlope",
           "name": "Wald Verbindungslift",
           "slopeNumber": "2",
           "length": "2575",
           "difficulty": "Skiroute"
       }]
   }
</script>

Documentation and Discussion

The full documentation (in progress) can be found at: sdo-skiresort.appspot.com/docs/skiresort.html and the discussion , on the extension as well as on the integration progress in schema.org can be found on Github in the pull request: github.com/schemaorg/schemaorg/pull/1259