QGISというソフトでgeotiffというファイルを読み込んで標高のある日本地図を作ってみる。
しかし以前このQGISというソフトの使い方およびgeotiffがさっぱりよくわからない。高校で地理とか専攻していなかったので予備知識も少ない。
slideshareにかなり力の入った解説があったので日本地図データの取得に関して参考にしてみました。
<開発環境>
OS ubuntu 16.04
開発ソフト Processing 3.3
利用ソフト QGIS 2.14.11
PS3のコントローラーUSB接続
<参考サイト>
さわってみようQGIS (QGIS初級中級編 for ver.2.14 at FOSS4G 2016 Hokkaido)
地球地図日本
画像に関しての著作権 Copyright. Geospatial Information Authority of Japan. ALL RIGHTS RESERVED.
ソースリストと同じフォルダに必要な画像ファイル
japan.png
hi.png
実行中の画像
うーん、北海道が浮いている。遠方が浮いてしまってます。
ソース
japan.pde
しかし以前このQGISというソフトの使い方およびgeotiffがさっぱりよくわからない。高校で地理とか専攻していなかったので予備知識も少ない。
slideshareにかなり力の入った解説があったので日本地図データの取得に関して参考にしてみました。
<開発環境>
OS ubuntu 16.04
開発ソフト Processing 3.3
利用ソフト QGIS 2.14.11
PS3のコントローラーUSB接続
<参考サイト>
さわってみようQGIS (QGIS初級中級編 for ver.2.14 at FOSS4G 2016 Hokkaido)
地球地図日本
画像に関しての著作権 Copyright. Geospatial Information Authority of Japan. ALL RIGHTS RESERVED.
ソースリストと同じフォルダに必要な画像ファイル
japan.png
hi.png
実行中の画像
うーん、北海道が浮いている。遠方が浮いてしまってます。
ソース
japan.pde
import org.gamecontrolplus.*; import java.util.List; ControlIO control; ControlDevice device; List<ControlDevice> list; ControlButton button; ControlSlider[] sliders = new ControlSlider[4]; PImage img; PImage himg; int wx=1260; int wy=936; int ws=1260*936; int[] cp = new int[40]; int[] cr = new int[40]; int[] cg = new int[40]; int[] cb = new int[40]; int cn; //int hi[] = {-1500,-1000,-500,-300,-100,-80,-60,-40,-20,-10,0,20,40,60,80,100,125,150,175,200,225,250,275,300,350,400,450,500,600,700,800,900,1000,1500,2000,3000,4000,5000,6000,7000}; int hi[] = {-20,-20,-20,-20,-20,-20,-20,-20,-20,-10,0,20,40,60,80,100,125,150,175,200,225,250,275,300,350,400,450,500,600,700,800,900,1000,1500,2000,3000,4000,5000,6000,7000}; int[] hland = new int[ws]; float ty; float t=0; float px=180; float py=150; int pt;//muki int ph=2000;//height int sc=1000; void theWorld2(){ int tm=millis(); int el=1400; int eh=60000; float ez; float ex; int ep; int hwix=700; int hwiy=200; int mx; int my; float cot=cos(t); float sit=sin(t); for (int y=3;y<500;y=y+1){ ez=el*eh/y; for (int x=0;x<1400;x=x+1){ ex=(x-hwix)*ez/el; float tx=(ex*cot-ez*sit)/sc; float ty=(ex*sit+ez*cot)/sc; mx=(int)(px+tx); if (mx<0 || mx>wx) continue; my=(int)(py-ty); ep=mx+my*wx; if (ep<0 || ep>=ws) continue; int h=(int)(hland[ep]*6/(sqrt(tx*tx+ty*ty))); fill(img.pixels[ep]); rect(x,y+hwiy-h,1,h); } } text(millis()-tm,10,10); } void setup() { control = ControlIO.getInstance(this); list = control.getDevices(); device = list.get(0); device.open(); button = device.getButton(0); sliders[0] = device.getSlider(0); sliders[1] = device.getSlider(1); sliders[2] = device.getSlider(2); sliders[3] = device.getSlider(3); size(1400, 700); img = loadImage("japan.png"); himg = loadImage("hi.png"); noStroke(); cn=0; for (int i=20;i<420;i=i+10){ int c=himg.pixels [i+40*421]; int r=(int)red(c); int g=(int)green(c);//& 0xf0; int b=(int)blue(c);// & 0xf0; c=color(r,g,b); int sw=0; for (int j=0;j<cn;j=j+1){ if (c==cp[j]){ sw=1; break; } } if (sw==0){ cp[cn]=c; cr[cn]=r; cg[cn]=g; cb[cn]=b; println(c); cn=cn+1; } } cn=cn-1; for (int i=0;i<ws-1;i=i+1){ int c=img.pixels [i]; int r=(int)red(c); int g=(int)green(c); int b=(int)blue(c); int bs=10000; int bh=0; for (int j=0;j<cn;j=j+1){ int s=abs(r-cr[j])+abs(g-cg[j])+abs(b-cb[j]); if (s<bs){ bs=s; hland[i]=hi[j]+160; } } } } void draw() { background(0); float lx=sliders[0].getValue(); float ly=sliders[1].getValue(); float rx=sliders[2].getValue(); float ry=sliders[3].getValue(); if (abs(lx)<0.1)lx=0; if (abs(ly)<0.1)ly=0; if (abs(rx)<0.1)rx=0; if (abs(ry)<0.1)ry=0; t=t-lx/3; float dx=cos(t-1.57); float dy=-sin(t-1.57); float sp=20; px=px+dx*ry*sp; py=py+dy*ry*sp; theWorld2(); }