パーソナルブログメモリ

a = [1, 1]
for _ in "*" * 999: a += [sum(a[-2:])]
print(a)

QGISの勉強

2017-03-28 | Processing
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
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();
}

最新の画像もっと見る

コメントを投稿

ブログ作成者から承認されるまでコメントは反映されません。