4

我正在尝试从下层超级输出区域 (LSOA)英国邮政编码数据集中获取一些信息。

我需要数据转储中的邮政编码和 lsoa 信息以供 Excel 使用。

“下层超级输出区”类型的符号和标签。 http://opendatacommunities.org/doc/geography/lsoa/E01009437

例如,每个类型“邮政编码单位”的“lsoa” http://opendatacommunities.org/resource?uri=http%3A%2F%2Fdata.ordnancesurvey.co.uk%2Fid%2Fpostcodeunit%2FB721NB

我不知道如何使用网站上的 SPARQL 引擎来获取这些信息,或者如何从我下载的 N-Triples 文件中提取信息……</p>

4

2 回答 2

13

检索所需数据有两个主要选项。在某些情况下,可以使用公开可用的 SPARQL 端点查询数据。这可能是最方便的方法,除非有明确的理由需要本地数据,否则可以采用这种方法。但是,这种方法存在局限性,在这些情况下,下载数据集并在本地对其进行查询是有意义的。我将首先描述远程端点解决方案,然后是使用本地查询的解决方案。SPARQL 端点的限制(例如,硬超时)意味着第一种方法不足以完成此特定任务,因此该问题的具体答案是第二种方法。

在这个问题之前,我不熟悉这些特定的数据集和本体,所以第一种方法也通过“熟悉数据”过程。

使用 SPARQL 端点

有一个开放数据社区 SPARQL 端点,您可以对它运行查询并获取一些数据。我以前没有查看过这些数据,因此我将介绍我用来确定要运行哪种查询的过程,而不是仅仅发布最终答案。

您链接到的页面之一B72 1NB提到该资源的类型为PostcodeUnit,它具有 URI

http://data.ordnancesurvey.co.uk/ontology/postcode/PostcodeUnit

基于此,我尝试的第一件事是使用 SPARQL 查询来尝试检索一些邮政编码单元,因此我在上面的端点中使用了以下查询。(如果您将其复制并粘贴到那里,则需要删除之前的任何前导空格SELECT。无论如何,我必须这样做。)

SELECT * WHERE { 
  ?postcodeUnit a <http://data.ordnancesurvey.co.uk/ontology/postcode/PostcodeUnit>
}
LIMIT 10

SPARQL 结果

在上面链接的端点中。(这LIMIT有助于确保结果及时返回,并且我们不会要求服务器做太多事情。)这会产生如下结果

--------------------------------------------------------------
| postcodeUnit                                               |
==============================================================
| <http://data.ordnancesurvey.co.uk/id/postcodeunit/TA219HB> |
| <http://data.ordnancesurvey.co.uk/id/postcodeunit/TF109DS> |
| <http://data.ordnancesurvey.co.uk/id/postcodeunit/SY256SA> |
| <http://data.ordnancesurvey.co.uk/id/postcodeunit/SY147HR> |
| <http://data.ordnancesurvey.co.uk/id/postcodeunit/TF107BZ> |
| <http://data.ordnancesurvey.co.uk/id/postcodeunit/SY134LH> |
| <http://data.ordnancesurvey.co.uk/id/postcodeunit/TA202HF> |
| <http://data.ordnancesurvey.co.uk/id/postcodeunit/SY44QZ>  |
| <http://data.ordnancesurvey.co.uk/id/postcodeunit/TA116SS> |
| <http://data.ordnancesurvey.co.uk/id/postcodeunit/SY209DR> |
--------------------------------------------------------------

B72 1NB 页面显示其lsoaBirmingham 006C。该lsoa物业的 IRI 是(您可以在下载的数据中看到这一点)

http://opendatacommunities.org/def/geography#lsoa

所以我们将 SPARQL 查询扩展到

SELECT * WHERE { 
  ?postcodeUnit
    a <http://data.ordnancesurvey.co.uk/ontology/postcode/PostcodeUnit> ;
    <http://opendatacommunities.org/def/geography#lsoa> ?lsoa .
}
LIMIT 10

SPARQL 结果

结果是这样的:

-----------------------------------------------------------------------------------------------------------------------------
| postcodeUnit                                               | lsoa                                                         |
=============================================================================================================================
| <http://data.ordnancesurvey.co.uk/id/postcodeunit/TA219HB> | <http://opendatacommunities.org/id/geography/lsoa/E01029309> |
| <http://data.ordnancesurvey.co.uk/id/postcodeunit/TF109DS> | <http://opendatacommunities.org/id/geography/lsoa/E01029706> |
| <http://data.ordnancesurvey.co.uk/id/postcodeunit/SY147HR> | <http://opendatacommunities.org/id/geography/lsoa/E01018373> |
| <http://data.ordnancesurvey.co.uk/id/postcodeunit/TF107BZ> | <http://opendatacommunities.org/id/geography/lsoa/E01014172> |
| <http://data.ordnancesurvey.co.uk/id/postcodeunit/SY134LH> | <http://opendatacommunities.org/id/geography/lsoa/E01018514> |
| <http://data.ordnancesurvey.co.uk/id/postcodeunit/TA202HF> | <http://opendatacommunities.org/id/geography/lsoa/E01029175> |
| <http://data.ordnancesurvey.co.uk/id/postcodeunit/SY44QZ>  | <http://opendatacommunities.org/id/geography/lsoa/E01014204> |
| <http://data.ordnancesurvey.co.uk/id/postcodeunit/TA116SS> | <http://opendatacommunities.org/id/geography/lsoa/E01029225> |
| <http://data.ordnancesurvey.co.uk/id/postcodeunit/SW65TP>  | <http://opendatacommunities.org/id/geography/lsoa/E01001950> |
| <http://data.ordnancesurvey.co.uk/id/postcodeunit/TF15AX>  | <http://opendatacommunities.org/id/geography/lsoa/E01014155> |
-----------------------------------------------------------------------------------------------------------------------------

如果您想让查询更具可读性和简洁性,您可以在查询中使用前缀:

PREFIX pc: <http://data.ordnancesurvey.co.uk/ontology/postcode/>
PREFIX geo: <http://opendatacommunities.org/def/geography#>
SELECT * WHERE { 
  ?postcodeUnit
    a pc:PostcodeUnit ;
    geo:lsoa ?lsoa .
}
LIMIT 10

SPARQL 结果

结果当然是一样的。在每个结果页面的底部,您可以下载许多其他格式的结果。其中一种格式是 CSV,您可能会很幸运地将其直接导入电子表格(您说过您想使用 Excel 中的数据)。

评论中的讨论指出,PostcodeUnits 的绝对数量使得结果集非常大。UK Postcodes数据集包含四种类型的资源,按大小顺序排列:邮政编码单位、邮政编码部门、邮政编码区和邮政编码区。这些类型的资源分别有 1686911、10833、2087 和 120 个。据我了解评论中的说明,我们的想法是将这些与下层超级输出区 (LSOA) 相关联,例如Birmingham 006C。单个邮政编码单元与 LSOA 相关联,但更高级别的邮政编码区域不相关。每个邮政编码单元都其部门、地区和区域内。例如,TA21 9HB在 TA、TA21 9 和 TA21 之内。使用这些信息,我们可以询问邮政编码单位及其对应的区(或扇区,或区域),以及它们的 LSOA,并且只报告区和 LSOA,而忽略单位本身。例如:

PREFIX pc: <http://data.ordnancesurvey.co.uk/ontology/postcode/>
PREFIX geo: <http://opendatacommunities.org/def/geography#>
PREFIX sr: <http://data.ordnancesurvey.co.uk/ontology/spatialrelations/>
SELECT DISTINCT ?district ?lsoa 
WHERE { 
  ?postcodeunit a pc:PostcodeUnit ;
                geo:lsoa ?lsoa ;
                sr:within ?district .
  ?district a pc:PostcodeDistrict .
}
LIMIT 10 

SPARQL 结果

现在,数据集中有34378 个 LSOA,因此仍有大量数据可供选择,并且尝试下拉所有不同 losa/地区映射的文本结果仍会导致超时。事实上,由于每个 LSOA 都与某个地区相关联(我期望),因此输出中的结果可能与 LSOA 的数量一样多。

看起来这是我们开始达到SPARQL 端点的响应大小限制和超时的点,并且需要开始在本地访问数据。仅邮政编码数据是 5.6 GB,所以这不是一个很好的解决方案。

但是,如果您愿意为每个地区获取一个有代表性的 LSOA,我们可以使用 SPARQL 子查询来提取它们,如下面的查询,它首先检索所有邮政编码地区,然后为每个地区找到一个LSOA小区内有的邮编单位有。我不知道这是否是一个可以接受的结果,但是你最终得到了每个区的 LSOA,并且结果足够小(有 2087 行,与区的数量相同)可以将它们拉下来任何结果格式(包括 CSV)。

PREFIX pc: <http://data.ordnancesurvey.co.uk/ontology/postcode/>
PREFIX geo: <http://opendatacommunities.org/def/geography#>
PREFIX sr: <http://data.ordnancesurvey.co.uk/ontology/spatialrelations/>
SELECT ?region ?lsoa 
WHERE { 
  {
    SELECT ?region WHERE { 
      ?region a pc:PostcodeDistrict .
    }
  }

  {
    SELECT ?lsoa WHERE { 
      ?postcodeunit a pc:PostcodeUnit ;
                    geo:lsoa ?lsoa ;
                    sr:within ?region .
    }
    LIMIT 1 
  }
}

SPARQL 结果

在本地使用 TDB

使用 SPARQL 端点存在一些限制,例如上面遇到的超时。在这些情况下,下载数据并将其放入 Jena TDB 存储并使用tdbquery. 英国邮政编码页面有zipped n-triples 的下载链接。下载这些数据后(并安装了Apache Jena 2.10),我运行(在 Unix 系统上):

$ tdbloader2 --loc tdb dataset_data_postcodes_20130506183000.nt

tdb我为包含 TDB 的索引而创建的本地目录在哪里。加载数据需要一段时间(此处为 1125 秒),索引也是如此。加载完所有内容后,我将以下查询存储在名为 的文件中postcodes.sparql,并使用

$ tdbquery --loc tdb --results CSV --query postcodes.sparql > unit_lsoa.csv

生成 CSV 格式的结果,存储在文件unit_lsoa.csv. 这是前几行:

$ head -5 unit_lsoa.csv 
postcodeUnit,lsoa
http://data.ordnancesurvey.co.uk/id/postcodeunit/AL11AE,http://opendatacommunities.org/id/geography/lsoa/E01023667
http://data.ordnancesurvey.co.uk/id/postcodeunit/AL11AG,http://opendatacommunities.org/id/geography/lsoa/E01023741
http://data.ordnancesurvey.co.uk/id/postcodeunit/AL11AJ,http://opendatacommunities.org/id/geography/lsoa/E01023741
http://data.ordnancesurvey.co.uk/id/postcodeunit/AL11AR,http://opendatacommunities.org/id/geography/lsoa/E01023684

现在,有 1686911 个定义的邮政编码单元,所以我最初预计unit_lsoa.csv. 但是,大约减少了 200,000 人。(wc -l打印文件中的行数。)

$ wc -l unit_lsoa.csv 
1440143 unit_lsoa.csv

事实证明,一些邮政编码单元没有关联的 LSOA。我通过运行查询检查了这一点

PREFIX pc: <http://data.ordnancesurvey.co.uk/ontology/postcode/>
PREFIX geo: <http://opendatacommunities.org/def/geography#>
SELECT * WHERE { 
  ?postcodeUnit
    a pc:PostcodeUnit .
    FILTER NOT EXISTS { ?postcodeUnit geo:lsoa ?lsoa }
}

存储在文件中postcodes_without_lsoa.sparql

$ tdbquery --loc tdb \
    --results CSV \
    --query postcodes_without_lsoa.sparql > unit_without_lsoa.csv

果然,里面大概有20万行unit_without_lsoa.csv

$ wc -l unit_without_lsoa.csv
246770 unit_without_lsoa.csv

1440143 和 246770 的总和是 1686913,这正是邮政编码的数量(加上每个 CSV 文件中的标题的 2 行)。任务完成!

于 2013-05-17T13:46:15.233 回答
0

您可以使用网络服务获取此信息 您可以结合英国邮政编码(例如 ZE1 0AE)、部门、地区、城市和区边界

https://www.mashape.com/vanitysoft/uk-boundaries-io

这是一个查询邮政区 TA2 返回组成 TA2 区的扇区的多边形(GeoJson)集合的示例。TA2 区 GeoJson

于 2015-08-23T00:25:02.000 回答