カテゴリー: PHP

CakePHP2でMySQLのGeometry型を扱う

CakePHPでGeometry型を用いた
位置情報に基づいた検索を行う方法です

大事なこと

最初に言っておきます

CakePHPはGeometry型を用いた取得
には標準では、対応してません

なので取得保存にはちょっと
手順を踏まないといけないです

その前に

詳しくGeometry型について知りたい人は
以下から確認してください
[http://dev.mysql.com/doc/refman/5.6/ja/gis-class-geometry.html](MySQL :: MySQL 5.6 リファレンスマニュアル :: 11.5.2.2 Geometry クラス)

やってみた

データベース

まずデータベースとテーブルを用意しましょう
SQLはこんな感じです

CREATE DATABASE hoge;

USE hoge;

CREATE TABLE IF NOT EXISTS `geometries` (
    `id` int(11) NOT NULL,
    `hoge_id` int(11) NOT NULL,
    `latlng` geometry NOT NULL,
    `created` datetime NOT NULL,
    `modified` datetime NOT NULL
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;

モデル

次にモデルを用意

ここで保存した際にGeometry型に変換されるように
beforeSaveの所に記述する

virtualFieldも用意しておきましょう
そうするとあとで楽なので

<?php class Geometry extends AppModel {

    function beforeSave() {
        $lat = $this->data['Geometry']['lat'];
        $lng = $this->data['Geometry']['lng'];

        $latlng = $this->query("SELECT GeomFromText('POINT($lng $lat)') as latlng");
        $this->data['Geometry']['latlng'] =     $latlng[0][0]['latlng'];

        return true;
    }

    var $virtualFields = array(
        'latitude' => X(latlag),
        'longitude' => Y(latlng)
    );

}

コントローラー

次にコントローラーでデータを取り出す方法
最初にも書いたとおりいつも通りのCakeの書き方じゃ取り出せ無いです。

でも基本は同じなのでいつもどおり書けばOKです

<?php class Geometries extends AppController {
    public function get_geo() {
        $geo = $this->Geometory->find(
            'all',
            array(
                'fields' => array(
                   // ここを変える
                ),
                'order' => array(
                    'let' => 'ASC'
                ),
            )
        );
    }
}

気をつけて欲しいのがfieldsのところに条件を与えることです
検索条件だからconditionsのところに条件を与えるとハマります

与えられた位置情報から近い順に情報を取得する場合は
こんなかんじに書きます

 GLength(GeomFromText(CONCAT('LineString(".経度." ".緯度.",', X(latlng), ' ', Y(latlng),')'))) AS let

ここの部分を変えれば2点間の距離を求めたり4点の位置に含まれる情報を取得することが出来ます

PHPでブラウザ・デバイス判定をする

ブラウザとデバイス判定する必要があったため
PHPでブラウザ・デバイス判定するコードを書いてみました。 

使用している関数などは公式ドキュメント PHP.net  を参考にしてください

実行環境は PHP 5.5.6 です
対応確認済みブラウザは

  • Internet Explorer  ~11
  • Google chrome  ~ 34
  • Firefox ~ 30
  • Opera ~ 22
  • Safari ~ 7.0
  • Sleipnir ~ 7
  • Konqueror
  • Dreampassport
  • BTRON
  • iCab
  • OmniWeb
  • Netscape

の12種類

対応確認済みデバイスは

  • iPod
  • iPhone
  • iPad
  • Andriod
  • Windows Phone
  • Blackberry
  • Linux
  • Mac
  • Windows

の9種類です

 ソースは以下URLにあります

mziyut/BrowserAgent · GitHub

CakePHP2.xの導入 (その1)

思えばCakePHPの導入について全く触れていなかったので

CakePHPの導入について少し触れたいと思います。

※ Windowsの人はコマンドプロンプトからGitコマンドが使えないので

最初にDownloads – msysgit – Git for Windows – Google Project Hostingから

最新版(2014/03/31現在)Git-1.9.0-preview20140217.exe をインストールしておいてください。

※ LinuxでGit入れてない人はインストールしてください

RedHat系

yum install git-core

Debian系

apt-get install git

※ ここで言うLinuxはRedHat系ですDebian系の人はごめんなさい時間があったらまた追記します

まず、ドキュメントルートに移動します

Linux Apacheユーザー

cd /var/www/html

Mac MAMPユーザー

cd /Application/MAMP/htdocs

Mac XAMPPユーザー

cd /Application/XAMPP/htdocs

Windows XAMPPユーザー

cd /d C:
cd xampphtdocs

次に、CakePHPのダウンロード

terminal or cmd

git clone https://github.com/cakephp/cakephp.git

実行結果

Cloning into 'cakephp'...
remote: Reusing existing pack: 214254, done.
remote: Counting objects: 20475, done.
remote: Compressing objects: 100% (6952/6952), done.
remote: Total 234729 (delta 15191), reused 18065 (delta 13385)
Receiving objects: 100% (234729/234729), 49.71 MiB | 2.10 MiB/s, done.
Resolving deltas: 100% (171086/171086), done.
Checking connectivity... done.

ダウンロード出来なかった人とかはDownload Zipからダウンロードしてドキュメントルートにおいてもいいよ

ついでに開発に便利なDebugKitもダウンロード

Linux Mac

cd cakephp/app/Plugin/
git clone https://github.com/cakephp/debug_kit.git

Windows

cd cakephpappPlugin
git clone https://github.com/cakephp/debug_kit.git

実行結果

Cloning into 'debug_kit'...
remote: Reusing existing pack: 5775, done.
remote: Total 5775 (delta 0), reused 0 (delta 0)
Receiving objects: 100% (5775/5775), 1.44 MiB | 450.00 KiB/s, done.
Resolving deltas: 100% (2360/2360), done.
Checking connectivity... done.

ダウンロード出来なかった人とかはDownload Zipからダウンロードして cakephp/app/Plugin において

ダウンロードしたDebugKitをリネーム

Linux Mac Windows

mv debug_kit DebugKit
cd ../../

とりあえず今回はここまで

次回 CakePHP2.xの導入(その2)に続きます