wp-mail.phpを改造して地図へのリンクを表示する
wp-mail.php サムネイル+機能強化版
こちらで配布されているwp-mail.phpに手を加え、画像が添付された際にサムネイルを作成できるように機能追加しました。
wp-mail.phpのサムネイル+機能強化版を利用して、GPS情報のある写真が添付された場合に地図へのリンクを記事に挿入する改造を行ってみました。
- '仕様'
- 複数の写真が添付された場合、GPS情報を取得できるのは1枚目の写真のみ
- GPS情報は世界測地系(WGS-84)/日本測地系(Tokyo)の両測地系に対応し、世界測地系であれば日本測地系に変換を行い地図サイトへのリンクを生成します
- '注意'
- 携帯電話 au W21S でしか確認していません
- ライセンスは元のwp-mail.phpが GNU GPL となっていますのでGPLです
- &color(#F00){'2005/03/15 更新'}
- GPS情報が日本測地系の場合エラーが発生する問題を修正。
- メールを2件以上処理する場合でも、1件目のGPS情報を利用してしまう問題を修正
<!--more-->
wp-mail.php サムネイル+機能強化版を入れる
wp-mail.php サムネイル+機能強化版から somy_wp-mail.lzh(EUC-JPの場合はsomy_wp-mail_euc.lzh)をとってきて、WordPressのディレクトリに展開する。
wp-mail.phpを改造する
- 改造済みのものを以下に格納しておきます
結構無理やりな事をしています。。。 :oops:
get_gps_information()関数の $content = … あたりで地図サイトへのリンクを生成していますので、お好みに合わせて変更してください。
‘114行目に追加’
// GPS地図リンク作成用の設定 /* GPS情報がある場合地図へのリンクを作成 ''1'':する ''0'':しない */ $wpmail_get_gps_information = ''1''; /* 地図サイトへのURL一覧(日本測地系) URL中の$latは緯度、$lonは経度 */ $_gps_map_urls = array( ''Yahoo'' => ''http://map.yahoo.co.jp/pl?nl=$lat&el=$lon'', ''Mapion'' => ''http://www.mapion.co.jp/c/f?uc=1&grp=all&nl=$lat&el=$lon'', ''MapFan'' => ''http://www.mapfan.com/index.cgi?MAP=E$lonN$lat&ZM=11'', ); /* 地図サイトへのURL一覧からの名前 */ $_gps_map_url = ''MapFan''; /* [ラジアン/度](変更の必要がなければ修正しないでください) */ $rd = pi() / 180; /* [変換用データ](変更の必要がなければ修正しないでください) */ $geo_param = array( ''WGS-84'' => array( ''a'' => 6378137, ''1/f'' => 298.257223563, ''dx'' => 0, ''dy'' => 0, ''dz'' => 0, ), ''TOKYO'' => array( ''a'' => 6377397.155, ''1/f'' => 299.152813, ''dx'' => 148, ''dy'' => -507, ''dz'' => -681, ), ) ;
‘332行目付近に追加’
// GPS情報取得 if($wpmail_get_gps_information && count($_wpmail_photo_filepaths) > 0) { $content = get_gps_information($_wpmail_photo_filepaths[0]).$content; $_wpmail_photo_filepaths = array(); }
‘399行目に追加’
global $_wpmail_photo_filepaths;
‘462行目に追加’
$_wpmail_photo_filepaths[] = $file_path;
‘620行目に追加’
/** * GPS情報取得 */ function get_gps_information($filename) { global $_gps_map_urls, $_gps_map_url; $content = ""; if(($exif = exif_read_data($filename, 0, true)) && array_key_exists("GPS", $exif)){ $lon = degstr($exif["GPS"]["GPSLongitude"]); $lat = degstr($exif["GPS"]["GPSLatitude"]); $gps_geo = $exif["GPS"]["GPSMapDatum"]; if($gps_geo != "TOKYO"){ $gps_geo_tokyo = convert_gps_geo($gps_geo, "TOKYO", $lon, $lat); }else{ $gps_geo_tokyo = array("Longitude" => $lon, "Latitude" => $lat); } $replace_patterns = array(''/$lon/'', ''/$lat/''); $location_mapurl = preg_replace($replace_patterns, $gps_geo_tokyo, $_gps_map_urls[$_gps_map_url]); $location = get_map_location_from_url($location_mapurl); $dt = dtstr( $exif["EXIF"]["DateTimeOriginal"]); $content = "<blockquote>n" ."<strong>GPS情報:</strong>n" ."$dtn" ."<a href="$location_mapurl">$location</a>n" ."</blockquote>n"; } return $content; } function get_map_location_from_url($url) { $content = get_content_from_url($url); if(preg_match("/<title>([^<>]+)< /title>/i", $content, $match)){ $title = htmlspecialchars($match[1]); list($title, $location) = explode(" - ", $title); if(strstr($location, "周辺") === false){ $location = $title; } } return $location == "" ? "不明" : str_replace("地図", "", $location); } function get_content_from_url($url) { $content = @join("", @file($url)); $content = mb_convert_encoding($content, get_settings(''blog_charset''), "EUC-JP"); return $content; } function degstr($parry) { $d = ratstr2num($parry[0]); $m = ratstr2num($parry[1]); $s = ratstr2num($parry[2]); list($g,$l) = explode(''.'', $s); return sprintf("%02d.%02d.%02d.%02d", $d, $m, $g, $l); } function ratstr2num($str) { list($ch, $mot) = explode(''/'', $str); return $mot == 0 ? 0 : ($ch/$mot); } function dtstr($str) { list($y, $m, $d) = explode('':'', substr($str,0,10)); list($h, $i, $s) = explode('':'', substr($str,-8)); $time = mktime( $h, $i, $s, $m, $d, $y) - (TZ*60*60); return date(get_settings("date_format") . '' '' . get_settings("time_format"), $time); } function convert_gps_geo($geo_from, $geo_to, $lon, $lat, $altitude=0) { global $geo_param; $llh_pattern = "/^(d+).(d+).(d+.d+)$/"; preg_match($llh_pattern, $lon, $match); $longitude = $match[1] + $match[2]/60 + $match[3]/3600; preg_match($llh_pattern, $lat, $match); $latitude = $match[1] + $match[2]/60 + $match[3]/3600; if(!isset($geo_param[$geo_from])) die("''geo_param[$geo_from]'' not supported"); if(!isset($geo_param[$geo_to])) die("''geo_param[$geo_to]'' not supported"); list($x,$y,$z) = ellipsoid_to_rectangular( $longitude, $latitude, $altitude, $geo_param[$geo_from][''a''], calc_eccentricity( $geo_param[$geo_from][''1/f''] ) ) ; list($longitude, $latitude, $altitude) = rectangular_to_ellipsoid( $x+$geo_param[$geo_to][dx], $y+$geo_param[$geo_to][dy], $z+$geo_param[$geo_to][dz], $geo_param[$geo_to][a], calc_eccentricity( $geo_param[$geo_to][''1/f''] ) ) ; $converted_lat = deg_to_dms( $latitude ) ; $converted_lon = deg_to_dms( $longitude ) ; return array($converted_lat, $converted_lon); } function calc_eccentricity($i_f) { $f = 1/$i_f ; return 2*$f-$f*$f ; } function ellipsoid_to_rectangular($l, $b, $h, $a, $ec) { global $rd; $b *= $rd ; $l *= $rd ; $sb = sin( $b ) ; $cb = cos( $b ) ; $cl = cos( $l ) ; $sl = sin( $l ) ; $k = $a/sqrt( 1 - $ec*$sb*$sb ) ; $x = ($k+$h) * $cb * $cl ; $y = ($k+$h) * $cb * $sl ; $z = ($k*(1-$ec)+$h) * $sb ; return array($x, $y, $z); } function rectangular_to_ellipsoid($x, $y, $z,$a, $ec) { global $rd; $sq = sqrt( 1-$ec ) ; $r1 = sqrt( $x*$x + $y*$y ) ; $s = atan2( $z, $r1*$sq ) ; $st = sin( $s ) ; $ct = cos( $s ) ; $b = atan2( $z + $ec*$a / $sq*$st*$st*$st, $r1 - $ec*$a*$ct*$ct*$ct ) ; $l = atan2( $y, $x ) ; $sb = sin( $b ) ; $rn = $a / sqrt( 1 - $ec*$sb*$sb ) ; $h = $r1/cos( $b ) - $rn ; return array($b/$rd, $l/$rd, $h) ; } function deg_to_dms($d) { $h = floor($d); $m = floor( (($d-$h)*60) % 60 ) ; $s = ($d-$h-$m/60)*3600; return sprintf("%d.%02d.%02.2f", $h,$m,$s) ; }</title>