Skip to content
php geo library
Branch: master
Clone or download
Permalink
Type Name Latest commit message Commit time
Failed to load latest commit information.
src geoRadiusByMember add options Jul 10, 2019
tests geoRadiusByMember add options Jul 10, 2019
.editorconfig init Jul 1, 2019
.gitattributes init Jul 1, 2019
.gitignore rename test file name Jul 4, 2019
.php_cs init Jul 1, 2019
.phplint.yml init Jul 1, 2019
.scrutinizer.yml fix ci Jul 4, 2019
.styleci.yml init Jul 1, 2019
.travis.yml add test php7.1 Jul 4, 2019
LICENSE init Jul 1, 2019
README.md geoRadiusByMember add options Jul 10, 2019
composer.json rename test file name Jul 4, 2019
phpunit.xml.dist rename test file name Jul 4, 2019

README.md

Welcome to php-geo 👋

Build Status codecov.io Code Intelligence Status Latest Stable Version Licence Total Downloads StyleCI

Install

composer require wujunze/php-geo

Usage

<?php declare(strict_types=1);
/**
 *
 * This file is part of the php-geo package.
 *
 * (c) Panda <itwujunze@gmail.com>
 *
 * 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

You can’t perform that action at this time.