みかづきブログ・カスタム

基本的にはちょちょいのほいです。

Cloud Functionsで2つのGPS座標を受け取り、2点間の直線距離を返すWebAPIをつくる 🔥

実装手順

❶ パッケージを用意する

yarn add firebase firebase-tools

❷ package.jsonを編集する

package.json
{
  "name": "gps-distance",
  "scripts": {
    "login": "firebase login",
    "init": "firebase init",
    "emulate": "firebase emulators:start",
    "deploy": "firebase deploy"
  },
  "dependencies": {
    "firebase": "^10.13.0",
    "firebase-tools": "^13.15.3"
  }
}

❸ Firebaseのコンソールからプロジェクトをつくり、Cloud Functionsを有効にする

  • ロケーションは近いところを選ぶ

firebase.google.com

❹ Firebaseプロジェクトを初期化する

ログイン
yarn run login
初期化
yarn run init

初期化後、❸で作成したプロジェクトに紐付けます。

必要なものを有効化
◉ Functions: Configure a Cloud Functions directory and its files
◉ Emulators: Set up local emulators for Firebase products
必要なエミュレータを有効化
◉ Functions Emulator

いろいろ選択肢が出てきますが、基本的にEnterを連打でOKです。

❺ コードを書く

functions/index.js
const { Geodesic } = require('geographiclib-geodesic');
const { onRequest } = require('firebase-functions/v2/https');
const { initializeApp } = require('firebase-admin/app');
const logger = require('firebase-functions/logger');

exports.distance = onRequest({
  region: ['asia-northeast1'],
}, async (request, response) => {
  // ?target[]=座標Aの緯度,座標Aの経度&target[]=座標Bの緯度,座標Bの経度というパラメータを想定
  const { target } = request.query;

  if (target && target.length === 2) {
    try {
      const [ latA, longA ] = target[0].split(',');
      const [ latB, longB ] = target[1].split(',');
      const r = geod.Inverse(
        Number(latA),
        Number(longA),
        Number(latB),
        Number(longB),
      );

      response.send({
        distance: r.s12.toFixed(2)
      });
    } catch (err) {
      logger.error(err);
    }
  }

  response.send({
    distance: (0).toFixed(2)
  });
});

❻ エミュレータで確認する

yarn emulate

http://127.0.0.1:4000/logs?q=metadata.emulator.name%3D%22functions%22 にアクセスすると、デプロイしたfunctionのURLが確認できます。

関数名は、http://127.0.0.1:(ポート番号)/(プロジェクト名)/(リージョン)/(関数名)となるので、

  • functionsのポートを「5001」
  • プロジェクト名が「gps-distance」
  • リージョンが「asia-northeast1(東京)」
  • 関数名が「distance」

ならば、

http://127.0.0.1:5001/gps-distance/asia-northeast1/distance

となります。

ブラウザでアクセスしてみると、2点間の距離が返ってきます。

👆は鎌倉駅(35.31902777,139.55041666)と横浜駅(35.4660694,139.6226196)の直線距離(18305.42m)です。

❼ デプロイする

yarn deploy

今回は以上です。