Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/wujunze/php-geo
php geo library
https://github.com/wujunze/php-geo
php-geo php-library
Last synced: 22 days ago
JSON representation
php geo library
- Host: GitHub
- URL: https://github.com/wujunze/php-geo
- Owner: wujunze
- License: mit
- Created: 2019-07-01T09:46:21.000Z (over 5 years ago)
- Default Branch: master
- Last Pushed: 2021-03-11T03:45:11.000Z (over 3 years ago)
- Last Synced: 2024-08-21T13:21:33.208Z (3 months ago)
- Topics: php-geo, php-library
- Language: PHP
- Homepage:
- Size: 46.9 KB
- Stars: 34
- Watchers: 3
- Forks: 3
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
README
Welcome to php-geo 👋
[![Build Status](https://travis-ci.org/wujunze/php-geo.svg?branch=master)](https://travis-ci.org/wujunze/php-geo)
[![codecov.io](http://codecov.io/github/wujunze/php-geo/coverage.svg?branch=master)](http://codecov.io/github/wujunze/php-geo?branch=master)
[![Code Intelligence Status](https://scrutinizer-ci.com/g/wujunze/php-geo/badges/code-intelligence.svg?b=master)](https://scrutinizer-ci.com/code-intelligence)
[![Latest Stable Version](https://poser.pugx.org/wujunze/php-geo/v/stable)](https://packagist.org/packages/wujunze/php-geo)
[![Licence](https://poser.pugx.org/wujunze/php-geo/license.svg)](https://packagist.org/packages/wujunze/php-geo)
[![Total Downloads](https://poser.pugx.org/wujunze/php-geo/downloads.svg)](https://packagist.org/packages/wujunze/php-geo)
![StyleCI](https://github.styleci.io/repos/194645280/shield?branch=master)## Install
```sh
composer require wujunze/php-geo
```## Usage
```php*
* This source file is subject to the MIT license that is bundled
* with this source code in the file LICENSE.
*/namespace Wujunze\PhpGeo\Tests\Services;
use kuiper\helper\Arrays;
use Predis\Client;
use Wujunze\PhpGeo\Requests\Geo;
use Wujunze\PhpGeo\Requests\GeoCollection;
use Wujunze\PhpGeo\Requests\GeoCriteria;
use Wujunze\PhpGeo\Services\GeoInterface;
use Wujunze\PhpGeo\Services\GeoService;
use Wujunze\PhpGeo\Tests\TestCase;class GeoServicesTest extends TestCase
{
/**
* @var GeoService
*/
protected static $geoService;/**
* @var Client
*/
protected static $driver;public static function setUpBeforeClass(): void
{
$config['driverClient'] = new Client([
'scheme' => 'tcp',
'host' => '127.0.0.1',
'port' => 6379,
]);self::$driver = $config['driverClient'];
self::$geoService = GeoService::getInstance();
self::$geoService->init($config);
self::$geoService->flushDB();
}public static function tearDownAfterClass(): void
{
self::$geoService->flushDB();
self::$geoService = null;
}public function testGeo()
{
$this->assertNotNull(self::$geoService);$this->assertInstanceOf(GeoInterface::class, self::$geoService);
$this->assertNotNull(self::$driver);
$this->assertInstanceOf(Client::class, self::$driver);
}public function testGeoAdd()
{
/** @var Geo $geo */
$geo = Arrays::assign(new Geo, ['lon' => '116.48105', 'lat' => '36.996794', 'member' => 'panda'.time()]);
$res = self::$geoService->geoAdd('home', $geo);$this->assertTrue($res);
}public function testGeoAddFalse()
{
/** @var Geo $geo */
$geo = Arrays::assign(new Geo, ['lon' => '116.48105', 'lat' => '36.996794', 'member' => 'google']);
$res = self::$geoService->geoAdd('home', $geo);$this->assertTrue($res);
$this->assertFalse(self::$geoService->geoAdd('home', $geo));$this->assertEquals(1, self::$geoService->geoRemove('home', $geo->getMember()));
}public function testGeoBatchAdd()
{
$geoCollection = new GeoCollection();
$geoCollection->setGeos([
Arrays::assign(new Geo, ['lon' => '116.48105', 'lat' => '36.996794', 'member' => 'cloud'.time()]),
]);
$res = self::$geoService->geoBatchAdd('home', $geoCollection);$this->assertTrue($res);
}public function testGeoDist()
{
/** @var Geo $geoMi */
$geoMi = Arrays::assign(new Geo, ['lon' => '116.334255', 'lat' => '40.027400', 'member' => 'xiaomi']);
$res = self::$geoService->geoAdd('company', $geoMi);
$this->assertTrue($res);/** @var Geo $geoMeituan */
$geoMeituan = Arrays::assign(new Geo, ['lon' => '116.489033', 'lat' => '40.007669', 'member' => 'meituan']);
$res = self::$geoService->geoAdd('company', $geoMeituan);
$this->assertTrue($res);$m = self::$geoService->geoDist('company', 'xiaomi', 'meituan', 'm');
$this->assertIsString($m);
$this->assertEquals("13365.8814", $m);
}public function testGeoPos()
{
/** @var Geo $geoIreader */
$geoIreader = Arrays::assign(new Geo, ['lon' => '116.514203', 'lat' => '39.905409', 'member' => 'ireader']);
$res = self::$geoService->geoAdd('company', $geoIreader);
$this->assertTrue($res);$geo = self::$geoService->geoPos('company', ['ireader']);
$this->assertIsArray($geo);
$this->assertIsString($geo[0][0]);
$this->assertIsString($geo[0][1]);
$this->assertIsFloat((float) $geo[0][0]);
$this->assertIsFloat((float) $geo[0][1]);$this->assertEquals(round($geoIreader->getLon(), 5), round($geo[0][0], 5));
$this->assertEquals(round($geoIreader->getLat(), 5), round($geo[0][1], 5));
}public function testGeoHash()
{
$hash = 'wx4g52e1ce0';
/** @var Geo $geoIreader */
$geoIreader = Arrays::assign(new Geo, ['lon' => '116.514203', 'lat' => '39.905409', 'member' => 'ireader']);
$res = self::$geoService->geoAdd('inc', $geoIreader);
$this->assertTrue($res);$geoHash = self::$geoService->geoHash('inc', 'ireader');
$this->assertIsArray($geoHash);
$this->assertEquals($hash, $geoHash[0]);
}/**
* @depends testAdd
*/
public function testGeoRadius()
{
$criteria = new GeoCriteria();
$criteria->setLong('102.55')->setLat('31.79')->setRadius(100000)->setUnit('m');
$geos = self::$geoService->geoRadius('city', $criteria);
$this->assertIsArray($geos);
$this->assertEquals('小金', $geos[0]);
$this->assertCount(7, $geos);
}/**
* @depends testAdd
*/
public function testGeoRadiusByMember()
{
$criteria = new GeoCriteria();
$criteria->setRadius(100000)->setUnit('m')->setMember('桐柏');
$geos = self::$geoService->geoRadiusByMember('city', $criteria);
$this->assertIsArray($geos);
$this->assertEquals('桐柏', $geos[0]);
$this->assertEquals('唐河', $geos[1]);
$this->assertCount(11, $geos);
}/**
* @depends testAdd
*/
public function testGeoRemove()
{
$res = self::$geoService->geoRemove('city', '平谷');
$this->assertEquals(1, $res);
$geo = self::$geoService->geoPos('city', ['平谷']);
$this->assertNull($geo[0]);
}/**
* @depends testAdd
*/
public function testGeoReset()
{
/** @var Geo $geoIreader */
$geoIreader = Arrays::assign(new Geo, ['lon' => '116.514203', 'lat' => '39.905409', 'member' => 'ireader']);
self::$geoService->geoAdd('city', $geoIreader);$geoIreader->setLon('118.689')->setLat('36.89');
self::$geoService->geoReset('city', $geoIreader);$geo = self::$geoService->geoPos('city', ['ireader']);
$this->assertEquals(round($geoIreader->getLon(), 4), round($geo[0][0], 4));
$this->assertEquals(round($geoIreader->getLat(), 4), round($geo[0][1], 4));
}/**
* @dataProvider additionProvider
*/
public function testAdd($member, $lon, $lat)
{
/** @var Geo $geo */
$geo = Arrays::assign(new Geo, ['lon' => $lon, 'lat' => $lat, 'member' => $member]);
$res = self::$geoService->geoAdd('city', $geo);$this->assertTrue($res);
}public function additionProvider()
{
$file = file_get_contents(__DIR__.'/../fixtrues/chinaCity.json');$cities = [];
$datas = json_decode($file, true);foreach ($datas as $data) {
foreach ($data['children'] as $city) {
$cities[$city['name']] = $city;
}
}return $cities;
}/**
* @depends testAdd
*/
public function testGeoRadius20190910()
{
$criteria = new GeoCriteria();
$criteria
->setLong('102.55')
->setLat('31.79')
->setRadius(100000)
->setUnit('m')
->setWithCoord(true)
->setWithDist(true)
->setWithHash(true)
->setCount(3)
->setSort('desc');
$geos = self::$geoService->geoRadius('city', $criteria);
$this->assertIsArray($geos);
$this->assertIsArray($geos[0]);
$this->assertEquals('小金', $geos[0][0]);
$this->assertEquals('理县', $geos[2][0]);
$this->assertEquals('4025806740894210', $geos[2][2]);
$this->assertCount(3, $geos);
$this->assertCount(4, $geos[0]);
}/**
* @depends testAdd
*/
public function testGeoRadiusByMember20190910()
{
$criteria = new GeoCriteria();
$criteria->setRadius(100000)
->setUnit('m')
->setMember('桐柏')
->setWithCoord(true)
->setWithDist(true)
->setWithHash(true)
->setCount(6)
->setSort('asc');;
$geos = self::$geoService->geoRadiusByMember('city', $criteria);
$this->assertIsArray($geos);
$this->assertIsArray($geos[0]);
$this->assertEquals('桐柏', $geos[0][0]);
$this->assertEquals('泌阳', $geos[1][0]);
$this->assertEquals('唐河', $geos[2][0]);
$this->assertEquals('4063867911107045', $geos[2][2]);
$this->assertCount(6, $geos);
}
}```
## Show your support
Give a ⭐️ if this project helped you!
***
_This README was generated with ❤️ by [readme-md-generator](https://github.com/kefranabg/readme-md-generator)_