際際滷

際際滷Share a Scribd company logo
GRASS〜SQLiteでベクタをQってみる
臼今祇寄僥 寄僥垪h廠親僥垪 牽弥 匯席
2014/06/27
FOSS4G 2014 Hokkaido
暴
寄僥垪伏です。
バイオマスY坿の蛍下楚の篇吉をやっています。
FOSS4Gを岑らない...
?GISは互~でyしい と房ってました。
スキャンした仇蹐鯔の仇蹐勃悗佑燭ぃ
?お}かきソフトでなんちゃってラ採a屎 みたいなことをして埣に秘ってました
ふとしたきっかけでQGISを岑る
?Georeferencerにn弔鯤椶韻泙靴拭
?まだ晩云Z晒のHに蒙歩なh廠O協をしなければならない´
FOSS4G HKD 2012に歌紗
?その瘁、GRASS GISを聞ってエネルギ`の麻などやりました。
?晩符楚r.sun
弌邦薦kのm仇篇r.watershed etc.
書
?GRASSでベクタネットワ`ク盾裂などをやっています。
GRASS GIS
?N?のラスタ盾裂ベクタ盾裂ツ`ルが聞える ┘戰タの古廷はちょっと鏡蒙
?恙墨?I囃のO協あたりを\り埆えるとすごく宴旋
?QGISのGRASSプラグインプロセシングからも旋喘できる。┐燭世C嬬浙┌
?翌何から岷俊モジュ`ルを初したI尖が佩える。Pythonで
?たまに卦並をしなくなる。┫鶺屬呂海舛蕕い
http://grass.osgeo.org/
grass: db/drivers Directory Reference http://fossies.org/dox/grass-6.4.3/dir_ef3632b5d5f243c151344966da52edc4.html
$ GRASSは光Nのデ`タベ`スと俊Aすることができます。
SQLite
?オ`プンソ`スのRDBMS┘螢讒`ショナルデ`タベ`スマネジメントシステム
?SQL┘禰`タベ`ス冱Zが聞える
?デ`タベ`スの云悶がg匯の鏡羨したファイル
?頼畠にロ`カルで嘛するので、サ`バ`のO協が勣らない。 ?お返X
こんなアプリケ`ションでも聞われています。
http://www.sqlite.org/
こんなh廠でやってます。
ラスタモジュ`ル
?
?
?
ベクタモジュ`ル
デ`タベ`スモジュ`ル
デ`タのxk?渇竃
デ`タの厚仟
デ`タの携
db.connect
v.db.connect
v.db.addcol
v.db.renamecol
v.db.dropcol
etc.
ベクタデ`タ
ESRI SHAPE
SQLite(SpatiaLite)
etc.
v.in.ogr db.in.ogr
バッチI尖には
import grass.script as grass
grass.run_command()
grass.parse_command()
grass.write_command()
import sqlite3
sqlite3.connect()
db.execute()
cursor.execute()
SELECT FROM
UPDATE SET
INSERT INTO
(db.*, v.db.*)
(v.*)
(r.*)
?
?
?
燕デ`タ
csv
テ`ブルの砿尖、SQLによる荷恬は砿尖ソフト
SQLiteSpyを聞ってます。
GRASS
Database
Location Mapset Geometry & attribute data
/grassdata /HKD_J2K
/HKD_TKY
/HKD_J2Ku54
/sapporo
/PERMANENT
/map_1
/map_2
/cats
/cell
/cellhd
/cell_misc
/colr
/fcell
/hist
/vector
/dbf
/landuse
/cityborder
/ncensus
coor
dbin
hist
sidx
topo
?
?
?
/landuse.dbf
/cityborder.dbf
/ncensus.dbf
?
?
?
RASTER
VECTOR
こんなファイル夛になっています。
こんなファイル夛になっています。
GRASS
Database
Location Mapset Geometry & attribute data
/grassdata /HKD_J2K
/HKD_TKY
/HKD_J2Ku54
/sapporo
/PERMANENT
/map_1
/map_2
/cats
/cell
/cellhd
/cell_misc
/colr
/fcell
/hist
/vector /landuse
/cityborder
/ncensus
coor
dbin
hist
sidx
topo
?
?
?
RASTER
VECTOR
/sqlite.db landuse
cityborder
ncensus
?
?
? SQLite
GRASSをSQLiteと俊Aする
GRASS 6.4.3 (HKD_J2K)> db.connect Cp
driver:dbf
database:'$GISDBASE/$LOCATION_NAME/$MAPSET/dbf/'
schema:
group:
> db.connect driver=sqlite database=$GISDBASE/$LOCATION_NAME/$MAPSET/sqlite.db
driver:sqlite
database:$GISDBASE/$LOCATION_NAME/$MAPSET/sqlite.db
schema:
group:
しくはこちら。GRASS-SQLite driver http://grass.osgeo.org/grass64/manuals/grass-sqlite.html
http://grass.osgeo.org/grass64/manuals/db.connect.html
デ`タベ`スファイルsqlite.db ?ベクタデ`タを伏撹したHに徭啜弔防撹されます
$GRASSを羨ち貧げて、db.connect コマンドで俊Aします。
?GRASS6のデフォルトデ`タベ`スはDBASE.dbfです。
?databaseのパスはロ`カルのどこでも措いですが、和がデフォルトです。
デフォルトフォルダ$GISDBASE/$LOCATION_NAME/$MAPSET/sqlite.db
┐舛覆澆法v.db.connect コマンドを聞えば、レイヤごとにe?のデ`タベ`スファイルを峺協することもできます。
F壓のコネクションを燕幣
テ`ブルの荷恬
荷恬 GRASS SQLite
双の弖紗 v.db.addcol ALTER TABLE ´ ADD COLUMN´
双兆の筝 v.db.renamecol 掲*
双の茅 db.dropcol / v.db.dropcol 掲*
テ`ブル兆の筝 g.rename ALTER TABLE ´ RENAME TO ´
テ`ブルの茅 g.remove DROP TABLE ´
*やろうと房えばできる仟テ`ブル恬撹?デ`タのコピ`?圷テ`ブル茅?テ`ブル兆の筝
テ`ブルの荷恬は、GRASSコマンドとSQLiteSQL猟のどちらからでもできます。
双兆の筝と双の茅はSQLiteでサポ`トしていないので、採かと宴旋です。
リファレンスにもいてあります。
db.dropcol is a front-end to db.execute to allow easier usage
with a special workaround for the SQLite driver to support column drop.
http://grass.osgeo.org/grass64/manuals/db.dropcol.html
GRASSでQう貧で、レイヤ兆┘透`ブル兆や双兆の崙泙いくつかあります。
?磯叔哂方忖とアンダ`バ`のみサポ`ト
?恷兜の猟忖はアルファベット
?レイヤ兆の忖方は、198猟忖までは寄嬋健でした。
?SQLの猟で聞喘するZ鞘は聞喘できません。 箭SELECT
?双兆には寄猟忖と弌猟忖の曝eがありません。NAME=name
SQLiteの侏
デ`タ侏 N GRASSの侏
NULL 腎猟忖 null
INTGER 屁方8゛64ビット integer
REAL 検嗤(泣方64ビット double precision
TEXT テキスト侏UTF-8 / UTF-16BE / UTF-16LE varchar(n)
BLOB バイナリ侏 -
侏の兆念は、匯違議な兆各なら尖盾してくれます。 INT, FLOAT, DOUBLE, VARCHAR etc.
...侏の協xはGRASSに栽わせるのが耳です。
SQLiteに鯉{される、離禰`タ侏は5N。
なお、BLOB侏はGRASS GISでQえないので、
この侏の双を根むテ`ブルをGRASSで荷恬するとエラ`が竃ます。
GRASS 6.4.3 (HKD_J2K)> v.db.renamecol map=hoge column=old_column,new_column
WARNING: SQLite driver: unable to parse decltype: blob
WARNING: SQLite driver: column 'blob', SQLite type 4 is not supported
Datatypes In SQLite Version 3 http://www.sqlite.org/datatype3.html
UPDATE hoge
SET int = 0, real = 0, text = 0;
UPDATE hoge
SET
int = 2014/6/27,
real = 2014/6/27,
text = 2014/6/27;
UPDATE hoge
SET
int = 2014/6/27,
real = 1.0*2014/6/27,
text = '2014/6/27';
SQLiteの侏
双阿縫妊侫ルトの侏を協xすることができますが、それぞれのセルには
鏡羨した侏のデ`タを鯉{することができてしまいます。
匯鬄∩个龍xに鬉犬塵佑埜饉{されていますが、、、
侏ごちゃまぜでもSQLite議には}ありません。
SQLを初して處麻をする栽は、猟忖双でも方、箸澆覆靴酉麻しようとします。
屁方のみの處麻の栽、屁方侏にも廣吭が駅勣です。
採ができる
SQL猟を聞って互業なデ`タxk、渇竃、それを圷にしたデ`タの厚仟ができます。
$訳周によるgzみWHERE
?LIKE處麻徨でのパタ`ンマッチング 箭WHERE city_name LIKE ^%貧% ̄
屎ア蹶FでのマッチングREGEXP處麻徨はデフォルトでは聞えない
$デ`タのグル`プ晒GROUP BY
?揖じ訳周の佩を匯つにまとめて鹿する 箭GROUP BY city_name
SELECT * FROM cityborder
WHERE city_name LIKE "%貧%"
SELECT
'$$'||substr(city_name,-1) AS city_type,
count(city_name) AS count
FROM cityborder
GROUP BY city_type
箭偏曝隨翫の恷瘁の匯猟忖でグル`プ晒して方を鹿
箭兆各に仝貧々を根む偏曝隨翫を渇竃
$麿のテ`ブルとのY栽LEFT JOIN, INNER JOIN
SELECT *
FROM nationalcensus_mesh
LEFT JOIN landuse_mesh
ON landuse_mesh.meshID = nationalcensus_mesh.key_code;
箭メッシュデ`タのY栽┨殳{砲藩禅慇喘
LEFT JOIN
忽殳{縫瓮奪轡絅禰`タ 輿仇旋喘メッシュデ`タ
SQLiteで旋喘できるY栽はLEFT、INNER、CROSS、NATURALの膨Nです。
?RIGHT JOIN,FULL OUTER JOINには鬉靴討い覆い里如⊇Y栽の會に廣吭が駅勣です。
採ができる
SQLite
Features 仇麗デ`タ
GRASS GIS
Y栽を旋喘したSELECTは、嶷啜弔吠垢Δ海箸できます。
採ができる
Table CTable BTable A
Table E Table D
cat
cat
key_1 key_2
key_3
$xkY惚の旋喘┘汽屮エリ
ALTER TABLE landuse_mesh
ADD COLUMN Population integer; --双を弖紗
UPDATE landuse_mesh
SET Population =
(SELECT Population
FROM nationalcensus_mesh
WHERE landuse_mesh.meshID = nationalcensus_mesh.key_code
);
箭奉來デ`タに麿のテ`ブルのデ`タを携襭┘禰`タの厚仟UPDATEステ`トメント
???
CREATE INDEX landuse_mesh_meshID ON landuse_mesh (meshID);
CREATE INDEX nationalcensus_mesh_key_code ON nationalcensus_mesh (key_code);
$インデックスのO協
?SQLiteでは、光カラムにインデックスをO協することができます。
これによって、Y栽やサブクエリを初した厚仟などがゝ弔穆腓なる栽があります。
箭貧のUPDATE箭の栽landuse_mesh114,100佩 nationalcensus_mesh180,222佩
I尖rg インデックス恬撹念瑳s2rg15蛍 ?インデックス恬撹瘁1.18昼
?ユニ`クインデックス恬撹CREATE UNIQUE INDEX瘁1.08昼
採ができる
v.db.addcol
map=cityborder
column="flg integer"
ちょっと鮄達哉娜蒋Zを根むデ`タをQう 箭晩云Zデ`タを訳周にした渇竃
v.extract
map=cityborder
where=^city_name like '%翫' ̄
UPDATE cityborder
SET flg = 1
WHERE city_name LIKE '%翫';
v.extract
map=cityborder
where=^flg = 1 ̄
where訳周を峺協できるGRASSモジュ`ルは謹いので、嶷右します。
採ができる
flg双を弖紗
SQLでflg双を厚仟
仇麗を渇竃
岷俊仇麗の渇竃ができない。。
ちょっと鮄達GROUP BYを聞ってディゾルブする┌幹離瓮奪轡絅禰`タ?3肝メッシュデ`タ
64415129
3
64415129
4
64415220
3
64415220
4
64415129
1
64415129
2
64415220
1
64415220
2
64415119
3
64415119
4
64415210
3
64415210
4
64415119
1
64415119
2
64415210
1
64415210
2
SELECT
substr(meshID_4th,1,8) AS meshID_3rd,
sum(Population) AS Population_3rd,
sum(Household) AS Household_3rd
FROM census_4thmeth
GROUP BY meshID_3rd;
64415129 64415220
64415119 64415210
3肝メッシュの仇麗デ`タはe余喘吭ということで´^^;
あとは、meshID_3rdをキ`にして仇麗デ`タにJOIN
寄楚のデ`タを根む奉來を訳周にしたディゾルブの栽は、
テ`ブルと仇麗をe羨てでQうのは措い圭隈かも。
4肝メッシュデ`タ
3肝メッシュデ`タ
採ができる
愚初なこと、弖a?おまけ
$cat双
?GRASSベクタ仇麗と奉來デ`タを俊Aしています。いじるとY栽vSがおかしくなります。
?cat双には徭啜弔縫ぅ鵐妊奪スが伏撹されています。
たまにcat双が伏撹されない栽もありますが、v.categoryというモジュ`ルで伏撹できます。
?これがいわゆる仝腎gインデックス々というものなのかどうかは???わかりません。
$晩云Z┘泪襯船丱ぅ販鍔孱
?奉來テ`ブル坪のデ`タにマルチバイト猟忖 ?OK
SQLite ? OK┐燭世UTF8 GRASS GIS ? OK┐燭世鯨xk訳周などコマンド嶄には聞えない
?双兆にマルチバイト猟忖 ?NG
SQLite ? OK GRASS GIS ? NG
$トランザクション
?I尖を_協┘灰潺奪硲するまでは、I尖g佩念の彜Bまですこと┘踪`ルバックができます。
?苧幣議に聞うことで、デ`タの厚仟吉のI尖が壼くなることもあるそうです。g湖なし
?しかし、GRASSのI尖では徭咾妊灰潺奪箸気譴謄踪`ルバックできないので、あまり寓{はないかも。
$翌何ソフトの聞喘
?GRASS坪でもSQLを聞喘したxkdb.selectや厚仟v.db.update、その麿のSQLI尖
db.executeができますが、翌何アプリケ`ションを聞喘したほうがS
?SQLiteManager、SQLiteSpy etc.
$もっとサブクエリ
?GRASSモジュ`ルのwhereの何蛍にもサブクエリが聞えます。}jなxk訳周を峺協できます。
箭v.extract ... where=^cat IN (SELECT cat FROM hoge WHERE area < 1000 LIMIT 100) ̄
$dbfの圭がいいことも???
?v.mkgrid┘哀螢奪匹良撹で謹楚のグリッドデ`タを恬撹するのに、どえらいrgがかかりました。
?匯稀dbfで恬撹してから、個めてSQLiteに俊Aし岷したらすんなりできました。
これからと、まとめ
お弊になりました┐覆辰討い泙坑
$GRASS7では、SQLiteが覆諒來デ`タフォ`マットになります。
GRASS GIS Manual: SQL support in GRASS GIS http://grass.osgeo.org/grass70/manuals/sql.html
?GRASS6でデフォルトだったDBASE.dbfは、仝掲容X々に。
$さらにRとのB亊をやってみたい。
$まとめ
?SQLは宴旋です。もっと聞いこなせばきっともっと宴旋な嚠湖。
?SQLでGRASSのベクタC嬬はもっと宴旋になります。
?SQLiteはサ`バ`がいらないので、とりあえず聞ってみるのは護とSです。
?晩云ZのY創が附除にあればもっといいのに。MySQL、PostgreSQLにはたくさんあるみたい。
?MySQL、PostgreSQLと^べてどうなの ?わかりません。岑りたい
?SQLite秘T CDBOnline-
http://www.dbonline.jp/sqlite/
?Query Language Understood by SQLiteSQLite云社のリファレンス
http://www.sqlite.org/lang.html
?オ`プンソ`スGIS グラスアプロ`チ 及3井
?GRASS GIS 6.4.4svn Reference Manual
http://grass.osgeo.org/grass64/manuals/
?その麿Google枠伏が宛坪してくれたたくさんのSQL聞喘箭をdせてくれた圭?
ありがとうございました。
ご廁冱、ご吭は yoh.fukuda at gmail.com
2014/06/27
FOSS4G 2014 Hokkaido

More Related Content

GRASS 〜 SQLite でベクタをQってみる