demouth / dmgeocoder
地理编码库。
1.0.0
2014-02-01 17:42 UTC
Requires
- php: >=5.0
This package is auto-updated.
Last update: 2024-09-22 19:09:10 UTC
README
#DmGeocorder
这是一个专为日本国内使用的PHP地理编码库。
可以从地址获取经纬度(地理编码),也可以从经纬度获取地址(逆地理编码)。
##特点
- 通常在程序中进行地理编码时,会使用Google Geocoding API等地理编码API,但本库在库内持有地理信息,不使用地理编码API。因此,与使用地理编码API的实现不同,可以无限制地使用,这是本库的最大特点。
- 只需将本库的源代码部署到服务器即可使用(由于不使用地理编码API或数据库,因此无需特别准备库的利用或服务器设置)。
- 可以应对丁号等一定程度上的地址标记波动(详情请参考使用方法)。
- 仅针对日本国内,无法进行国外地理编码。
- 经纬度为世界大地坐标系。
- 精度为大字、町丁目级别,没有街区信息。
- 使用的是平成24年度版的数据。一旦下一年的数据公开,只需替换csv目录下的csv文件即可使用。
- PHP5.0以上版本均可使用,PHP5.3以下版本也可以使用,因此没有使用namespace。
##使用方法
####使用方法1:从地址名称获取经纬度
将地址字符串传递给Dm_Geocoder::geocode()的第一个参数,即可根据参数进行地址搜索,并返回详细的地址信息。这些地址信息包括经纬度信息。
如果可能的位置信息有多个,则将返回所有这些地址。
$addresses = Dm_Geocoder::geocode('沖縄県八重山郡与那国町与那国'); echo count($addresses); // 1 (この場合は1) $address = $addresses[0]; echo get_class($address); // Dm_Geocoder_Address echo $address->lat; // 24.468119 (緯度) echo $address->lng; // 123.004341 (経度) echo $address->prefectureName; // 沖縄県 (都道府県名) echo $address->municipalityName; // 八重山郡与那国町 (市区町村名) echo $address->localName; // 与那国 (大字町丁目名) echo $address->prefectureCode; // 47 (都道府県コード) echo $address->municipalityCode; // 47382 (市区町村コード) echo $address->localCode; // 473820001000 (大字町丁目コード)
如果搜索结果有多个,则将返回可能性较高的地址。
//検索結果が複数存在する場合 $addresses = Dm_Geocoder::geocode('東京都港区芝公園'); echo count($addresses); // 4 (検索結果に一〜四丁目と、複数存在する) echo $addresses[0]->localName; // 芝公園一丁目 echo $addresses[1]->localName; // 芝公園二丁目 echo $addresses[2]->localName; // 芝公園三丁目 echo $addresses[3]->localName; // 芝公園四丁目 //住所の絞り込みが十分で、検索結果が1つまで絞りこまれている場合 $addresses = Dm_Geocoder::geocode('東京都港区芝公園一丁目'); echo count($addresses); // 1 //存在しない住所名での検索で、マッチする検索結果が1件も存在しない場合 $addresses = Dm_Geocoder::geocode('ほげほげ'); echo count($addresses); // 0
在一定程度上支持地址的表述波动,因此可以进行如下搜索。
但以下示例中未出现的搜索,例如将“新宿区”搜索为“しんじゅくく”,则不支持。
//検索文字列の数字表記のゆらぎを吸収しているため、 //下記の3つはどれも同じ結果を返します $addresses = Dm_Geocoder::geocode('北海道札幌市中央区大通西17丁目'); $addresses = Dm_Geocoder::geocode('北海道札幌市中央区大通西17丁目'); $addresses = Dm_Geocoder::geocode('北海道札幌市中央区大通西十七丁目'); //郵便番号が含まれていたり、スペースが含まれていたり、 //大字町丁目以降の住所が含まれていても検索可能です //この場合郵便番号と大字町丁目以降の住所は無視されます //例: 中華Dining 東海飯店 大門本店 http://r.gnavi.co.jp/a136700/map/ $addresses = Dm_Geocoder::geocode('〒105-0012 東京都港区芝大門2-4-18'); echo $addresses[0]->localName; // 芝大門二丁目 //県名の省略も可能です //ただしこの場合、多少検索処理に時間がかかります $addresses = Dm_Geocoder::geocode('塩竈市千賀の台二丁目'); //県名だけの検索も可能です //この場合、この県に所属する「大字町丁目」分の結果が返ります $addresses = Dm_Geocoder::geocode('愛媛県'); echo count($addresses); // 2439
####使用方法2:从经纬度获取对应地址
通过Dm_Geocoder::reverseGeocode(纬度,经度)传递纬度和经度,即可按距离近的顺序返回多个地址信息。
$addresses = Dm_Geocoder::reverseGeocode(39.761437, 140.089602); $addresses[0]->prefectureName; // 秋田県 $addresses[0]->municipalityName; // 秋田市 $addresses[0]->localName; // 将軍野青山町 $addresses[1]->localName; // 将軍野堰越 $addresses[2]->localName; // 寺内字通穴 $addresses[3]->localName; // 将軍野東四丁目 : : //該当する住所が日本国内に存在しな場合は結果を返しません $addresses = Dm_Geocoder::reverseGeocode(10.0, 100.0); echo count($addresses); // 0
可以指定第三个参数为搜索结果的返回数。
//第三引数に渡した数分の住所を返します $addresses = Dm_Geocoder::reverseGeocode(35.6882074,139.7001416, 3); echo count($addresses); // 3 //第三引数を省略した場合、デフォルトで10件返します $addresses = Dm_Geocoder::reverseGeocode(35.6882074,139.7001416); echo count($addresses); // 10
##include/reqiure方法
请使用以下方法之一读取库。
如果读取成功,则可以使用类。
####使用composer的情况
编写以下composer.json并安装。
{ "require": { "demouth/dmgeocoder": "1.0.0" } }
####手动文件require的情况
下载源代码后,请按照以下方式读取src目录以下的源代码。
//autoloaderを使わず、Classファイルを手動で読み込む場合は下記ファイルをすべて読み込んでください $LIB_DIR = realpath(dirname(__FILE__).'/../src/').'/'; require_once $LIB_DIR.'Dm/Geocoder.php'; require_once $LIB_DIR.'Dm/Geocoder/Address.php'; require_once $LIB_DIR.'Dm/Geocoder/Prefecture.php'; require_once $LIB_DIR.'Dm/Geocoder/Query.php'; require_once $LIB_DIR.'Dm/Geocoder/GISCSV.php'; require_once $LIB_DIR.'Dm/Geocoder/GISCSV/Finder.php'; require_once $LIB_DIR.'Dm/Geocoder/GISCSV/Reader.php';
##注意事项
- 不支持UTF-8以外的编码。请确保mb_internal_encoding('UTF-8'),并将UTF-8字符串传递给搜索字符串。搜索结果也将以UTF-8返回。