cybozu developer network

カテゴリー内の他の記事

住所から地図を表示する

2020年8月改訂のセキュアコーディング ガイドラインに抵触する内容が含まれています。認証情報が漏洩した場合の影響を考慮して慎重に検討してください。
該当箇所:JavaScriptプログラムの14行目

Index

概要

アプリのレコード詳細表示時に、住所をもとに地図上にピンを表示します。
サンプルでは、Google Maps PlatformのMaps JavaScript APIを使用しています。 ご利用方法によっては有償ライセンスの購入が必要になる場合があります。Googleのライセンスをご確認ください。

完成形

2018-07-18_16h34_31.png

事前準備

  • kintone アプリ(kintone アプリストア  にある「顧客リスト」を使います)
    アプリに以下のフィールドを追加してください。
     フィールドの種類  フィールド名  フィールドコード
    スペース Map
  • エディター
  • Maps JavaScript APIキー
    こちらのページに従って取得してください。

サンプルプログラム

ご注意事項
  • サンプルプログラムは、その動作を保証するものではありません
  • サンプルプログラムの技術的なサポート等は行っていません

プログラム

12行目のYour Google API keyの部分を取得したMaps JavaScript APIキーに書き換えてください。

  • エディターにサンプルプログラムをコピーし、ファイル名を”sample.js” 、文字コードを「UTF-8」にして保存します(ファイル名は任意)
  • 準備したアプリの設定画面で、保存したファイルを読み込みます
  • アプリの設定を完了し、レコード一覧を表示します

使用したAPI

  1. イベントハンドラーを登録する
  2. レコード詳細画面が表示された時のイベント
  3. フィールド要素を取得する

このTipsは、2022年10月版で確認したものになります。

記事に関するフィードバック

記事のコメント欄は記事に対するフィードバックをする場となっております。
右の記事フィードバックのためのガイドを参照してコメントしてください。
記事のリンク切れなど、気になる点がある場合も、こちらのフォームからフィードバックいただけますと幸いです。

Avatar
ばみ

はまった点をコメントしておきます。
・フォームの編集で「スペース」要素を「Map」というIDで登録する必要がある
・フォームの編集で住所を「Address」というIDで登録する必要がある
・Mapの親要素のサイズ指定が必要。
・div要素のサイズ指定も必要。
※サイズ指定に関しては「顧客訪問リストを地図にピン表示する」のソースが参考になります。

Avatar
村松 達之助

Google Maps APIのライセンスについて、不安になったので確認させてください。

 ご利用方法によってはGoogle Maps APIの有償ライセンスの購入が必要になる場合があります。Googleのライセンスをご確認ください。
というGoogleのサイトを確認しました「https://developers.google.com/maps/pricing-and-plans/#details」
上記サンプルプログラム上の、 「load('https://maps-api-ssl.google.com/maps/api/js?v=3&sensor=false')」でjsがJSがロードされてきますのでJSと考え
Google Maps JavaScript APIの場合、「1 日あたり最大 25,000 回のマップロードが無料」と考えてよいでしょうか。

Android アプリ以外の非公開用途には、プレミアム プランが必要とわかりましたので、本投稿は未承認でOKです。見逃していました。

 失礼しました。

村松 達之助により編集されました
Avatar
cybozu Development team

村松 達之助さま

解決済みのご連絡ありがとうございました。今後ともよろしくお願いいたします。

Avatar
bigbros

cybozu Development team 様

当方全くの素人です。モバイル版のサンプルコードを頂くことは可能でしょうか。

Avatar
cybozu Development team

bigbros様

コメントいただきありがとうございます。

こちらのコメント欄では、「記事通りに設定をしたけれど動かない」などの記事に直接関係するコメントをお願いしております。
申し訳ございませんが、新たにサンプルを作成するという内容などの場合は、是非コミュニティをご活用いただければと思います。

今回のご質問が、モバイル版のサンプルコードということですが、下記の記事はご覧いただけましたでしょうか?

・Geolocation API(位置情報)を使ったモバイルアプリを作ってみよう
https://developer.cybozu.io/hc/ja/articles/202179174

モバイル版の書き方も載っておりますので、参考になると思いますので、是非ご確認ください。

今後、記事の内容ではない、サンプルややり方については、下記のコミュニティに投稿いただければと思います。

JavaScript developer向けフォーラム
https://developer.cybozu.io/hc/ja/community/topics/20003434

よろしくお願い致します。

 

Avatar
bigbros

cybozu Development team 様

ご回答ありがとうございます。

モバイル版の書き方を確認させて頂きます。不明点があれば、今後はJavaScript developer向けフォーラムに投稿させて頂きます。

Avatar
Satoshi Oda

お世話になります。

同フォーム内に2か所、地図を表示したいのですが可能でしょうか。

それぞれ違う住所になります。

2つコードファイルを置いてもエラーになってしまいます。

Avatar
cybozu Development team

Satoshi Oda 様

お世話になっております。cybozu developer network運営チームです。

必要なフィールドを追加し、サンプルコードを書き換えていただくことで可能です。

追加するフィールド:
・住所を入力するフィールド(別住所とのことなので、入力フィールドを追加)
・地図を表示するためのスペースフィールド

コードの修正ポイント:
・レコードに入力した住所の取得と地図の表示を行っている「setLocation_address」を2回呼び出す
・setLocation_addressに以下についての引数を設定し、2回それぞれの呼び出し時に必要な値を渡すようにする
 ・住所フィールドのフィールドコード
 ・住所表示用スペースフィールドの要素ID
 ・住所表示用に生成する div 要素の id 名

なお、こちらは記事に対するフィードバック欄です。
カスタマイズの詳しいやり方についてのご質問は、ぜひコミュニティをご活用ください。
https://developer.cybozu.io/hc/ja/community/topics

Avatar
Daisuke Mori

kintoneアプリとgoogle mapの連携について教えてください。

過去スレ:Google Map APIを利用している記事についての注意事項 (2018/07/09)でも語られていますが、Google の api_key が導入されて以降、地図に関するサンプルソースがうまく動作しない様でした。

 ※現在も、サンプルソースでうまく動くよ!という方がいらっしゃいましたら、お報せください...。

症状は、

1.顧客訪問リストを地図にピン表示する のサンプルの場合

スペース(Map)に、google map が展開されない


2.住所から地図を表示する のサンプルの場合

スペース(Map)に 、緯度経度0. 0. の地域と思われるgoogle map が表示される

 あらかじめ緯度経度情報が格納されている場合、該当のエリアが表示される

 

という物です。

いくつか、原因箇所と思しき箇所(※後述)を想定して、確認をしましたが、結論として、住所をもとに、緯度経度情報を取得する箇所で、処理がうまくいっていないのではないかと想定されます。

Google Map の geocode api の仕様が変わったのかと思い調べてみたのですが、上手く解決方法を見つける事が出来ませんでした。

もし、kintone で Google Mapを利用する方法をご存知の方がいらっしゃいましたら、サンプルソースをどのように修正すればよいか、お教え頂けないでしょうか。

 

※確認した事

・api_key は有効化しているか? → google cloud platform のダッシュボードでapi_keyがコールされている事を確認済み

 また、Google map の提供するチュートリアルで、api_keyを含むgoogle map のコールを実施して動作確認済み(参考ページ)

・スペースのMapと、.js上のフィールドコードが違う → 2.の緯度経度が入っていれば、Mapは表示される為、フィールドコード自体はマッチしている

・2.の実施時、レコードの編集モードで、住所フィールドがロックされたままになる。また、レコードの保存時、緯度経度情報が削除される

・alertコマンドで変数の格納状態をステップ実行したところ、緯度経度の座標変換系の工程がスキップされる

 

以上、ご助力頂ければと思います...。

 

Daisuke Moriにより編集されました
Avatar
たまご

Daisuke Mori さん、こんにちは。

私はどちらの記事のカスタマイズも、API キー対応の現在のサンプルコードでちゃんと動いています。
※試しにこの記事だけ手順通りにやり直してみましたが、変わりなく動きました。

 

やり取り長くなりそうですし、記事をまたがる話でもあるのでコミュニティに場所を移しませんか?
ここ(記事コメント)は記事をフォローしている限られた人しか見ていないので、
コミュニティのほうが人目に触れやすく、色々な方のフォローをもらいやすいです!

 

一応、現段階で思いつくこと書いておきます。
---------------------------

顧客訪問リストを地図にピン表示する について(1、2は記事が逆かと思います)

>2.の実施時、レコードの編集モードで、住所フィールドがロックされたままになる。
一覧画面上でレコードを編集しようとしたおきに住所フィールドがロックされる(編集不可になる)ということでしたら、
正しい動きになっています。(サンプルコードの275行目、256~261行目あたり)

>レコードの保存時、緯度経度情報が削除される
こちらも正しい動きです。(サンプルコード264~266行目、24~34行目)

>alertコマンドで変数の格納状態をステップ実行したところ、緯度経度の座標変換系の工程がスキップされる
緯度経度情報の取得は、レコード詳細画面を表示したときに行われます。
緯度経度の取得が怪しそうであれば、レコード詳細画面を表示したときに
「setLocationDetail」関数でどんな動きをしているかを詳しく見てみてください。

具体的に言うと、
緯度経度の取得は73行目のgc.geocodeで行っていて、その結果が77行目のresults、statusに格納されます。
84行目あたりにブレークポイントを置いて、resultsとstatusの中身がどうなっているか見てみてください。
そもそもそこまで到達しないようであれば、どの分岐によって到達しないのかを追ってみてください。
(setLocationDetailは呼ばれるか?その中のどのif文で抜けてしまうのか?)

また、もしコンソールにエラーが出ているようなら内容を教えてください。

 

たまごにより編集されました
Avatar
Daisuke Mori

たまご さん、ご返信ありがとうございます!

コミュニティに移動致します、コミュニティフォーラムに新しいスレッドを立てました。

また、いただいたアドバイスをもとに、チェックを進めてみます。

 

Avatar
Aiko

初心者です。上記のコードをコピペし、地図を表示させることができました。

しかし、地図が正しい住所を示してくれません。

表示内容「福岡県」はあっているものの、「福岡県」以下の市町村が正しく認識されず、

住所とは違う位置にピンが表示されています。

何が原因でしょうか。

Avatar
cybozu Development team

Aiko 様

お世話になっております。

動かない?そんな時はデバッグをしてみよう!入門編などの記事を参考にし、
コンソール上にエラーが表示されているかご確認いただけますでしょうか?

また、Web版の Google MAP では、表示したい住所に正しくピンが表示されますでしょうか?
本記事で使用している Google MAP API の仕様は Google MAP の挙動に依るため、
ご確認いただければと思います。

よろしくお願いいたします。

Avatar
Aiko

昨日は上記のコードを勘で書き換え、内容は覚えていませんが「福岡県」が表示されていました。(GoogleMapで今回の住所検索した際は、正しい住所にピンがたちます。)

本日、再度、上記のコードをコピーし、取得したAPIキーを入れ、何も書き換えず実行しました。

すると、地図が何も表示されなくなりました。今は「福岡県」を表示することさえ出来ません。

現在のエラーコードを添付いたします。

「住所から地図を表示する」のコード34行目の「住所」を「address」にも変えて、試しましたがダメでした。

以下、設定しているフィールドの種類と名前です。

フィールドの種類

フィールド名

フィールドコード

文字列 (1行)

緯度

lat

文字列 (1行)

経度

lng

スペース

Map

文字列 (1行)

住所

address

文字列 (1行)

レコード番号

record

また、顧客訪問リストを地図にピン表示するにおいて、昨日はこちらも「福岡県(ピン先は間違っているものの、上記と同じ住所をさす)」が表示されていましたが、

本日、再度、コードをコピペし、実行したところ、こちらも何も表示されなくなってしまいました。

現在は空欄が表示されるのみです。こちはエラーコードはありません。

 

お力いただけると、大変助かります。

 

【追記】

こちらで紹介されている別の地図コード(https://developer.cybozu.io/hc/ja/articles/202179174)を上記の顧客訪問リストを地図にピン表示すると同時に使用すると、再び「福岡県」の地図が表示されましたが、やはり、ずれています。その際、以下の2種類のエラーコードが出ました。(フォームのフィールドコードは「レコード番号」は「record」のまま、「Geolocation API(位置情報)を使ったモバイル用のカスタマイズをしよう」で紹介されているコードは書き換えず「record_no」のままです。書き換えたらピンが「NaN」と表示されました。)

 

Aikoにより編集されました
Avatar
cybozu Development team

Aiko様

お世話になっております。cybozu developer network運営チームです。
返信が遅くなり申し訳ございません。

まず、1つ目の

> Uncaught TypeError: Cannot read property ' length ' of null

のエラーについてですが、サンプルコード34行目のフィールドコードを「住所」より「address」に変更したとのことでしたので、一度タイプミスなどないか確認していただけないでしょうか。
こちらのエラーについては、34行目で定義している「locationEl_address」がきちんと定義されておらず、lengthを確認しようとしても確認できないという現象なのではないかと推測いたします。

次に、【追記】の部分のエラーについてです。

> You have included the Google Maps JavaScript API multiple times on this page. This may cause unexpected errors.

こちらは、一つのコード内でGoogle MapのAPIを複数回読み込んでしまっている際に表示されるエラーなので、
Aiko様が書いているソースコードの中においてGoogle Map APIを複数回読み込んでいないか確認していただくことは可能でしょうか。

加えて、大変恐縮ではございますが、内容が複数の記事にまたがりますので、今後の質問に関してはcybozu developer コミュニティをご活用いただければ
こちらの記事をフォローしていないkintoneユーザーの目にも触れやすく、フォローももらいやすいです。

お手数をおかけいたしますがよろしくお願いいたします。

cybozu Development teamにより編集されました
Avatar
村上涼子

全くの初心者です。
記事の通りにやっているつもりですが、地図が一向に表示されません。
おおざっさな質問で大変申し訳ありませんが、初心者が、間違いやすいことを教えていただければ幸いです。

Avatar
cybozu Development team

村上涼子 様

お世話になっております。
cybozu developer network運営チームです。

>記事の通りにやっているつもりですが、地図が一向に表示されません。

正常に動作しない場合の原因は色々あると思いますが、
エラーメッセージなどが分かれば、原因を特定しやすいので、
まずは、動かない?そんな時はデバッグをしてみよう!入門編などの記事を参考にし、
コンソール上にエラーが表示されているか、ご確認いただけますでしょうか?

お手数をおかけしますが、ご確認のほどよろしくお願いします。

Avatar
村上涼子

cybozu developer network運営チームさま
お世話になっております。地図が表示されました。アドバイスありがとうございます。
今後ともよろしくお願いいたします。

サインインしてコメントを残してください。