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;
}

?>