質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
canvas

HTML5の<canvas>要素用のタグです。CanvasはHTML5から導入された、二次元の図形描写が可能な要素です。

Google API

Googleは多種多様なAPIを提供していて、その多くはウェブ開発者向けのAPIです。それらのAPIは消費者に人気なGoogleのサービス(Google Maps, Google Earth, AdSense, Adwords, Google Apps,YouTube等)に基づいています。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Google マップ

Google Mapは、Google社がオンラインで提供している地図・ローカル検索サービスです。GIS(Geographic Information System:地理情報システム)の中の「WebGIS」に該当します。地図・航空写真・地形の表示方式があり、それぞれユーザーが縮尺を調整して表示させることができます。地域の情報サービスを検索する機能やルート検索の機能も搭載されています。

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

Q&A

解決済

1回答

2538閲覧

JavaScript Canvas ポリゴン図形を線を繋げて作りたい

bwrs1

総合スコア9

canvas

HTML5の<canvas>要素用のタグです。CanvasはHTML5から導入された、二次元の図形描写が可能な要素です。

Google API

Googleは多種多様なAPIを提供していて、その多くはウェブ開発者向けのAPIです。それらのAPIは消費者に人気なGoogleのサービス(Google Maps, Google Earth, AdSense, Adwords, Google Apps,YouTube等)に基づいています。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Google マップ

Google Mapは、Google社がオンラインで提供している地図・ローカル検索サービスです。GIS(Geographic Information System:地理情報システム)の中の「WebGIS」に該当します。地図・航空写真・地形の表示方式があり、それぞれユーザーが縮尺を調整して表示させることができます。地域の情報サービスを検索する機能やルート検索の機能も搭載されています。

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

0グッド

0クリップ

投稿2020/03/02 06:16

編集2020/03/02 07:04

現在、Canvas APIを使用して
Google Map上にポリゴン図形を書きたいのですが
方法が分からなくて困っています。

ぜひ、教えていただけるとありがたいです。

今後、ポリゴン図形以外も
Canvas APIを使用して制作していくので
Canvas APIを使用した解決策を頂けたらと思います。

宜しくお願いします。

該当のソースコード

$('#' + this.shapeButtons.pori).click(function() { //ポリゴンの中身 self.createLayer().done(function(newLayer) { self.layers.push(newLayer); //フラグ設定(下記のisMouseDownの表記の部分) var isMouseDown = false; //配列 var Points = new Array(); //クリック判定 var clickCount = 0; if (clickCount = 1) { /*----------------------------------------------------------------------*/ newLayer.canvas.addEventListener('mousedown', e => { //マウスダウン isMouseDown = false; self.map.setOptions({ draggable: false }); var rect = e.target.getBoundingClientRect(); x = e.clientX - rect.left; y = e.clientY - rect.top; console.log('mousedown x:' + x + ' y:' + y); }, { once: false }); /*----------------------------------------------------------------------*/ //マウスのカーソルを移動させているときの動作 newLayer.canvas.addEventListener('mousemove', e => { //マウスムーブ //フラグがtrueの時にmousemoveが動作する if (isMouseDown) { var rect = e.target.getBoundingClientRect() var ux = e.clientX - rect.left; var uy = e.clientY - rect.top; console.log('mouseup x:' + x + ' y:' + y + ' ux:' + (ux - x) + ' uy:' + (uy - y)); newLayer.context.clearRect(x, y, newLayer.canvas.width, newLayer.canvas.height) newLayer.context.beginPath(); newLayer.context.lineTo(ux, uy); newLayer.context.strokeStyle = "red"; newLayer.context.lineWidth = 5; newLayer.context.stroke(); } }, { once: false }); /*----------------------------------------------------------------------*/ //マウスを離した時の座標を取得 newLayer.canvas.addEventListener('mouseup', e => { //マウスアップ //フラグがfalseの時は動作しない isMouseDown = false; var rect = e.target.getBoundingClientRect(); var ux = e.clientX - rect.left; var uy = e.clientY - rect.top; console.log('mouseup x:' + x + ' y:' + y + ' ux:' + (ux - x) + ' uy:' + (uy - y)); newLayer.context.moveTo(x, y); newLayer.context.lineTo(ux, uy); newLayer.context.closePath(); newLayer.context.strokeStyle = "red"; newLayer.context.lineWidth = 5; newLayer.context.stroke(); newLayer.context.fillStyle = "rgba(50,0,0,0.8)"; newLayer.context.fill(); self.map.setOptions({ draggable: true }); /**falseにすると同じレイヤーに何度も描画ができて *once:trueだと一度しかレイヤーに描画出来なくなる */ }, { once: false }); /*----------------------------------------------------------------------*/ newLayer.canvas.addEventListener('mousedown', e => { //マウスダウン isMouseDown = false; self.map.setOptions({ draggable: false }); var rect = e.target.getBoundingClientRect(); x = e.clientX - rect.left; y = e.clientY - rect.top; console.log('mousedown x:' + x + ' y:' + y); Points.add(x, y); }, { once: false }); } newLayer.context.fillStyle = "rgba(50,0,0,0.8)"; newLayer.context.fill(); }); });

試したこと

現在
直線,短形、円などの描画は出来ています。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

m.ts10806

2020/03/02 06:36

(大至急) などと書くと回答者の多くはそっと画面を閉じます。誰がいつ見るとも答える保証もない質問サイトに投げるのは間違いですしね。 それにそのように書く人のほとんどは大して急いでいないことを分かっています。 煽り文句は逆効果です。 (本当に急ぎなら業者へGo)
bwrs1

2020/03/02 06:37

指摘ありがとうございます
BluOxy

2020/03/02 06:38 編集

協力を仰ぐ立場に関わらず、大至急と記載するのは失礼ですね。不必要に協力者を遠ざけてしまうので、タイトルは修正しましょう。(と思ったら既に同じことが書かれていました)
BluOxy

2020/03/02 06:56

Google Map APIの描画ツールではなく、Canvas APIについての質問でよろしいでしょうか。 また、「ポリゴン図形が書けず困っている」ではどのように困っているのかが分からず回答が難しいので、どのように困っているのかを記述頂けるとお答えできるかもしれません。 ①CanvasAPIの使い方が分からない ②線の描画方法が分からない ③線の描画方法は分かるが、構文が分からない ④線をつなげて多角形を表現する方法が分からない ⑤多角形を表現する方法は分かるが、構文が分からない
BluOxy

2020/03/02 06:58

> Google Map API のPolyline class などは使えません 使えない背景が記載されていると、別の提案も出来るかもしれません。
bwrs1

2020/03/02 06:59

Canvas API についてです。 ④の 線をつなげて多角形を表現する方法が分からない で困っています。
guest

回答1

0

ベストアンサー

canvas に図形を描くCanvas API の基本的な使い方が記載されています。

パスを描く-三角形の描画 に単純な図形 (三角形) を描くコードが紹介されています。

これ等を参考にすると、canvas オブジェクトから描画コンテキストを取得(getContext)して、下記のメソッドを利用すれば、線を繋ぎ多角形を表現できます。

  • beginPath 新しいパスを作成する
  • moveTo (x, y) 座標へ作成済みのサブパスの始点を移動する
  • lineTo 現在のサブパスの終点を指定した (x, y) 座標へ直線で接続する
  • stroke 輪郭をなぞる方式で、図形を描く
  • closePath 直線をパスに追加し、現在のサブパスの開始地点につなぐ

sample

javascript

1const draw = () => { 2 const canvas = document.getElementById('canvas'); 3 if (canvas.getContext) { 4 const ctx = canvas.getContext('2d'); 5 ctx.beginPath(); 6 ctx.moveTo(75, 20); 7 ctx.lineTo(30, 130); 8 ctx.lineTo(160, 190); 9 ctx.lineTo(270, 100); 10 ctx.lineTo(220, 60); 11 ctx.lineTo(100, 25); 12 ctx.closePath(); 13 ctx.stroke(); 14 } 15}

類似の質問

Canvas point to point user line

投稿2020/03/02 07:38

編集2020/03/02 07:40
BluOxy

総合スコア2663

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

bwrs1

2020/03/02 07:52

ご丁寧な回答ありがとうございます。 もう一つ質問があるのですが lineTo() に数値を記入している状態ではなく マウスのクリック操作なので 座標を取得してポリゴン図形を書く場合は どのようにすれば宜しいでしょうか? ご回答いただければ幸いです。
BluOxy

2020/03/04 04:31 編集

mousedown や mouseup, mousemoveは MouseEvent( https://developer.mozilla.org/ja/docs/Web/API/MouseEvent ) を実装しているので、イベントが発火したときのパラメータから座標(clientX,clientY)が取得できます。それをlineToの引数に渡してあげることでうまくいくと思います。
BluOxy

2020/03/02 08:11

bwrs1 さんが掲示したコードでマウス座標を取得できていると思います。 > console.log('mousedown x:' + x + ' y:' + y);
bwrs1

2020/03/02 14:24

ご指摘頂いたおかげで解決しました ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問