Google Maps API and KML File LocalHost Development Options

前端 未结 2 1404
别跟我提以往
别跟我提以往 2020-12-04 18:38

The Google Maps JavaScript version 3 API library documentation clearly explains:

The Google Maps API supports the KML and GeoRSS data formats for di

2条回答
  •  渐次进展
    2020-12-04 19:12

    Definitely, Google Maps KmlLayer is designed for you to send your data to them. https://developers.google.com/maps/documentation/javascript/kml

    Have a look the following log.

    //console
    var src = 'https://developers.google.com/maps/documentation/javascript/examples/kml/westcampus.kml';
    
    var kmlLayer = new google.maps.KmlLayer(src, {
      suppressInfoWindows: true,
      preserveViewport: false,
      map: your_gmap_object
    });
    

    Creating Marker, Polygon, they are all browser side parsing and rendering.

    As you can see from next network log, KmlLayer class send source URL to Google Server to parse it and (do something in their end) and send the parsed result back to your browser to render.

    //REQUEST from browser
    
    https://maps.googleapis.com/maps/api/js/KmlOverlayService.GetOverlays?1shttps%3A%2F%2Fdevelopers.google.com%2Fmaps%2Fdocumentation%2Fjavascript%2Fexamples%2Fkml%2Fwestcampus.kml&callback=_xdc_._lidt3k&key=AIzaSyBeLTP20qMgxsQFz1mwLlzNuhrS5xD_a_U&token=103685
    
    //RESPONSE from google server
    
    /**/_xdc_._lidt3k && _xdc_._lidt3k( [0,"kml:cXOw0bjKUSmlnTN2l67v0Sai6WfXhSSWuyNaDD0mAzh6xfi2fYnBo78Y2Eg","|ks:;dc:tg;ts:51385071|kv:3|api:3",...
    ["KmlFile"],[[37.423017,-122.0927],[37.424194,-122.091498]],[["g74cf1503d602f2e5"],["g58e8cf8fd6da8d29"],["ge39d22e72437b02e"]],1,[["client","2"]],-21505,[["ks",";dc:tg;ts:51385071"],["kv","3"],["api","3"]]] )
    

    As @capdragon mentioned above, it would be better parse KML by yourself.

    UPDATE

    Here is compact KML parser code. This only for google.maps Marker and Polygon.

    html

    
    

    script, I used typescript but it is pretty same with javascript

      file: any
      fileChanged(e) {
        this.file = e.target.files[0]
        this.parseDocument(this.file)
      }
      parseDocument(file) {
        let fileReader = new FileReader()
        fileReader.onload = async (e: any) => {
          let result = await this.extractGoogleCoords(e.target.result)
    
          //CREATE MARKER OR POLYGON WITH result here
          console.log(result)
    
        }
        fileReader.readAsText(file)
      }
    
      async extractGoogleCoords(plainText) {
        let parser = new DOMParser()
        let xmlDoc = parser.parseFromString(plainText, "text/xml")
        let googlePolygons = []
        let googleMarkers = []
    
        if (xmlDoc.documentElement.nodeName == "kml") {
    
          for (const item of xmlDoc.getElementsByTagName('Placemark') as any) {
            let placeMarkName = item.getElementsByTagName('name')[0].childNodes[0].nodeValue.trim()
            let polygons = item.getElementsByTagName('Polygon')
            let markers = item.getElementsByTagName('Point')
    
            /** POLYGONS PARSE **/        
            for (const polygon of polygons) {
              let coords = polygon.getElementsByTagName('coordinates')[0].childNodes[0].nodeValue.trim()
              let points = coords.split(" ")
    
              let googlePolygonsPaths = []
              for (const point of points) {
                let coord = point.split(",")
                googlePolygonsPaths.push({ lat: +coord[1], lng: +coord[0] })
              }
              googlePolygons.push(googlePolygonsPaths)
            }
    
            /** MARKER PARSE **/    
            for (const marker of markers) {
              var coords = marker.getElementsByTagName('coordinates')[0].childNodes[0].nodeValue.trim()
              let coord = coords.split(",")
              googleMarkers.push({ lat: +coord[1], lng: +coord[0] })
            }
          }
        } else {
          throw "error while parsing"
        }
    
        return { markers: googleMarkers, polygons: googlePolygons }
    
      }
    

    output

    markers: Array(3)
    0: {lat: 37.42390182131783, lng: -122.0914977709329}
    ...
    
    polygons: Array(1)
    0: Array(88)
    0: {lat: -37.79825999283025, lng: 144.9165994157198}
    ...
    

提交回复
热议问题