socloz / geocoder
几乎缺失的Geocoder PHP 5.3库。
Requires
- php: >=5.3.0
Requires (Dev)
Suggests
- ext-curl: Enabling the curl extension allows you to use CurlHttpAdapter.
- guzzle/guzzle: Enabling Guzzle allows you to use the GuzzleHttpAdapter.
- kriswallsmith/buzz: Enabling Buzz allows you to use the BuzzHttpAdapter, it's the recommended HTTP layer.
- zendframework/zend-http: Enabling Zend_Http allows you to use the ZendHttpAdapter
README
Geocoder 是一个库,可以帮助您构建地理感知应用程序。它提供了一个地理编码操作的抽象层。库分为两部分:HttpAdapter
和 Provider
,并且非常易于扩展。
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-UA
、be-BY
、en-US
、en-BR
和 tr-TR
。此提供者还可以根据坐标(纬度,经度)反向信息。可以精确指定地名词以获得更准确的结果:house
、street
、metro
、district
和 locality
。
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()
将返回包含latitude
和longitude
值的数组;getLatitude()
将返回latitude
值;getLongitude()
将返回longitude
值;getBounds()
将返回包含south
、west
、north
和east
值的数组;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>
完成。
致谢
- William Durand william.durand1@gmail.com
- 所有贡献者
许可证
Geocoder 在 MIT 许可证下发布。有关详细信息,请参阅捆绑的 LICENSE 文件。