Загрузка границ GeoJSON с использованием SPARQL из общедоступных данных
Мне интересно загрузить некоторые файлы границ из statistics.gov.scot, который является официальной статистикой репозиторий для обмена статистическими данными, использующими запросы SPARQL.
Фон
statistics.gov.scot обеспечивает доступ к границам GeoJSON для числа административных и статистических географических регионов, например административные границы локальных органов власти или доски для здоровья. В моем конкретном случае мне интересно загрузить набор данных с границами GeoJSON, относящимися к зонам данных. Зоны данных представляют собой статистические географии, разработанные с целью распространения данных о результатах жизни на небольшом уровне площади. При доступе через статистика .gov.scot область данных образцов выглядит следующим образом:
![Пример зоны данных]()
К географии и связанным с ней данным можно отнести здесь. Соответствующие данные GeoJSON доступны здесь.
Проблема
Зоны данных доступны в двух итерациях, выпущенных в 2004 году, а другой обновлен в последнее время. Я хотел бы загрузить первую итерацию, выпущенную в 2004 году. Следуя информации о статистических объектах я составил следующий запрос:
PREFIX entity: <http://statistics.data.gov.uk/def/statistical-entity#>
PREFIX boundaries: <http://statistics.gov.scot/boundaries/>
SELECT ?boundary
WHERE {
entity:introduced <http://reference.data.gov.uk/id/day/2004-02-01>
}
LIMIT 1000
который возвращает следующее сообщение об ошибке:
Error There was a syntax error in your query: Encountered " "}" "} "" at line 7,
column 3. Was expecting one of: <IRIref> ... <PNAME_NS> ... <PNAME_LN> ...
<BLANK_NODE_LABEL> ... <VAR1> ... <VAR2> ... "true" ... "false" ... <INTEGER> ...
<DECIMAL> ... <DOUBLE> ... <INTEGER_POSITIVE> ... <DECIMAL_POSITIVE> ...
<DOUBLE_POSITIVE> ... <INTEGER_NEGATIVE> ... <DECIMAL_NEGATIVE> ...
<DOUBLE_NEGATIVE> ... <STRING_LITERAL1> ... <STRING_LITERAL2> ...
<STRING_LITERAL_LONG1> ... <STRING_LITERAL_LONG2> ... "(" ... <NIL> ... "[" ...
<ANON> ... "+" ... "*" ... "/" ... "|" ... "?" ...
при тестировании через конечную точку: http://statistics.gov.scot/sparql.
Комментарии
В идеале я хотел бы разработать другие запросы, которые позволили бы мне использовать другие статистические географические регионы, используя префикс entity:
. Это должно быть возможно, так как entity:
будет содержать информацию о доступных географических точках (имя, аббревиатура, дата создания).
Запрос:
PREFIX entity: <http://statistics.data.gov.uk/def/statistical-entity#>
PREFIX boundaries: <http://statistics.gov.scot/boundaries/>
SELECT DISTINCT ?boundary ?shape WHERE {
?shape entity:firstcode ?boundary
}
LIMIT 1000
Поделил меня чем-то, что похоже на список желаемых географических регионов, но я изо всех сил пытаюсь исправить границы GeoJSON.
Ответы
Ответ 1
Ни статистика .gov.scot, ни statistics.data.gov.uk не содержит границы зон данных как WKT или строковые литералы.
Однако со следующим запросом можно легко создать URI файлов GeoJSON, которые используются на страницах ресурсов:
PREFIX pref1: <http://statistics.data.gov.uk/def/statistical-entity#>
PREFIX pref2: <http://statistics.gov.scot/id/statistical-entity/>
PREFIX pref3: <http://statistics.data.gov.uk/def/boundary-change/>
PREFIX pref4: <http://reference.data.gov.uk/id/day/>
PREFIX pref5: <http://statistics.data.gov.uk/def/statistical-geography#>
PREFIX pref6: <http://statistics.gov.scot/id/statistical-geography/>
PREFIX pref7: <http://statistics.gov.scot/boundaries/>
SELECT ?zone ?name ?json {
?zone pref1:code pref2:S01 .
?zone pref3:operativedate pref4:2004-02-01
OPTIONAL { ?zone pref5:officialname ?name }
BIND (CONCAT(REPLACE(STR(?zone), STR(pref6:), STR(pref7:)), ".json") AS ?json)
} ORDER BY (!bound(?name)) ASC(?name)
После этого можно легко получить файлы GeoJSON с помощью wget -i
или что-то вроде этого.
Некоторое объяснение
Вы должны использовать <http://statistics.data.gov.uk/def/boundary-change/operativedate>
вместо <http://statistics.data.gov.uk/def/statistical-entity#introduced>
, последнее свойство скорее свойство класса:
SELECT * WHERE {
?S <http://statistics.data.gov.uk/def/statistical-entity#introduced> ?date .
?S <http://www.w3.org/2000/01/rdf-schema#label> ?label
}
Зоны данных второго поколения датируются 2014-11-06
:
SELECT ?date (COUNT(?zone) AS ?count) WHERE {
?zone
<http://statistics.data.gov.uk/def/statistical-entity#code>
<http://statistics.gov.scot/id/statistical-entity/S01> ;
<http://statistics.data.gov.uk/def/boundary-change/operativedate>
?date
} GROUP BY ?date
Аналогично, если вам нужны URL-адреса соответствующих файлов GeoJSON, ваш запрос должен быть:
SELECT ?zone ?name ?json {
?zone pref1:code pref2:S01 .
?zone pref3:operativedate pref4:2014-11-06 .
?zone pref5:officialname ?name
BIND (CONCAT(REPLACE(STR(?zone), STR(pref6:), STR(pref7:)), ".json") AS ?json)
} ORDER BY ASC(?name)
Вам не нужно OPTIONAL
, потому что все зоны данных второго поколения имеют "официальные имена".
Вероятно, эта страница на data.gov.uk будет интересна для вас.
Существует также opendata.stackexchange.com для вопросов, связанных с открытыми данными.
Ответ 2
В первом запросе отсутствует предмет. Запрос SPARQL определяет набор тройных шаблонов - субъект, предикат и объект - для соответствия графику RDF. Чтобы превратить предложение WHERE в тройной шаблон SPARQL, попробуйте:
?boundary entity:introduced <http://reference.data.gov.uk/id/day/2004-02-01>