Search code examples
google-mapsgeojson

I can not use feature.get Geometry () in a MultiLineString


I'm plotting GeoJSON on my map using google maps api v3. With the point of layers it is functioning normally. But I have a MultiLineString Camda and center the map on the geometry gives an error.This also occurs with a polygon, but with the points works well. Is there any other way to centralize to MultiLineString and Polygons?

  google.maps.event.addListener(cicloviasLayer, 'addfeature', function (e) {
     console.log(e.feature.getGeometry().getType()); // MultiLineString Ok!
     map.setCenter(e.feature.getGeometry().get());

  });  

Erro:

e.feature.getGeometry(...).get is not a function

Solution

  • The Data.MultiLineString class doesn't have a get method, it has a getAt and getArray methods.

    getAt(n:number)

    Return Value: Data.LineString

    Returns the n-th contained Data.LineString.

    The returned LineString has a getAt method that returns a google.maps.LatLng object

    getAt(n:number)

    Return Value: LatLng

    Returns the n-th contained LatLng.

    google.maps.event.addListener(cicloviasLayer, 'addfeature', function (e) {
      console.log(e.feature.getGeometry().getType()); // MultiLineString Ok!
      // will center the map on the first vertex of the first LineString
      map.setCenter(e.feature.getGeometry().getAt(0).getAt(0));
    });  
    

    proof of concept fiddle

    screenshot of resulting map, red "measle" on point

    code snippet:

    let map;
    
    function initMap() {
      map = new google.maps.Map(document.getElementById("map"), {
        zoom: 15,
        center: {
          lat: -28,
          lng: 137
        },
      });
      map.data.setStyle({
        strokeColor: "blue",
        strokeWeight: 4,
      });
      google.maps.event.addListener(map.data, 'addfeature', function(e) {
        console.log(e.feature.getGeometry().getType()); // MultiLineString Ok!
        // will center the map on the first vertex of the first LineString
        map.setCenter(e.feature.getGeometry().getAt(0).getAt(0));
        var marker = new google.maps.Marker({
          position: e.feature.getGeometry().getAt(0).getAt(0),
          map: map,
          icon: {
            url: "https://maps.gstatic.com/intl/en_us/mapfiles/markers2/measle.png",
            size: new google.maps.Size(7, 7),
            anchor: new google.maps.Point(3.5, 3.5)
          }
        })
      });
      map.data.addGeoJson({
        "type": "Feature",
        geometry: {
          "type": "MultiLineString",
          "coordinates": [
            [
              [-105.021443,
                39.578057
              ],
              [-105.021507,
                39.577809
              ],
              [-105.021572,
                39.577495
              ],
              [-105.021572,
                39.577164
              ],
              [-105.021572,
                39.577032
              ],
              [-105.021529,
                39.576784
              ]
            ],
            [
              [-105.019898,
                39.574997
              ],
              [-105.019598,
                39.574898
              ],
              [-105.019061,
                39.574782
              ]
            ],
            [
              [-105.017173,
                39.574402
              ],
              [-105.01698,
                39.574385
              ],
              [-105.016636,
                39.574385
              ],
              [-105.016508,
                39.574402
              ],
              [-105.01595,
                39.57427
              ]
            ],
            [
              [-105.014276,
                39.573972
              ],
              [-105.014126,
                39.574038
              ],
              [-105.013825,
                39.57417
              ],
              [-105.01331,
                39.574452
              ]
            ]
          ]
        }
      });
    }
    /* Always set the map height explicitly to define the size of the div
           * element that contains the map. */
    
    #map {
      height: 100%;
    }
    
    
    /* Optional: Makes the sample page fill the window. */
    
    html,
    body {
      height: 100%;
      margin: 0;
      padding: 0;
    }
    <!DOCTYPE html>
    <html>
    
    <head>
      <title>Data Layer: Simple</title>
      <script src="https://polyfill.io/v3/polyfill.min.js?features=default"></script>
      <script src="https://maps.googleapis.com/maps/api/js?key=AIzaSyCkUOdZ5y7hMm0yrcCQoCvLwzdM6M8s5qk&callback=initMap&libraries=&v=weekly" defer></script>
      <!-- jsFiddle will insert css and js -->
    </head>
    
    <body>
      <div id="map"></div>
    </body>
    
    </html>