国土地理院から複数の地図データを取得してM5Stack Core2 for AWSに表示します。

地図データ取得アプリの作成

地図データ取得アプリ「Httpdownload.ino」を次のように作成します。SPIFFSを取得した地図画像を一時的に保存するために使用します。

  • 10-13行目で国土地理院からの地図画像のURLを設定します。
  • 49行目で指定されたサイズ分画像データを繰り返し取得します。
  • 53行目の「readBytes」関数により画像データを入力します。
  • 56行目で入力した画像データをSPIFFSに保存します。
  • 64行目でSPIFFSに保存した画像データを「M5.Lcd.drawPngFile」関数によりM5Stack Core2 for AWSの画面に表示します。

Httpdownload.ino

#include <M5Core2.h>
#include <WiFi.h>
#include <WiFiMulti.h>
#include <HTTPClient.h>

WiFiMulti wifiMulti;
HTTPClient http;
static uint8_t http_buff[4096];
const char * FILE_PATH = "/map.png";
const char* myUrls[] = {
  "https://cyberjapandata.gsi.go.jp/xyz/std/7/113/49.png",  "https://cyberjapandata.gsi.go.jp/xyz/std/7/114/49.png",
  "https://cyberjapandata.gsi.go.jp/xyz/std/7/113/50.png",  "https://cyberjapandata.gsi.go.jp/xyz/std/7/114/50.png"
};
int urlpos = 0;

void setup() {
  M5.begin(); //Init M5Core2.
  wifiMulti.addAP("id", "pass");  //Storage wifi configuration information.
  M5.Lcd.print("\nConnecting Wifi...\n"); //print format output string on lcd.
  if (!SPIFFS.begin(true)) {
    M5.Lcd.print("SPIFFS Mount Failed");
    return;
  }
}

void loop() {
  M5.Lcd.setCursor(0, 0); //Set the cursor at (0,0).
  if ((wifiMulti.run() == WL_CONNECTED)) { // wait for WiFi connection.
    M5.Lcd.print("[HTTP] begin...\n");
    urlpos ++;
    urlpos &= 0x3;
    http.begin(myUrls[urlpos]);  // configure traged server and url.
    M5.Lcd.print("[HTTP] GET...\n");
    int httpCode = http.GET();  // start connection and send HTTP header.
    if (httpCode > 0) { // httpCode will be negative on error.
      M5.Lcd.printf("[HTTP] GET... code: %d\n", httpCode);

      if (httpCode == HTTP_CODE_OK) { // file found at server.
        M5.Lcd.printf("[HTTP] GET... code: %d\n", httpCode);
        WiFiClient *stream = http.getStreamPtr();
        int data_size = http.getSize();
        int read_size = 0;

        SPIFFS.remove(FILE_PATH);
        File f = SPIFFS.open(FILE_PATH, "w");
        if (f)
        {
          while (http.connected() && read_size < data_size)
          {
            size_t sz = stream->available();
            if (sz > 0)
            {
              int rd = stream->readBytes(http_buff, min(sz, sizeof(http_buff)));
              read_size += rd;
              M5.Lcd.printf("[HTTP] read: %d/%d\n", read_size, data_size);
              f.write(http_buff, rd);
            }
            else
            {
              delay(1);
            }
          }
          f.close();
          M5.Lcd.drawPngFile(SPIFFS, FILE_PATH, 0, 0);
        }
        else
        {
          M5.Lcd.print("ERROR: OPEN FILE.");
        }
      }
    } else {
      M5.Lcd.printf("[HTTP] GET... failed, error: %s\n", http.errorToString(httpCode).c_str());
    }
    http.end();
  } else {
    M5.Lcd.print("connect failed");
  }
  delay(5000);
  M5.Lcd.clear(); //clear the screen.
}

地図データ取得アプリの実行

地図データ取得アプリ「Httpdownload.ino」を実行すると、国土地理院から画像データを次のように取得します。

取得した画像データを次のようにM5Stack Core2 for AWSに表示します。