lukaswhite/uk-postcode-geocoder

一个用于UK邮政编码地理编码的PHP库

1.0 2018-10-21 08:10 UTC

This package is auto-updated.

Last update: 2024-09-17 14:35:53 UTC


README

一个基于免费开源邮政编码数据的UK邮政编码地理编码器(PHP)。

简单来说,这意味着你可以获取邮政编码的纬度和经度。

数据来源于国家统计局邮政编码目录,并存储在SQLite数据库中以实现快速查找。

如果您想将其作为自托管网络服务提供,您可能会发现这个存储库很有用。

关于UK邮政编码地理编码的说明

有几种不同的地理编码邮政编码的方法,每种方法都有自己的优缺点;实际上,这个库有一个关键的限制。那就是数据集并非100%完整。它非常全面;目前包含超过260万个邮政编码。然而,PAF(即皇家邮政的官方数据集)的许可证非常昂贵。

因此,对于那些邮政编码不在数据库中的罕见情况,您可能需要另一种方法,例如Google Maps。然而,使用这个库意味着您的大部分地理编码请求将不会产生费用,也不会受到使用第三方API的额外开销。

另一种选择是postcodes.io,这是一个用于执行相同操作(尽管包含更多信息)的免费API。这是基于相同ONS数据,所以如果您使用这个包并保持数据更新,那么它与使用这个包基本上是相同的,但需要额外的HTTP请求开销。它是开源的,因此您可以自行托管;这个库与这个库的主要区别在于它用Node.js编写;这基本上是为在PHP环境中工作的人提供的替代品。

入门

使用Composer安装包

composer require lukaswhite/uk-postcode-geocoder

重要:数据包中不包含数据。这是由于文件大小以及数据定期更新的原因。

然而,该包确实包含一个bash脚本,该脚本可以为您创建并填充数据库。

您可以在ONS Geo Portal上找到数据,只需搜索“邮政编码目录”。

截至写作时间(2018年11月),最新的文件是在2018年8月发布的。

您要找的文件是一个名为ONSPD_AUG_2018_UK.csv类似的CSV文件。

要运行设置过程

vendor/lukaswhite/uk-postcode-geocoder/bin/setup.sh [STORAGE DIRECTORY] [PATH TO CSV]

例如

vendor/lukaswhite/uk-postcode-geocoder/bin/setup.sh ./storage/database ONSPD_AUG_2018_UK.csv

您还可以使用编程方式运行配置过程;所有操作都使用Provisioner类完成;查看setup.sh以了解如何使用它。

用法

创建一个实例,传递包含SQLite数据库的目录

use Lukaswhite\UkPostCodeGeocoder\Service;

$service = new Service( '/path/to/db' );

这假设数据库文件名为postcodes.sqlite,但您可以覆盖此设置

$service = new Service( '/path/to/db', 'db.sqlite );

地理编码单个邮政编码

要地理编码(即获取UK邮政编码的纬度和经度),请调用get()方法

$coordinates = $service->get( 'SW1A 2AA' );

此服务对格式相当宽容;《sw1a2aa》也会工作。

这返回一个包含两个关键方法的对象;getLatitude()getLongitude()。它还包括一个toArray()方法,并实现了JsonSerializeable接口。

地理编码多个邮政编码

您还可以使用getMultiple()方法一次性查询多个邮政编码,例如

$results = $service->getMultiple( 'AB1 0AG', 'AB1 0AL', 'AB1 0AD' );

这返回一个关联数组,键为正确格式的邮政编码,值为Coordinate实例。

添加邮政编码

数据非常全面——超过260万个邮编——但已知它并非绝对完整。

因此,如果您要查询的邮编无法找到,可能需要使用其他来源,如谷歌地图。在这种情况下,您可能希望将其添加到数据库中,您可以使用add()方法完成此操作;例如

$service->add(
	'sw1A2aa',
	new Coordinate( 51.50354, -0.127695 )
);

请注意,该库对邮编的格式相当宽容,如上所示。然而,传递无效的邮编将抛出InvalidPostcodeException异常。如果邮编已在数据库中,它将抛出DuplicatePostcodeException异常。