socloz/geocoder

此包已被弃用且不再维护。未建议替代包。

几乎缺失的Geocoder PHP 5.3库。

维护者

详细信息

github.com/SoCloz/Geocoder

主页

源码

安装量: 14,071

依赖者: 0

建议者: 0

安全: 0

星标: 1

关注者: 10

分支: 474

1.1.3 2012-11-17 17:24 UTC

README

Geocoder 是一个库,可以帮助您构建地理感知应用程序。它提供了一个地理编码操作的抽象层。库分为两部分:HttpAdapterProvider,并且非常易于扩展。

Build Status

HttpAdapters

HttpAdapters 负责从远程API获取数据。

目前有以下适配器

  • BuzzHttpAdapter 用于使用 Buzz,一个轻量级的PHP 5.3库,用于发送HTTP请求;
  • CurlHttpAdapter 用于使用 cURL
  • GuzzleHttpAdapter 用于使用 Guzzle,PHP 5.3+ HTTP客户端和构建RESTful网络服务客户端的框架;
  • SocketHttpAdapter 用于使用 socket
  • ZendHttpAdapter 用于使用 Zend Http Client

Providers

Providers 包含提取有用信息的逻辑。

目前,以下API有许多提供者

  • FreeGeoIp 作为基于IP的地理编码提供者;
  • HostIp 作为基于IP的地理编码提供者;
  • IpInfoDB 作为基于IP的地理编码提供者;
  • Yahoo! PlaceFinder 作为基于地址的地理编码和反向地理编码提供者;
  • Google Maps 作为基于地址的地理编码和反向地理编码提供者;
  • Google Maps for Business 作为基于地址的地理编码和反向地理编码提供者;
  • Bing Maps 作为基于地址的地理编码和反向地理编码提供者;
  • OpenStreetMaps 作为基于地址的地理编码和反向地理编码提供者;
  • CloudMade 作为基于地址的地理编码和反向地理编码提供者;
  • Geoip,PHP扩展,作为基于IP的地理编码提供者;
  • ChainProvider 是一个特殊的提供者,它接受一个提供者列表,并遍历此列表以获取信息;
  • MapQuest 作为基于地址的地理编码和反向地理编码提供者;
  • OIORest 作为非常精确的基于地址的地理编码和反向地理编码提供者(仅在丹麦);
  • GeoCoder.ca 作为基于地址的地理编码和反向地理编码提供者(仅在加拿大和美国);
  • GeoCoder.us 作为基于地址的地理编码提供商(仅限美国使用);
  • IGN OpenLS 作为基于地址的地理编码提供商(仅限法国使用);
  • DataScienceToolkit 作为基于IP的地理编码提供商;
  • Yandex 作为基于地址的地理编码和反向地理编码提供商;
  • GeoPlugin 作为基于IP的地理编码提供商;
  • GeoIPs 作为基于IP的地理编码提供商;
  • MaxMind web服务 作为基于IP的地理编码提供商。

安装

推荐通过composer安装Geocoder。

只需为您的项目创建一个composer.json文件

{
    "require": {
        "willdurand/geocoder": "*"
    }
}

然后运行这两个命令来安装它

$ wget https://getcomposer.org.cn/composer.phar
$ php composer.phar install

现在您可以添加自动加载器,并且可以访问库

<?php

require 'vendor/autoload.php';

如果您在您的应用程序中既不使用 Composer 也不使用 ClassLoader,只需使用提供的自动加载器即可

<?php

require_once 'src/autoload.php';

完成。

用法

首先,您需要一个适配器来查询API

<?php

$adapter  = new \Geocoder\HttpAdapter\BuzzHttpAdapter();

BuzzHttpAdapter是可调整的,实际上您可以将一个Browser对象传递给此适配器

<?php

$buzz    = new \Buzz\Browser(new \Buzz\Client\Curl());
$adapter = new \Geocoder\HttpAdapter\BuzzHttpAdapter($buzz);

现在,您必须选择一个提供商,它接近您想要获取的内容。

FreeGeoIpProvider

FreeGeoIpProvider只能对IPv4和IPv6地址进行地理编码。

HostIpProvider

HostIpProvider只能对IPv4地址进行地理编码。

IpInfoDbProvider

IpInfoDbProvider只能对IPv4地址进行地理编码。需要有效的API密钥。

YahooProvider

YahooProvider可以对IPv4地址街道地址进行地理编码。此提供商还可以根据坐标(纬度、经度)反向信息。需要有效的API密钥。

GoogleMapsProvider

GoogleMapsProvider可以对街道地址进行地理编码和反向地理编码。

BingMapsProvider

BingMapsProvider可以对街道地址进行地理编码和反向地理编码。需要有效的API密钥。

OpenStreetMapsProvider

OpenStreetMapsProvider可以对街道地址进行地理编码和反向地理编码。

CloudMadeProvider

CloudMadeProvider可以对街道地址进行地理编码和反向地理编码。需要有效的API密钥。

GeoipProvider

GeoipProvider只能对IPv4和IPv6地址进行地理编码。因为它使用本地数据库,所以不需要使用HttpAdapter。有关更多信息,请参阅MaxMind页面

ChainProvider

ChainProvider 是一种特殊的提供者,它接收一个提供者列表,并遍历此列表以获取信息。

MapQuestProvider

MapQuestProvider 能够进行地址编码和反向地址编码 街道地址

OIORestProvider

OIORestProvider 能够进行地址编码和反向地址编码 街道地址,仅限于丹麦。

GeocoderCaProvider

GeocoderCaProvider 能够进行地址编码和反向地址编码 街道地址,仅限于美国和加拿大。

GeocoderUsProvider

GeocoderUsProvider 能够仅进行地址编码 街道地址,仅限于美国。

IGNOpenLSProvider

IGNOpenLSProvider 能够仅进行地址编码 街道地址,仅限于法国。需要有效的API密钥。

DataScienceToolkitProvider

DataScienceToolkitProvider 能够仅进行地址编码 IPv4地址

YandexProvider

YandexProvider 能够进行地址编码和反向地址编码 街道地址。默认语言区域为 ru-RU,可以选择 uk-UAbe-BYen-USen-BRtr-TR。此提供者还可以根据坐标(纬度,经度)反向信息。可以精确指定地名词以获得更准确的结果:housestreetmetrodistrictlocality

GeoPluginProvider

GeoPluginProvider 能够仅进行地址编码 IPv4地址和IPv6地址

GeoIPsProvider

GeoIPsProvider 能够仅进行地址编码 IPv4地址。需要有效的API密钥。

MaxMindProvider

MaxMindProvider 能够仅进行地址编码 IPv4地址。需要有效的API密钥。

您可以使用其中之一或编写自己的提供者。您还可以注册所有提供者,以后再决定。这就是我们将要做的

<?php

$geocoder = new \Geocoder\Geocoder();
$geocoder->registerProviders(array(
    new \Geocoder\Provider\YahooProvider(
        $adapter, '<YAHOO_API_KEY>', $locale
    ),
    new \Geocoder\Provider\IpInfoDbProvider(
        $adapter, '<IPINFODB_API_KEY>'
    ),
    new \Geocoder\Provider\HostIpProvider($adapter)
));

$locale 参数适用于 YahooProvider

一切正常,请享受!

API

主要方法名为 geocode(),它接收要地址编码的值。它可以是一个IP地址或街道地址(部分或不完整)。

<?php

$result = $geocoder->geocode('88.188.221.14');
// Result is:
// "latitude"       => string(9) "47.901428"
// "longitude"      => string(8) "1.904960"
// "bounds"         => array(4) {
//     "south" => string(9) "47.813320"
//     "west"  => string(8) "1.809770"
//     "north" => string(9) "47.960220"
//     "east"  => string(8) "1.993860"
// }
// "streetNumber"   => string(0) ""
// "streetName"     => string(0) ""
// "city"           => string(7) "Orleans"
// "zipcode"        => string(0) ""
// "county"         => string(6) "Loiret"
// "region"         => string(6) "Centre"
// "country"        => string(6) "France"
// "timezone"       => string(6) "Europe/Paris"

$result = $geocoder->geocode('10 rue Gambetta, Paris, France');
// Result is:
// "latitude"       => string(9) "48.863217"
// "longitude"      => string(8) "2.388821"
// "bounds"         => array(4) {
//     "south" => string(9) "48.863217"
//     "west"  => string(8) "2.388821"
//     "north" => string(9) "48.863217"
//     "east"  => string(8) "2.388821"
// }
// "streetNumber"   => string(2) "10"
// "streetName"     => string(15) "Avenue Gambetta"
// "city"           => string(5) "Paris"
// "county"         => string(5) "Paris"
// "zipcode"        => string(5) "75020"
// "region"         => string(14) "Ile-de-France"
// "country"        => string(6) "France"
// "timezone"       => string(6) "Europe/Paris"

geocode() 方法返回一个具有以下API的 Geocoded 结果对象,此对象还实现了 ArrayAccess 接口

  • getCoordinates() 将返回包含 latitudelongitude 值的数组;
  • getLatitude() 将返回 latitude 值;
  • getLongitude() 将返回 longitude 值;
  • getBounds() 将返回包含 southwestnortheast 值的数组;
  • getStreetNumber() 将返回 street number/house number 值;
  • getStreetName() 将返回 street name 值;
  • getCity() 将返回 city
  • getZipcode() 将返回 zipcode
  • getCityDistrict() 将返回 城市地区,或 次级地区;
  • getCounty() 将返回 ;
  • getCountyCode() 将返回 代码(县简称);
  • getRegion() 将返回 地区;
  • getRegionCode() 将返回 地区 代码(地区简称);
  • getCountry() 将返回 国家;
  • getCountryCode() 将返回 ISO 国家 代码;
  • getTimezone() 将返回 时区

Geocoder 的 API 是流畅的,你可以这样写

<?php

$result = $geocoder
    ->registerProvider(new \My\Provider\Custom($adapter))
    ->using('custom')
    ->geocode('68.145.37.34')
    ;

using() 方法允许你选择要使用的 提供者。当你处理多个提供者时,你可能想选择其中一个。默认行为是使用第一个,但可能会令人烦恼。

反向地理编码

此库提供了一个 reverse() 方法,用于从坐标检索信息

$result = $geocoder->reverse($latitude, $longitude);

转储器

Geocoder 提供了旨在将 ResultInterface 对象转换为标准格式的转储器。

GPS 交换格式 (GPX)

GPS 交换 格式旨在共享地理定位数据,如兴趣点、轨迹、路线,以及坐标。Geocoder 提供了一个转储器,可以将 ResultInterface 对象转换为符合 GPX 格式的格式。

假设我们得到了前面看到的 $result 对象

<?php

$dumper = new \Geocoder\Dumper\GpxDumper();
$strGpx = $dumper->dump($result);

echo $strGpx;

它将显示

<gpx
    version="1.0"
    creator="Geocoder" version="1.0.1-dev"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns="http://www.topografix.com/GPX/1/0"
    xsi:schemaLocation="http://www.topografix.com/GPX/1/0 http://www.topografix.com/GPX/1/0/gpx.xsd">
    <bounds minlat="2.388911" minlon="48.863151" maxlat="2.388911" maxlon="48.863151"/>
    <wpt lat="48.8631507" lon="2.3889114">
        <name><![CDATA[Paris]]></name>
        <type><![CDATA[Address]]></type>
    </wpt>
</gpx>

GeoJSON

GeoJSON 是一种用于编码各种地理数据结构的格式。

Keyhole 标记语言 (KML)

Keyhole 标记语言 是一种 XML 表示法,用于在基于互联网的二维地图和三维地球浏览器中表达地理注释和可视化。

已知二进制 (WKB)

几何值的已知二进制 (WKB) 表示由 OpenGIS 规范定义。

已知文本 (WKT)

已知文本 (WKT) 是一种用于在地图上表示矢量几何对象、空间对象的参考系统和空间参考系统之间转换的文本标记语言。

格式化器

一个常见的用例是打印地理编码数据。感谢 Formatter 类,格式化 ResultInterface 对象为字符串变得非常简单

<?php

// $result is an instance of ResultInterface
$formatter = new \Geocoder\Formatter\Formatter($result);

$formatter->format('%S %n, %z %L');
// 'Badenerstrasse 120, 8001 Zuerich'

$formatter->format('<p>%S %n, %z %L</p>');
// '<p>Badenerstrasse 120, 8001 Zuerich</p>'

以下是映射

  • 街道号码:%n

  • 街道名称:%S

  • 城市:%L

  • 邮编:%z

  • 县:%P

  • 县代码:%p

  • 地区:%R

  • 地区代码:%r

  • 国家:%C

  • 国家代码:%c

  • 时区:%T

扩展功能

你可以提供自己的 适配器,你只需要创建一个新的类,该类实现 HttpAdapterInterface

你也可以通过实现 ProviderInterface 来编写自己的 提供者

注意,AbstractProvider 类可以提供有用的功能。

你可以通过实现 DumperInterface 来提供自己的 转储器

通过实现 FormatterInterface 来编写自己的 格式化器

单元测试

要运行单元测试,您需要 cURL 和一组可以使用 Composer 安装的依赖项

php composer.phar install --dev

安装完成后,只需启动以下命令

phpunit

由于需要 API 密钥,您将获得一些 跳过 的单元测试

phpunit.xml.dist 文件重命名为 phpunit.xml,然后取消注释以下行并添加您自己的 API 密钥

<php>
    <!-- <server name="IPINFODB_API_KEY" value="YOUR_API_KEY" /> -->
    <!-- <server name="YAHOO_API_KEY" value="YOUR_API_KEY" /> -->
    <!-- <server name="BINGMAPS_API_KEY" value="YOUR_API_KEY" /> -->
    <!-- <server name="CLOUDMADE_API_KEY" value="YOUR_API_KEY" /> -->
    <!-- <server name="IGN_WEB_API_KEY" value="YOUR_API_KEY" /> -->
    <!-- <server name="GEOIPS_API_KEY" value="YOUR_API_KEY" /> -->
    <!-- <server name="MAXMIND_API_KEY" value="YOUR_API_KEY" /> -->
</php>

完成。

致谢

许可证

Geocoder 在 MIT 许可证下发布。有关详细信息,请参阅捆绑的 LICENSE 文件。