chris48s/cakephp-geodistance

CakePHP 3 模型行为,用于基于距离查询地理编码数据

2.0.0 2018-05-06 13:51 UTC

This package is auto-updated.

Last update: 2024-09-14 00:45:30 UTC


README

Build Status Coverage Status

CakePHP GeoDistance 插件

CakePHP 3 行为,用于通过距离查询地理编码数据。

CakePHP-GeoDistance 是一个 CakePHP 3 行为,它使用球面余弦定律根据地图距离查询地理编码数据。非常适合“找到最近的 X”或“附近找到 Y”类型的查询。如果你的数据库中还没有与地理数据相关联的纬度/经度坐标,你可以使用地理编码插件来添加它们。尝试使用这个插件

安装

使用 packagist 通过 composer 安装。在您的 composer.json 中添加以下内容

"require": {
    "chris48s/cakephp-geodistance": "^2.0.0"
}

然后运行 composer installcomposer update,具体取决于您的需求。

支持的数据库

仅支持 MySQL 和 Postgres。

使用方法

加载插件

将以下代码添加到您的 bootstrap.php 中:Plugin::load('Chris48s/GeoDistance');

使用行为

在您的表类中添加行为。

<?php
namespace App\Model\Table;

use Cake\ORM\Table;

class MyTable extends Table
{

    public function initialize(array $config)
    {
        parent::initialize($config);
        $this->addBehavior('Chris48s/GeoDistance.GeoDistance');
    }
}

配置

默认情况下,行为假设您的表包含名为 latitudelongitude 的列,并且您想要以英里为单位执行查询。这些可以更改。只需在附加行为时传递一个选项数组即可。

<?php
namespace App\Model\Table;

use Cake\ORM\Table;

class MyTable extends Table
{

    public function initialize(array $config)
    {
        parent::initialize($config);
        $this->addBehavior('Chris48s/GeoDistance.GeoDistance', [
            'latitudeColumn' => 'lat',
            'longitudeColumn' => 'lng',
            'units' => 'km'
        ]);
    }
}

支持的单位是英里或公里。

查询数据

在向表类添加行为后,您现在可以访问 find('bydistance') 查询方法,您可以使用该方法找到给定点的 radius 范围内的数据库记录

<?php

use Cake\ORM\TableRegistry;

$myTable = TableRegistry::get('MyTable');

$options = [
    'latitude' => 51.3984830139,
    'longitude' => -0.236298886484,
    'radius' => 10
];
$query = $myTable
    ->find('bydistance', $options)
    ->select(['address', 'lat', 'lng']);

latitudelongituderadius 是必需参数。如果缺少或无效的必需参数,将抛出类 GeoDistanceInvalidArgumentException 的异常。

您还可以向查询传递其他条件或参数,并覆盖默认的“units”

<?php

use Cake\ORM\TableRegistry;

$myTable = TableRegistry::get('MyTable');

$options = [
    'latitude' => 51.3984830139,
    'longitude' => -0.236298886484,
    'radius' => 10,
    'units' => 'kilometres',
    'conditions' => [ 'active' => 1 ]
];
$query = $myTable
    ->find('bydistance', $options)
    ->select(['address', 'lat', 'lng']);

find('bydistance') 方法返回一个 CakePHP 查询对象,因此您可以在此对象上链式调用其他方法(例如:->order()->limit() 等)。

报告问题

如果您对这个插件有任何问题,请随时在 GitHub 仓库 上创建一个新的 问题。此插件采用 MIT 许可。