becklyn/postal-code-proximity

计算附近的邮政编码(假设存在预先生成的邮政编码查找数据库)。

v0.1.1 2015-03-06 11:39 UTC

This package is auto-updated.

Last update: 2024-09-07 05:21:56 UTC


README

如果您有一个包含邮政编码到经纬度映射的预先生成的数据库,这个库将帮助您搜索附近的邮政编码(在给定半径内)。

使用方法

首先,您需要创建一个查询生成器。查询生成器负责生成从数据库加载数据的SQL。您需要指定您的邮政编码表的名字和列名。

use Becklyn\PostalCodeProximity\QueryGenerator;

$queryGenerator = new QueryGenerator($tableName, $latitudeColumn = "lat", $longitudeColumn = "lng", $postalCodeColumn = "zip");

之后,您需要使用一个数据库适配器。已经存在适用于PDO和mysqli的适配器。

use Becklyn\PostalCodeProximity\Adapter\PdoAdapter;

$pdo = new \PDO("...", "user", "password");
$databaseAdapter = new PdoAdapter($pdo, $queryGenerator);

或者

use Becklyn\PostalCodeProximity\Adapter\MysqliAdapter;

$mysqli = new \mysqli("localhost", "user", "password", "dbname");
$databaseAdapter = new MysqliAdapter($mysqli, $queryGenerator);

现在您可以查询附近的邮政编码

use Becklyn\PostalCodeProximity\PostalCodeLocator;

$postalCodeLocator = new PostalCodeLocator($databaseAdapter);
$postalCodeLocator->loadNearPostalCodes($postalCode, $radius, $limit = null);
  • $postalCode 是邮政编码,例如 "12345"
  • $radius 是半径(千米,直线距离)
  • $limit (可选)限制结果数量

返回值

您将收到一个包含 NearPostalCode 的数组

$nearPostalCode->getPostalCode();
$nearPostalCode->getDistanceInKm();

错误情况

有两种可能的错误情况(除直接来自数据库的异常外)

  • AmbiguousPostalCodeException:如果给定的邮政编码在邮政编码数据库中找到多次
  • QueryException:处理所有源于数据库的错误情况。 警告:异常消息可能包含敏感信息。

推荐数据库结构

  • postal_code CHAR(5) (可能因您所在国家而异)
  • latitude DOUBLE
  • longitude DOUBLE

您应该在 postal_code 字段上添加唯一索引,并在 latitudelongitude 上添加索引。