使用 SPARQL 从公开数据中下载 GeoJSON 边界

Posted

技术标签:

【中文标题】使用 SPARQL 从公开数据中下载 GeoJSON 边界【英文标题】:Downloading GeoJSON boundaries using SPARQL from publicly available data 【发布时间】:2016-06-10 00:03:20 【问题描述】:

我有兴趣从statistics.gov.scot 下载一些边界文件,statistics.gov.scot 是一个官方统计存储库,用于共享利用 SPARQL 查询的统计数据。

背景

Statistics.gov.scot 提供对多个行政和统计地理区域的 GeoJSON 边界的访问,例如 local authority administrative boundaries 或 health boards。在我的特殊情况下,我有兴趣下载与 数据区域 相关的具有 GeoJSON 边界的数据集。 数据区是为了在小区域范围内传播生活结果数据而开发的统计地理。通过statistics.gov.scot 示例数据区访问时,如下所示:

地理和相关数据可以访问here。对应的 GeoJSON 数据可用here。

问题

数据区在两个迭代中可用,一个是在 2004 年生成的,另一个是最近更新的。我想下载 2004 制作的第一次迭代。根据statistical entities上的信息,我起草了以下查询:

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 边界。

【问题讨论】:

似乎 statistics.gov.scotstatistics.data.gov.uk 都不包含数据区域边界,如 wkt-或字符串文字。但是,可以使用以下查询轻松构建 geojson 文件的 URI。 @StanislavKralin 你为什么不让它回答,这似乎是一个好方法。 【参考方案1】:

statistics.gov.scotstatistics.data.gov.uk 均不包含 WKT 或字符串文字形式的数据区域边界。

但是,通过以下查询,可以轻松构建用于资源页面的 GeoJSON 文件的 URL:

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)

之后,可以使用wget -i 或类似的方式轻松检索 GeoJSON 文件。

一些解释

你应该使用&lt;http://statistics.data.gov.uk/def/boundary-change/operativedate&gt;而不是&lt;http://statistics.data.gov.uk/def/statistical-entity#introduced&gt;,后者的属性是一个类属性:

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

类似地,如果您需要相应 GeoJSON 文件的 URL,您的查询应该是:

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 上的 this page 可能对您来说很有趣。 也有opendata.stackexchange.com 提供与开放数据相关的问题。

更新

截至 2018 年 5 月,可以将数据区域边界检索为 WKT:

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://www.opengis.net/ont/geosparql#>


SELECT ?zone ?name ?geometry 
   ?zone pref1:code pref2:S01 .
   ?zone pref3:operativedate pref4:2014-11-06 .
   ?zone pref5:officialname ?name .
   ?zone pref6:hasGeometry/pref6:asWKT ?geometry .
 ORDER BY ASC(?name)

【讨论】:

【参考方案2】:

第一个查询缺少主题。 SPARQL 查询定义了一组三元组模式 - 主语、谓语和宾语 - 以匹配 RDF 图。要将 WHERE 子句转换为 SPARQL 三元组模式,请尝试:

?boundary entity:introduced <http://reference.data.gov.uk/id/day/2004-02-01>

【讨论】:

感谢您对我的小问题表现出兴趣。运行这个查询给了 ma 一个有一行的表和这个值:http://statistics.gov.scot/id/statistical-entity/S01 好的,如果您想查看有关该实体的信息,请添加三元组模式 ?boundary ?p ?o,它会为您提供所有属性/对象对,您可以选择您真正想查询哪些。 &lt;http://statistics.data.gov.uk/def/boundary-change/operativedate&gt;,而不是&lt;http://statistics.data.gov.uk/def/statistical-entity#introduced&gt;

以上是关于使用 SPARQL 从公开数据中下载 GeoJSON 边界的主要内容,如果未能解决你的问题,请参考以下文章

Sparql查询RDF

如何优化我的递归 SPARQL 查询?

Sparql语言模型

SPARQL 查询返回空结果集

知识图谱学习与实践——通过例句介绍Sparql的使用

Wikidata和SparQL简介