位置情報サービスのはじめ方

第5回位置情報を保存しよう(前編)


2Datastore[1]

[1]MySQL
 



緯度-90~90
経度-180~180


 
latitude     decimal(7,4)
longitude  decimal(7,4)  

decimal(7,4)1074


Geometry


Geometry

Geometry22

spot_id
 
CREATE TABLE spot (
 spot_id INT NOT NULL,
 latlon GEOMETRY NOT NULL,
 PRIMARY KEY (spot_id),
 SPATIAL KEY (latlon)
) Engine=InnoDB;

CREATEEngine=MyISAMGeometrySPATIALINDEXMyISAM[2]

[2]InnoDBGeometryMySQL5.0.16SPATIAL INDEXMyISAM

SPATIAL INDEXIndexSQL

Geometry


GeometrySQL
 
INSERT INTO spot (spot_id , latlon ) VALUES (1, GeomFromText('POINT(137.10 35.20)'));

GeomFromTextMySQLGeometryPOINT( ),()

Geometry


SQLselect
 
> select * from spot2;
+---------+---------------------------+
| spot_id | latlon                    |
+---------+---------------------------+
|       1 |        33333#a@??????A@ |
+---------+---------------------------+
1 row in set (0.00 sec)

latlonGeometry使
 
select spot_id, X(latlon), Y(latlon), ASTEXT(latlon) from spot;
+---------+-----------+-----------+-------------------+
| spot_id | X(latlon) | Y(latlon) | ASTEXT(latlon)    |
+---------+-----------+-----------+-------------------+
|       1 |     137.1 |      35.2 | POINT(137.1 35.2) |
+---------+-----------+-----------+-------------------+
1 row in set (0.00 sec)

XYASTEXTXYASTEXT


(35.00 , 135.00)  (36.00 , 138.00)2
 
> select spot_id, ASTEXT(latlon) from spot where MBRContains(GeomFromText('LINESTRING(138.00 36.00, 135.00 35.00)'), latlon);
+---------+-------------------+
| spot_id | ASTEXT(latlon)    |
+---------+-------------------+
|       1 | POINT(137.1 35.2) |
+---------+-------------------+
1 row in set (0.00 sec)

where


LINESTRING(138.00 36.00, 135.00 35.00)

(35.00 , 135.00)  (36.00 , 138.00)2POINT( )LINESTRING(A A, B B)

GeomFromText(A)

LINESTRINGGeometry

MBRContains(A B)

ABSQLALINESTRINGBgeometrylatlonA

 
1 
画像
 

42

GeometryPOINT


GeometryPOINTLINESTRINGPOLYGONgeo
 
CREATE TABLE geo (
 geo_id INT NOT NULL,
 name VARCHAR(255) NOT NULL,
 geo GEOMETRY NOT NULL,
 PRIMARY KEY (geo_id),
 SPATIAL KEY (geo)
)ENGINE=MyISAM;

SQL
 
INSERT INTO geo (geo_id , name, geo) values (1, 'はてな京都本社', geomFromText('POINT(135.761919 35.011141)'));
INSERT INTO geo (geo_id , name , geo) values (2, '地下鉄烏丸御池', geomFromText('POINT(135.759666 35.010745)'));
INSERT INTO geo (geo_id , name , geo) values (3, '東洞院通り上る', geomFromText('LINESTRING(135.761050 35.012165,135.761050 35.011040)'));
INSERT INTO geo (geo_id , name , geo) values (4, 'ハートンホテル', polygonFromText('POLYGON((135.760497 35.012033,135.760497 35.011655, 135.760970 35.011655, 135.760970 35.012033,135.760497 35.012033))'));

4Geo12POINT32LINESTRING44POLYGON


 
2 
画像
 

GeoA(35.011769,135.760009)B(35.010851, 135.762439)
 
> select geo_id, name, ASTEXT(geo) from geo where MBRContains(GeomFromText('LineString(135.760009 35.011769, 135.762439 35.010851)'), geo);
+--------+-----------------------+-----------------------------+
| geo_id | name                  | ASTEXT(geo)                 |
+--------+-----------------------+-----------------------------+
|      1 | はてな京都本社 | POINT(135.761919 35.011141) |
+--------+-----------------------+-----------------------------+
1 row in set (0.01 sec)

geo_id1
3 
画像
 

Geo

MBRContainsMBRIntersects
 
> select geo_id, name,  ASTEXT(geo) from geo where MBRIntersects(GeomFromText('LineString(135.760009 35.011769, 135.762439 35.010851)'), geo);
+--------+-----------------------+-------------------------------------------------------------------------------------------------------------------+
| geo_id | name                  | ASTEXT(geo)                                                                                                       |
+--------+-----------------------+-------------------------------------------------------------------------------------------------------------------+
|      1 | はてな京都本社 | POINT(135.761919 35.011141)                                                                                       |
|      3 | 東洞院通り上る | LINESTRING(135.76105 35.012165,135.76105 35.01104)                                                                |
|      4 | ハートンホテル | POLYGON((135.760497 35.012033,135.760497 35.011655,135.76097 35.011655,135.76097 35.012033,135.760497 35.012033)) |
+--------+-----------------------+-------------------------------------------------------------------------------------------------------------------+
3 rows in set (0.00 sec)

Geo
4 
画像
 
> select geo_id, ASTEXT(geo) from geo where MBRContains(GeomFromText('LineString(135.760009 35.012279, 135.762439 35.010851)'), geo);
+--------+-------------------------------------------------------------------------------------------------------------------+
| geo_id | ASTEXT(geo)                                                                                                       |
+--------+-------------------------------------------------------------------------------------------------------------------+
|      1 | POINT(135.761919 35.011141)                                                                                       |
|      3 | LINESTRING(135.76105 35.012165,135.76105 35.01104)                                                                |
|      4 | POLYGON((135.760497 35.012033,135.760497 35.011655,135.76097 35.011655,135.76097 35.012033,135.760497 35.012033)) |
+--------+-------------------------------------------------------------------------------------------------------------------+
3 rows in set (0.00 sec)

2LINESTRINGPOLYGONPOLYGON

Geometry便POINTPOLYGON

> InnoDBSPATIAL INDEX


DB

Geohash
 

おすすめ記事

記事・ニュース一覧