lukaswhite / uk-postcode-geocoder
一个用于UK邮政编码地理编码的PHP库
Requires
- catfan/medoo: ^1.6
- league/climate: ^3.4
- league/csv: ^9.1
- lukaswhite/uk-postcode: ^1.0
Requires (Dev)
- phpunit/php-code-coverage: ^6.0
- phpunit/phpunit: 7.0
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
异常。