まいける's Tech Blog

LAMP関係のメモなどを不定期に掲載します

Google Maps API v3 で全てのマーカーが表示されるようにズームレベルを調整する方法

 v2 では、 getBoundsZoomLevel を使えばよかったのですが、v3 ではなくなってしまいました。仕方がないので、この機能を使う部分だけは v2 のままでいたのですが、いつの間にか代替機能が追加されていました(この機能に気づく前に、Google Maps API V3ではgetBoundsZoomLevelが使えないを参考に v3 対応させたのですが、以下で紹介する方法のほうが通常は簡単)。
 XMLからのデータ読み込みと併せてご紹介します。

 マーカーの XML は、こんな感じで準備しておきます。

<?xml version="1.0" encoding="UTF-8"?>
<markers>
  <marker name="マーカーA" lat="34.6981457" lon="135.5071395"/>
  <marker name="マーカーB" lat="34.6980680" lon="135.5070339"/>
  <marker name="マーカーC" lat="34.6980624" lon="135.5072978"/>
  <marker name="マーカーD" lat="34.6980652" lon="135.5073006"/>
</markers>

 また、このスクリプトでは、北東端と南西端が必要になるので、取得しておきます。データベースに位置情報が入っている場合は、MAX と MIN で取得できると思います。

 で、 javascript のほうですが

<script type="text/javascript" charset="utf8" src="https://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js"></script>
<script type="text/javascript" src="https://maps-api-ssl.google.com/maps/api/js?v=3&sensor=false&language=ja"></script>

<script type="text/javascript">
function initialize() {
    var myLatlng = new google.maps.LatLng(34.6980596, 135.5073700);

    var myOptions = {
      zoom: 18,
      center: myLatlng,
      mapTypeId: google.maps.MapTypeId.ROADMAP
    }
    var map = new google.maps.Map(document.getElementById("map_canvas"), myOptions);

    var latlng_ne = new google.maps.LatLng(34.6981457, 135.5073006);
    var latlng_sw = new google.maps.LatLng(34.6980624, 135.5070339);
    var bounds = new google.maps.LatLngBounds(latlng_sw, latlng_ne);
    
    map.fitBounds(bounds);

    // For more information on doing XMLHR with jQuery, see these resources:
    // http://net.tutsplus.com/tutorials/javascript-ajax/use-jquery-to-retrieve-data-from-an-xml-file/
    // http://marcgrabanski.com/article/jquery-makes-parsing-xml-easy
    jQuery.get("XMLファイルのURL", {}, function(data) {
      jQuery(data).find("marker").each(function() {
        var marker = jQuery(this);
        var latlng = new google.maps.LatLng(parseFloat(marker.attr("lat")),
                                    parseFloat(marker.attr("lon")));
        var lo_name = marker.attr("name");
        var marker = new google.maps.Marker({title:  name, position: latlng, map: map});
     });
    });
  }
</script>

 後半は、Google Maps API のサンプルを参考にしています(要:jQuery)。実際に使っているスクリプトを少しいじっているので、やや心配ですが、たぶん動くはずです…。

PHP で PDF のサムネイル画像を作成する

 必要に迫られたので、ちょっと調べてみたところ、意外に簡単。前提として、imagick モジュールが必要となるので、このあたりを見ながらインストールを済ませておいてください。

 それで、その方法ですが

<?php

// 読み込む PDF をフルパスで指定
$file = '/foo/bar/test.pdf';

// サムネイルを作成するページを指定
$page = 1;

// 実際の指定では、1ページが0になるので、調整
$page = $page - 1;

$im = new imagick($file[$page]);
 
// PNG 形式に変換
$im->setImageFormat("png");

// 長辺が 300 ピクセルになるようにリサイズ
$im->thumbnailImage(300, 300, true);

// 表示
header("Content-Type: image/png");
echo $im;

?>

こんな感じです。このままだと、1つのファイルしか読めないので、実際には引数を与えて読み込むファイルを指定して使う感じになると思います。

意図したエントリー以外にトラックバックが投げられてしまう問題を解決する

 MTで、トラックバックURLで指定されている記事番号(例:1234)にトラックバックを投げているにもかかわらず、別の記事(例:1235)にトラックバックが登録されてしまう場合、mt_trackback テーブルの trackback_id と trackback_entry_id が整合していない可能性があります。
 こんなことはそうそう起こるものではないのですが、はまりかけたので備忘録として残しておきます。

 この場合、trackback_entry_id が mt_entry テーブルの entry_id と紐づいているので、trackback_id に trackback_entry_id を合わそうとすると、修正箇所が多くて大変です。なので、trackback_entry_id に trackback_id を合わせることにします。この場合の問題点は、trackback_id が PRIMARY KEY になっていることと、auto_increment が付いていること。PRIMARY KEY は重複を許さないので、trackback_id と trackback_entry_id のズレがわずかな場合、単に

UPDATE mt_trackback SET trackback_id = trackback_entry_id;

を実行すると、エラーになります。そこで、

UPDATE mt_trackback SET trackback_id = trackback_entry_id + 20000;
UPDATE mt_trackback SET trackback_id = trackback_entry_id;

のように、いったん重複しない値に変更した上で、本来の値に書き換える必要があります。また、この作業を行っただけだと、auto_increment によって、trackback_id に次に付けられる値は変更されないので、再びずれてしまいます。そこで、

ALTER TABLE mt_trackback AUTO_INCREMENT = 1235;

のように、trackback_entry_id の最大値+1の数字を設定してあげることで、上記の問題を解消する必要があります。

 以上、備忘録でした。

 最後に少し宣伝を。Amazon の書籍・雑誌の詳細ページから楽天ブックスの同じ商品のページに飛ばすブックマークレットや、Amazon の価格よりも安い楽天のショップを探すブックマークレットを公開しています。たまったポイントの利用などで楽天を使いたい人には便利だと思いますので、よろしければご利用ください。
http://tools.trend-antenna.com/