pickuplatlng.inc.php
下記ファイルの内容を表示しています。 ダウンロードを行うにはファイル名をクリックしてください。
<?php
//============================================================================
// 各種地図サービスURLより緯度経度を抽出
//============================================================================
// 60進緯度経度
define('EG_DMS' ,'^(\+|-|E|W|N|S)?([[:digit:]]{1,3}\.[[:digit:]]{1,2}\.[[:digit:]]{1,2}\.[[:digit:]]{1,3})$');
// 十進緯度経度
define('EG_DEGREE','^\+?-?[[:digit:]]{1,3}\.[[:digit:]]+$');
function pickup_latlng(&$text) {
$prefix = 'http://[[:alnum:]\+\$\;\?\.%,!#~*/:@&=_-]+?';
$sep = '[[:alnum:]\+\$\;\?\.%,!#~*/:@&=_-]+?';
// au EZnavi (lan=xxxx&lon=xxxx)
$EG_GPS[] = array(
'url' => $prefix.'lat=(\+?[0-9\.]+)'.$sep.'lon=(\+?[0-9\.]+)',
'lat' => 1,
'lng' => 2
);
// au EZnavi (lan=xxxx&lon=xxxx) rev.
$EG_GPS[] = array(
'url' => $prefix.'lon=(\+?[0-9\.]+)'.$sep.'lat=(\+?[0-9\.]+)',
'lat' => 2,
'lng' => 1
);
// livedoor, MapFan (Exx.xx.xx.xxNxx.xx.xx.xx)
$EG_GPS[] = array(
'url' => $prefix.'((E|W)[0-9\.]+)((N|S)[0-9\.]+)',
'lat' => 3,
'lng' => 1
);
// livedoor, MapFan (Exx.xx.xx.xxNxx.xx.xx.xx) rev.
$EG_GPS[] = array(
'url' => $prefix.'((N|S)[0-9\.]+)((E|W)[0-9\.]+)',
'lat' => 1,
'lng' => 3
);
// Mapion
$EG_GPS[] = array(
'url' => $prefix.'((e|w)l=([0-9]+?(%2F|/|\.)[0-9]+?(%2F|/|\.)[0-9]+?\.[0-9]+?))'.$sep
.'((n|s)l=([0-9]+?(%2F|/|\.)[0-9]+?(%2F|/|\.)[0-9]+?\.[0-9]+?))',
'lat' => 6,
'lng' => 1,
'prg' => 'xy_mapion'
);
// Mapion rev.
$EG_GPS[] = array(
'url' => $prefix.'((n|s)l=([0-9]+?(%2F|/|\.)[0-9]+?(%2F|/|\.)[0-9]+?\.[0-9]+?))'.$sep
.'((e|w)l=([0-9]+?(%2F|/|\.)[0-9]+?(%2F|/|\.)[0-9]+?\.[0-9]+?))',
'lat' => 1,
'lng' => 6,
'prg' => 'xy_mapion'
);
$hit = ''; // ヒットした文字列が入る(リンクのURL)
$lat = '';
$lng = '';
// excerpt から抽出を試みる
foreach ($EG_GPS as $URL) {
if (mb_ereg($URL['url'],$text,$regs)) {
$hit = $regs[0];
$lat = $regs[$URL['lat']];
$lng = $regs[$URL['lng']];
$prg = $URL['prg'];
break;
}
}
// 位置情報を十進経緯度に変換する
if ($lat!='' && $lng!='') {
if (isset($prg)) {
$lat = $prg($lat);
} elseif (ereg(EG_DMS,$lat,$regs)) {
$dms = split('\.',$regs[2]);
$sig = ($regs[1]=='-' || $regs[1]=='W' || $regs[1]=='S') ? -1 : 1;
$lat = $dms[0]+$dms[1]/60+($dms[2].'.'.$dms[3])/3600;
$lat = $lat*$sig;
}
if (isset($prg)) {
$lng = $prg($lng);
} elseif (ereg(EG_DMS,$lng,$regs)) {
$dms = split('\.',$regs[2]);
$sig = ($regs[1]=='-' || $regs[1]=='W' || $regs[1]=='S') ? -1 : 1;
$lng = $dms[0]+$dms[1]/60+($dms[2].'.'.$dms[3])/3600;
$lng = $lng*$sig;
}
// 最終チェック
if (!ereg(EG_DEGREE,$lat,$regs) || !ereg(EG_DEGREE,$lng,$regs)) {
$lat='';
$lng='';
}
}
// datum チェック
datum_check($hit,$lat,$lng);
$xy['lat'] = $lat;
$xy['lng'] = $lng;
return $xy;
}
// マピオン
function xy_mapion($val) {
if (ereg('(e|w|n|s)l=([0-9]+)(%2F|/|\.)([0-9]+)(%2F|/|\.)([0-9]+\.[0-9]+)',$val,$regs)) {
$sig = ($regs[1]=='w' || $regs[1]=='s') ? -1 : 1;
$val = $regs[2]+$regs[4]/60+$regs[6]/3600;
} else {
$val = '';
}
return $val;
}
// datum チェック
function datum_check(&$url,&$lat,&$lng) {
$pos = strpos($url,'http://www.mapfan.com');
if ($pos == 0 && $pos !== false) {
TokyoToWGS84($lat,$lng);
return;
}
$pos = strpos($url,'http://kokomail.mapfan.com');
if ($pos == 0 && $pos !== false) {
TokyoToWGS84($lat,$lng);
return;
}
$pos = strpos($url,'http://map.livedoor.com');
if ($pos == 0 && $pos !== false) {
TokyoToWGS84($lat,$lng);
return;
}
$pos = strpos($url,'http://www.mapion.co.jp');
if ($pos == 0 && $pos !== false) {
TokyoToWGS84($lat,$lng);
return;
}
$pos = strpos($url,'http://map.yahoo.co.jp');
if ($pos == 0 && $pos !== false) {
TokyoToWGS84($lat,$lng);
return;
}
$pos = strpos($url,'http://map.goo.ne.jp/');
if ($pos == 0 && $pos !== false) {
TokyoToWGS84($lat,$lng);
return;
}
}
// EXIF 情報から緯度経度を取得する
function xy_from_exif($fid,&$lat,&$lng) {
$exif = exif_read_data($fid);
if (isset($exif['GPSLatitude']) && isset($exif['GPSLongitude'])) {
$lats = $exif['GPSLatitude'][0].' + '.$exif['GPSLatitude'][1].'/60 + '.$exif['GPSLatitude'][2].'/3600';
$lngs = $exif['GPSLongitude'][0].' + '.$exif['GPSLongitude'][1].'/60 + '.$exif['GPSLongitude'][2].'/3600';
if ($exif['GPSLatitudeRef']=='S') $lats = '-('.$lats.')';
if ($exif['GPSLongitudeRef']=='W') $lngs = '-('.$lngs.')';
eval("\$lat = $lats;");
eval("\$lng = $lngs;");
return true;
} else {
return false;
}
}
// 日本測地系 -> WGS84
function TokyoToWGS84(&$BTokyo,&$LTokyo) {
$BWGS84 = $BTokyo - 0.00010695*$BTokyo + 0.000017464*$LTokyo + 0.0046017;
$LWGS84 = $LTokyo - 0.000046038*$BTokyo - 0.000083043*$LTokyo + 0.010040;
$BTokyo = $BWGS84;
$LTokyo = $LWGS84;
}
// WGS84 -> 日本測地系
function WGS84toTokyo(&$BWGS84,&$LWGS84) {
$BTokyo = $BWGS84 + 0.00010696*$BWGS84 - 0.000017467*$LWGS84 - 0.0046020;
$LTokyo = $LWGS84 + 0.000046047*$BWGS84 + 0.000083049*$LWGS84 - 0.010041;
$BWGS84 = $BTokyo;
$LWGS84 = $LTokyo;
}
?>