In my head.

感想と考え事とメモ

Google Maps APIとの戦い ポリゴン描画編完結(多分)

 

 

2週間ぐらい前に言及したけど

そこから全く触れてなかったポリゴン描画問題

 

たしか、すでに頂点が描画定まってるポリゴンに対して

ポリゴンを崩さず任意の辺に新しく頂点加えられるかっていうミッション

 

結論からいうと、簡単にできました😘

 

結局PolygonクラスじゃなくてPolylineクラスを利用しました。

なぜならば有能プロパティeditableがあったから。

 

Polyline: editable - ポリラインの編集の有効、無効

こちらのサイトを見ていただければこの有能プロパティの動作がわかるでしょう。

 

ポリゴンもポリラインも、各頂点・ポイントの緯度経度セットが順々に描画されていくから

  f:id:smspring0426:20180712000708j:plain

新しい点を赤い点の箇所に打とうものなら

f:id:smspring0426:20180712000905j:plain

こんな感じになっちゃうよっていうお話でした。

 

だから困ったなあ〜って思ってたんですけど。

Polylineクラスのeditableプロパティが、どういう仕組みか

新しく引き伸ばした箇所に生成された頂点を

元々あった頂点と頂点の間に入れて保持してくれるわけです。

 

なので、PolygonクラスとPolylineクラスを駆使して、
任意の位置に打ったポリゴンを編集可能な状態にし保存する一連の流れを作ってみました。

都合によりVue仕様です。

<script defer>

let map
let polygon
let polyline

function initMap() {
 map = new google.maps.Map(document.getElementById('map'), {
  center: {lat: 35.6869, lng: 139.6444 },
  zoom: 17
 })

 polygon = new google.maps.Polygon({
  map: map
 })

 polyline = new google.maps.Polyline({
  strokeWeight: 1
 })
}

window.onload = function() {
 const vue = new Vue({
  data: {
   map: null,
   polygon: null,
   polyline: null,
   latLngs: [ [ ] ], // ポリラインの各ポイントの緯度経度
   polygonLatLngs: [ ], //ポリゴン用緯度経度
   saved: [] // ポリゴンとポリラインのセットが入る
  },
  el: '#app',
  mounted() {
   this.map = map
   this.polygon = polygon
   this.polyline = polyline

   // クリックした箇所の緯度経度取得・ポリライン作成
   this.map.addListener('click', (e) => {
    this.latLngs[0].push({
     lat: e.latLng.lat(),
     lng: e.latLng.lng()
    })
    this.makePolyline(this.latLngs[0])
   })

   // shift+enterでポリゴン保存発火
   document.addEventListener('keydown', (e) => {
    const shift = event.shiftKey
    const keyName = event.key
    if (shift && keyName == 'Enter') { this.makePolygon() }
   })
  },
  methods: {
  // ポリライン作成
   makePolyline(path) {
    this.polyline.setOptions({
     path: path,
     map: this.map
    })
   },
  // ポリライン編集切り替え
   switchEditPolyline(boolean) {
    this.polyline.setEditable(boolean)
   },
  // ポリゴン作成
   makePolygon() {
    this.polygonLatLngs.push(this.polyline.getPath())
    const endPoint = this.polygonLatLngs[0].b[0]
    this.polygonLatLngs[0].push(endPoint)
    this.polygon.setOptions({
     fillColor: '81F7F3',
     strokeWeight: 0,
     paths: this.polygonLatLngs
    })
    this.switchEditPolyline(true)
   },
  // ポリゴン保存
   savePolygon() {
    const polygon = new google.maps.Polygon({
     map: map,
     fillColor: this.polygon.fillColor,
     fillOpacity: 0.8,
     strokeColor: this.polygon.fillColor,
     strokeWeight: 1,
     paths: this.polygonLatLngs
    })
    const polyline = new google.maps.Polyline({
     map: map,
     strokeWeight: 1,
     path: this.polygonLatLngs[0].b,
    })
    this.saved.push({
     polygon: polygon,
     polyline: polyline
    })
   }

・・・省略

    

・ポリゴンは始点と終点が同じ緯度経度になるので、makePolygon内でendpoint作って配列に格納してます   

・ポリゴンのpathsとポリラインのpathややこしい

・this.polygonLatLngs[0].b[0]で緯度経度取得してますが、bって何。てかこの取得方法で合ってるのか           

    

ペーペーが書いたコードなので、修正点・改善点あると思います。 教えてくださる人いらっしゃったらとても嬉しいです。

  

とりあえずそろそろ寝る準備しなきゃ〜