【问题标题】:leaflet to geoJSON with angular, download not triggered带角度的geoJSON传单,未触发下载
【发布时间】:2021-11-04 17:33:06
【问题描述】:

我需要实现一个按钮,将多边形(或任何形状)下载到 geojson 文件中,但不会触发下载。 (尝试使用 2 个不同的功能,但都不起作用)我实际上不知道我的功能是否错误/遗漏了什么或问题出在 .html 中

app.component.ts

import { Component } from '@angular/core';

import { latLng, tileLayer, DrawOptions, DrawEvents } from 'leaflet';
import { icon, marker, polyline, circle, rectangle, polygon} from 'leaflet';
import { LeafletModule } from '@asymmetrik/ngx-leaflet';
import { LeafletDrawModule } from '@asymmetrik/ngx-leaflet-draw';

import { DomSanitizer, SafeUrl, SafeResourceUrl } from '@angular/platform-browser';

import { FeatureGroup, featureGroup } from 'leaflet';

@Component({
  selector: 'app-root',
  templateUrl: './app.component.html',
  styleUrls: ['./app.component.css']
})
export class AppComponent {
  title = 'tesiangularp';

  options = {
    layers: [
      tileLayer('https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', {
        attribution: '© OpenStreetMap contributors'
      })
    ],
    zoom: 7,
    center: latLng([ 41.471276, 12.907632 ])
  };

  layersControl = {
    baseLayers: {
      'Open Street Map': tileLayer('http://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', { 
maxZoom: 18, attribution: '...' }),
      'Satellite View Map': tileLayer('http://{s}.google.com/vt/lyrs=s&x={x}&y={y}&z={z}', { 
maxZoom: 18, attribution: '...',  subdomains:['mt0','mt1','mt2','mt3']})
    },
    overlays: {

    }
      }

  drawnItems: FeatureGroup = featureGroup();

  drawOptions = {
    edit: {
      featureGroup: this.drawnItems
    },
    Draw: {

    }
  };

  public onDrawCreated(e: any) {
    this.drawnItems.addLayer((e as DrawEvents.Created).layer);
  }

  geoExport =() => {
    let nodata = '{"type":"FeatureCollection","features":[]}';
    let jsonData = (JSON.stringify(this.drawnItems.toGeoJSON()));
    let dataUri = 'data:application/json;charset=utf-8,'+ encodeURIComponent(jsonData);
    let datenow = new Date();
    let datenowstr = datenow.toLocaleDateString('en-GB');
    let exportFileDefaultName = 'export_draw_'+ datenowstr + '.geojson';
    let linkElement = document.createElement('a');
    linkElement.setAttribute('href', dataUri);
    linkElement.setAttribute('download', exportFileDefaultName);
    if (jsonData == nodata) {
      alert('No features are drawn');
    } else {
      linkElement.click();
    }
  }

  exportJson() {
    var data = this.drawnItems.toGeoJSON();
    var convertedData = 'text/json;charset=UTF-8,' + encodeURIComponent(JSON.stringify(data));
    document.getElementById('export')?.setAttribute('href', 'data:' + convertedData);
    document.getElementById('export')?.setAttribute('download', 'data.json');
  }

}

app.component.html

<div class="map"
  leaflet
  leafletDraw
  [leafletOptions]="options"
  [leafletLayersControl]="layersControl"
  [leafletDrawOptions]="drawOptions"
  (leafletDrawCreated)="onDrawCreated($event)">

    <div [leafletLayer]="drawnItems"></div>

</div>

<a>
  <div style="margin: 2px 0px 2px 0px;">
      <button onclick= "exportJson()">Download</button>
  </div>
</a>

【问题讨论】:

  • 99% 的情况下,在 Angular 应用程序中使用 document.getElementById() 意味着你做错了。此外,我在任何地方都看不到带有 id="export" 的元素,而且您也不是 .click()ing 假定的
  • 我是 100% 的新手,从各种帖子中获取代码片段并将其放在一起尝试使其工作,我应该如何重写它?

标签: javascript angular leaflet geojson leaflet.draw


【解决方案1】:

浏览器处理客户端文件创建的方式有所不同。所以,我会使用一个名为 file-saver 的库。

npm install file-saver

然后导入到组件中

import { saveAs } from 'file-saver';

并保存您的 geojson

const geojson = this.drawnItems.toGeoJSON();
const blob = new Blob([geojson], {type: 'application/json;charset=utf-8'});
saveAs(blob, 'drawnItems.geojson');

【讨论】:

  • 它说我的geojson不存在(????)
猜你喜欢
  • 1970-01-01
  • 2013-08-30
  • 2019-08-14
  • 1970-01-01
  • 2016-05-29
  • 1970-01-01
  • 2018-09-30
  • 2020-06-30
  • 2020-07-30
相关资源
最近更新 更多