MySQL5.6ã§æ°ãã追å ãããå°ç空éãã¼ã¿(GIS)ã®æ¤ç´¢ãå®è£ ãã¦ã¿ã
MySQL 5.6登場!!新機能速攻レビュー - 漢(オトコ)のコンピュータ道
ãè¦ã¦ããããMySQL5.6ã®æ°æ©è½ã®ï¼ã¤ã¨ãã¦ããããªç´¹ä»ãã
OpenGIS
ã¸ãªã¡ããªãã¼ã¿ã®æ¯è¼ã«ããã¦ãããã¾ã§ã¯MBRï¼minimum bounding rectangle â è¿ä¼¼çãªé·æ¹å½¢ï¼ã«åºã¥ããæ¯è¼ããåºæ¥ãªãã£ãã®ã ããã¸ãªã¡ããªã®æ£ç¢ºãªå½¢ã«åºã¥ããæ¯è¼ãã§ãããã¼ã¸ã§ã³ã®é¢æ°ã追å ããããä¾ãã°MBRãã¼ã¸ã§ã³ã®Contains()ã«å¯¾ãã¦ãST_Contains()ã¨ããããã«ãST_ã¨ãããã¬ãã£ãã¯ã¹ã®ã¤ãããã®ãæ£ç¢ºãªæ¯è¼ããããã¼ã¸ã§ã³ã¨ãªãã
ã¤ã¾ããï¼ç§ã使ã£ããã¨ããªãï¼postGISããããã使ããªãã¦ãã使ãæ
£ããMySQLã ãã§ããã®é¨åã®è¨é²ãæ¢ãããï¼ãã¨ããè¦æ±ã«ç°¡åã«çãããããã§ãããã£ããæ©è½ãä½ã£ã¦ã¿ã¾ããã
å®éã¯4/22ããæ¤è¨éå§ãã¦ãä»æ¥ãã£ã¨ãªãªã¼ã¹ã§ãã¾ããã
ç°¡åã«èª¬æããã¨ãã¯ãªãã¯ãã¦ç¯å²ãé¸ãã§ããè¨é²æ¤ç´¢ãã¢ã¤ã³ã³ãã¯ãªãã¯ããã°ããã®ç¯å²ãéãã«ã¼ãããã¹ã¦æ¤ç´¢ãããã¨ããæ©è½ã§ãã
ããã«ä»¥åããä½ãããã§ãããå
¨ã«ã¼ã表示ãæ©è½ãåããããã§ä½ã£ã¦ãã¾ãã
å ¨ä½ã§ããã¹ããã¨ï¼ç®æ¬¡ï¼
ç°¡åã«è¨ãã¨ã以ä¸ã®3ã¤ãããã°å®ç¾ã§ãã¾ãã
- MySQL5.6ãåããµã¼ããæºåãã
- GPXã®ãã©ãã¯ãã°ãMySQLã®ãã¼ã¿ã«å¤æãã¦ç»é²ãã
- GoogleMapä¸ããæ¤ç´¢ã§ããããã«ãã
ãããé çªã«èª¬æãã¦ããã¾ãã
1. MySQL5.6ãåããµã¼ããæºåãã
èªå®
ã«ããããã¯ã¢ãããµã¼ããéãã§ããç¶æ
ã ã£ãã®ã§ããã®ãµã¼ãä¸ã«ãã¼ã¿ãã¼ã¹ãã¤ã³ã¹ãã¼ã«ãã¾ãã
ä»åã¯ãCentOS5.5ã®ãµã¼ãä¸ã«ãMySQL5.6 + php + Apacheã®ç°å¢ãæ§ç¯ãã¾ããã
ã¾ããæ¢ã«ã¤ã³ã¹ãã¼ã«æ¸ã¿ã®ãã®ãããã°åé¤ãã¦ããã¾ããapacheã¯ãã®ã¾ã¾ä½¿ãã¾ããã
# yum remove mysql-server # yum remove mysql # yum remove php # yum remove php-cli
MySQL5.6のダウンロードサイトããLinuxã®RPMããã¦ã³ãã¼ããã¾ãã
ãã¡ã®ãµã¼ãã¯64bitçã®CentOSãªã®ã§ã該å½ããããã±ã¼ã¸ãé¸ã³ã¾ããã
- RPM Package Client Utilities (MySQL-client-5.6.2_m5-1.linux2.6.x86_64.rpm)
- RPM Package MySQL Server (MySQL-server-5.6.2_m5-1.linux2.6.x86_64.rpm)
- RPM Package Compatibility Libraries (MySQL-shared-5.6.2_m5-1.linux2.6.x86_64.rpm)
ã¤ã³ã¹ãã¼ã«ã¯rpmã³ãã³ãã§1çºã
# rpm -Uvh MySQL*
my.cnfãæºåãã¾ãããµã¼ãã¼ã¹ããã¯ãããã®ã§my-large.cnfãå©ç¨ãã¾ããã
# cp /usr/share/mysql/my-large.cnf /etc/my.cnf
ããã ãã§ãMySQLã«ã¯ã¢ã¯ã»ã¹ã§ããããã«ãªãã¾ãã
# mysql mysql> SET PASSWORD FOR root@localhost=PASSWORD('æ°ãããã¹ã¯ã¼ã'); mysql> exit # mysql -u root -p
ã¤ãã§ã«ãã¼ãã«ãä½ã£ã¦ãã¾ãã¾ãã
mysql> create database mytest; Query OK, 1 row affected (0.02 sec) mysql> use mytest Database changed mysql> create table geom_test ( -> id int(10) unsigned, -> g multilinestring NOT NULL, -> primary key (id), -> spatial key (g) -> ) ENGINE=MYISAM; Query OK, 0 rows affected (0.11 sec) mysql> describe geom_test; +---------+------------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +---------+------------------+------+-----+---------+-------+ | id | int(10) unsigned | NO | PRI | 0 | | | g | multilinestring | NO | MUL | NULL | | +---------+------------------+------+-----+---------+-------+ 2 rows in set (0.00 sec)
GEOMETRYåã使ãã«ã¯MYISAMãENGINEã¨ããå¿
è¦ããããGPSã®ãã©ãã¯ãã°ã¯è¤æ°ã®ç·ã®çµã¿åãããªã®ã§multilinestringåã使ãã¾ããã
ãã¼ã¿ã¯å
¥ãã¦ãã¾ããããããã§ã¨ãããããã¼ãã«ã¯ã§ãã¾ããã
次ã¯PHPã®ã¤ã³ã¹ãã¼ã«ã§ãã
PHPã¯yumã§ã¤ã³ã¹ãã¼ã«ãããã¨ããã¨ãphp-mysqlã®ã¤ã³ã¹ãã¼ã«ã§ã¨ã©ã¼ã«ãªããããã½ã¼ã¹ããã³ã³ãã¤ã«ãã¾ããã
makeã®éä¸ã§ã³ã±ãã®ã§ãäºåã«ä¸è¨ã®2ã¤ãå ¥ãã¦ããã¾ããã
# yum install httpd-devel # yum install libxml2-devel
ã¾ãPHPのサイトããphp5.3.6.tar.gzããã¦ã³ãã¼ããã¾ãã
configureã®ãªãã·ã§ã³ã¯ããããå ¥ããªãã¨ãããªãã®ã§ãããä»åã¯ä¸è¨ã§ä½ãã¾ããã
# tar xvfz php-5.3.6.tgz # cd php-5.3.6 # ./configure \ --with-mysql=mysqlnd \ --with-mysqli=mysqlnd \ --with-pdo-mysql=mysqlnd \ --with-apxs2=/usr/sbin/apxs \ --enable-mbstring \ --enable-mbregex \ --enable-zend-multibyte \ --with-zlib \ --with-libxml-dir=/usr \ --enable-xml # make # make test # make install
# php --version PHP 5.3.6 (cli) (built: May 6 2011 00:30:41) Copyright (c) 1997-2011 The PHP Group Zend Engine v2.3.0, Copyright (c) 1998-2011 Zend Technologies
ããã§ãã¡ãã¨å ¥ã£ãããã§ãã
ä¸è¨ã®ã³ã¼ããä½ã£ã¦ã³ãã³ãã©ã¤ã³å®è¡ãã¦ãã¨ã©ã¼ãã§ãªãã®ã§ã¨ããããOK.
<?php $db1 = mysql_connect("localhost","root","pass") or die("Could not connect database"); mysql_select_db("mytest",$db1) or die("Could not connect database");
2. GPXã®ãã©ãã¯ãã°ãMySQLã®ãã¼ã¿ã«å¤æãã¦ç»é²ãã
GPX(XMLå½¢å¼)ã®ãã¡ã¤ã«ãèªã¿è¾¼ãã§ãlatitude, longitudeã«è©²å½ããç®æãæãåºããMULTILINESTRINGã¨ãã¦æ ¼ç´ãã¾ãã説æã¯çç¥ãã¾ããããã®ä»£ããã«ç°¡ç¥åããã¹ã¯ãªããã®ã½ã¼ã¹ãè²¼ãä»ãã¦ããã¾ãã
<?php // Geometryæ¤ç´¢ã®ããã«ã«ã¼ãæ å ±ãDBã«æ ¼ç´ããããã°ã©ã ã // $db1ãè¨é²ä¸è¦§ããããµã¼ã // $db2ãä»åç«ã¡ä¸ãããµã¼ã $db1 = mysql_connect("server1_IP","user","pass") or die("Could not connect database"); mysql_select_db("mytest",$db1) or die("Could not connect database"); $db2 = mysql_connect("server2_IP","user","pass") or die("Could not connect database"); mysql_select_db("mytest",$db2) or die("Could not connect database"); date_default_timezone_set("Asia/Tokyo"); // è¨é²ã®IDãåå¾ãã¦ãGPXãã¡ã¤ã«ã1ã¤ãã¤æ ¼ç´ããã $sql = "SELECT id FROM record_data"; $result = mysql_query($sql,$db1) or die('Query failed:'.$sql); while ($dbdat = mysql_fetch_array($result, MYSQL_ASSOC)){ insert_trkdata($dbdat['id']); } // --------------------------------------------------------------------------------------- // functions // --------------------------------------------------------------------------------------- function insert_trkdata($id){ global $db1,$db2; $mls=""; // IDãã¨ã«ãã£ã¬ã¯ããªãåã£ã¦ããããã®ä¸ã«ãã°ãã¡ã¤ã«ãæ ¼ç´ããã¦ããåæã $uploaddir = '/path-to-gpx/'.$id; if(is_file($uploaddir . '/track.gpx')){ $xml = simplexml_load_file($uploaddir . '/track.gpx'); $i=0; $init=1; foreach($xml->trk as $trk) { $j=0; $mlstmp=""; foreach($trk->trkseg->trkpt as $trkpt) { if($j>0){ $mlstmp.=","; } $mlstmp.=floatval($trkpt->attributes()->lon)." ".floatval($trkpt->attributes()->lat); $j++; } if($j>=2){ if($init == 0){ $mls.=","; } $mls.="(".$mlstmp.")"; $init = 0; } $i++; } $xml=null; }else{ echo "cannot find file:".$id."\n"; return; } if(empty($mls)){ echo "error: no trakdata:".$id."\n"; return; } // DBæ ¼ç´ $sql = "INSERT INTO geom_test (id, g) VALUES ( '".$id."', GeomFromText('MultiLineString(".$mls.")') )"; $result = mysql_query($sql,$db2) or die('Query failed:'.$sql); } mysql_close($db1); mysql_close($db2);
3. GoogleMapä¸ããæ¤ç´¢ã§ããããã«ãã
ãµã¼ãå´ã«å¯¾ãã¦ãçµåº¦ã»ç·¯åº¦ã§æå®ãããã©ã¡ã¼ã¿ã渡ãã¨ããã®ç¯å²ã®ãã¼ã¿ãæ¤ç´¢ãã¦ä¸è¦§è¡¨ç¤ºããã¾ãã
æ¤ç´¢ã¯multilinestringï¼GPSãã°ï¼ã¨polygonï¼æ¤ç´¢ç¯å²ï¼ã®éãªããã¹ã¦ã®ãã¼ã¿ã«ãªãã¾ãã
æ¤ç´¢ç¨ã®ã¡ã½ããã¯ãããããããEqual, Disjoint, Intersects, Touch, Overlap, Cross, Within, Containsãªã©ãããããã§ãã
こちらのサイトã§ããããã®é¢ä¿ã詳ãã説æãã¦ããã¦ãã¾ããä»åã¯éãªããã®ãªãä½ã§ãã²ã£ããããã®ã§ãIntersectsã使ãã°ããããã§ãã
æåã®å¼ç¨å ã«ãæ¸ãã¦ããã¾ããããST_ãä»ããã¨æ£ç¢ºãªæ¯è¼ããã¦ããã¾ããMySQL5.6のマニュアルã«ãè¨è¼ãã¦ããã¾ãã
Note
MySQL originally implemented these functions such that they used object bounding rectangles and returned the same result as the corresponding MBR-based functions. As of MySQL 5.6.1, corresponding versions are available that use precise object shapes. These versions are named with an ST_ prefix. For example, Contains() uses object bounding rectangles, whereas ST_Contains() uses object shapes.As of MySQL 5.6.1, there are also ST_ aliases for existing spatial functions that were already exact. For example, ST_IsEmpty() is an alias for IsEmpty()
ä¸è¨ãè¦ãéãã"ST_"ãä»ããªãã¦ãããããã§ããã念ã®ããä»ãã¦ããã¾ãã
ã¡ãªã¿ã«ãCentOS5.5ã«ã¤ã³ã¹ãã¼ã«ããã¦ããMySQL5.0のマニュアルãè¦ãã¨ãMBRãã¼ã¹ã®è¿ä¼¼æ¤ç´¢ããã§ããªããã¨ãæè¨ããã¦ãã¾ãã
Note
Currently, MySQL does not implement these functions according to the specification. Those that are implemented return the same result as the corresponding MBR-based functions.
å®éã®ãµã¼ãå´ããã°ã©ã ã¯PHPã§ä½ãã¾ããã
ç°¡ç¥åãã¦ãã¤ã³ãã ãæãåºãã¨ãä¾ãã°ãããªæãã§ä½ãã¾ãã
<?php $lat1=floatval($_GET['lat1']); $lon1=floatval($_GET['lon1']); $lat2=floatval($_GET['lat2']); $lon2=floatval($_GET['lon2']); $db2 = mysql_connect("server2_IP","user","pass") or die(json_encode(array())); mysql_select_db("mytest",$db2) or die(json_encode(array())); $query = "SELECT id from geom_test ". "WHERE ST_Intersects(GeomFromText('Polygon((". $lon1." ".$lat1.", ". $lon1." ".$lat2.", ". $lon2." ".$lat2.", ". $lon2." ".$lat1.", ". $lon1." ".$lat1." ". "))'), g)"; $result = mysql_query($query,$db2) or die(json_encode(array())); $idlist=array(); while ($dbdat = mysql_fetch_array($result, MYSQL_ASSOC)){ $idlist[]=$dbdat['id']; } mysql_close($db2);
å®éã¯ãã®IDããè¨é²ã®ã¿ã¤ãã«ãåçãªã©ãå¼ã£å¼µã£ã¦ãjsonå½¢å¼ã§å¿çããã¾ãã
æå¾ã«Google Maps APIã§Polygonãæ¸ãã¦ããè¨é²æ¤ç´¢ããã¿ã³ãæ¼ãã¨çµæã表示ãããããã«ããã°å®äºããããã¢ããã§æ¤ç´¢çµæã表示ãããããã«ãjQueryï¼Interface elementsãå©ç¨ãã¾ããã
å ¨ã«ã¼ã表示ã®æ©è½ã¯ã1000以上のルートを、ユーザごとの地図に投影する方法ãGoogle Maps API v3対å¿ã®ã½ã¼ã¹ã«å¤æ´ãã¦å®ç¾ãã¦ãã¾ãã
詳ããã¯実装したページã®ã½ã¼ã¹ã³ã¼ããã®ããã¦ã¿ã¦ãã ããï¼ã¨ããã説æã大å¤ãªã®ã§ããµãã£ã¦ãã ãã§ããã»ã»ã»ï¼
æå¾ã«
å®éã«åããã¦ã¿ãã¨ããã6ä¸ã®GPSãã©ãã¯ãã¼ã¿ã«å¯¾ãã¦æ¤ç´¢ãã¦ããããã«å¿çãè¿ã£ã¦ãã¾ãã
å¯å£«å±±ã丹沢ãããã®äººæ°ã®ããã¨ãªã¢ãæ¤ç´¢ããã¨ãæåã¯å°ãéãå¿çã«æéããããã¾ããããããããã°ããããã¨ã¡ã¢ãªãã£ãã·ã¥ã«è¼ã£ãã®ããæ¤ç´¢ãããã¦ãHDDã¢ã¯ã»ã¹ãããªãå³åº§ã«å¿çãè¿ãã¾ãã
èªåã®æ¥æ大工çãªããã°ã©ãã³ã°ã§ã¯ãããã¾ã§é«éãªæ¤ç´¢ã¯ã§ãã¾ããã
æåã¯ãåè§ã¨ç·ã交差ãããã©ãããã©ãå¤å®ããã®ãï¼ããèãå§ãããã¨ãã¦ãã¾ããããããããã¹ã¿ã¼ãããã¨æ§è½ã¯åºãªããä½ãã®ã大å¤ã§ãããããMySQLãæ´»ç¨ããã ãã§ãããªã«ç°¡åï¼é«éã«å®ç¾ã§ãã¾ãã
ãããªç´ æ´ãããæ©è½ãä½ã£ã¦ããã ããMySQLã®ãããããã¼ã®æ¹ã ã«æè¬ãã¾ãã