我正在使用ngx-leaflet演示尝试从获取请求中获取GeoJson以显示在LeafLet Map上。我使用http://geojson.io/构建了一个有效的GeoJson,并使用http://geojsonlint.com/进行了双重检查(感谢那些工具人)
我们在编译中没有错误或在控制台日志中显示。服务很好,但我们的geojson对象无处可寻。
我只是想在地图上显示geojson数据。任何帮助或建议表示赞赏。
Angular CLI: 1.6.5
Node: 8.3.0
OS: darwin x64
Angular: 5.2.1
... common, compiler, compiler-cli, core, forms, http
... language-service, platform-browser, platform-browser-dynamic
... router
@angular/animations: 5.2.2
@angular/cdk: 5.1.1
@angular/cli: 1.6.5
@angular/material: 5.1.1
@angular-devkit/build-optimizer: 0.0.41
@angular-devkit/core: 0.0.28
@angular-devkit/schematics: 0.0.51
@ngtools/json-schema: 1.1.0
@ngtools/webpack: 1.9.5
@schematics/angular: 0.1.16
typescript: 2.5.3
webpack: 3.10.0
<div leaflet style="height: 600px;"
[leafletOptions]="options"
[leafletLayers]="layers"
[leafletLayersControl]="layersControl">
</div>
州组成部分
import { Component, OnInit } from '@angular/core';
import { StateService } from "../state.service";
import {tileLayer, Layer, latLng} from "leaflet";
import {HttpClient} from "@angular/common/http";
import 'rxjs/add/operator/catch';
import 'rxjs/add/operator/map';
import { LeafletLayersDemoModel } from './layers-demo.model';
import * as L from 'leaflet';
@Component({
selector: 'app-state',
templateUrl: './state.component.html',
styleUrls: ['./state.component.css']
})
export class StateComponent implements OnInit {
public geo_json_data;
constructor(private state_service:StateService, public http:HttpClient) {
this.apply();
}
LAYER_OSM = {
id: 'openstreetmap',
name: 'Open Street Map',
enabled: false,
layer: tileLayer('http://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', {
maxZoom: 18,
attribution: 'Open Street Map'
})
};
geoJSON = {
id: 'geoJSON',
name: 'Geo JSON Polygon',
enabled: true,
layer: L.geoJSON(this.geo_json_data)
};
model = new LeafletLayersDemoModel(
[ this.LAYER_OSM],
this.LAYER_OSM.id,
[ this.geoJSON ]
);
layers: Layer[];
layersControl = {
baseLayers: {
'Open Street Map': this.LAYER_OSM.layer
},
overlays: {
GeoJSON: this.geoJSON.layer
}
};
options = {
zoom: 6,
center: latLng(41.2033, -74.2179)
};
apply() {
// Get the active base layer
const baseLayer = this.model.baseLayers.find((l: any) => (l.id === this.model.baseLayer));
// Get all the active overlay layers
const newLayers = this.model.overlayLayers
.filter((l: any) => l.enabled)
.map((l: any) => l.layer);
newLayers.unshift(baseLayer.layer);
this.layers = newLayers;
return false;
}
ngOnInit() {
console.log(this.state_service.state_id);
this.http.get('http://localhost:4200/assets/data/pa.geojson')
.subscribe((data) => {
this.geo_json_data = data;
console.log(this.geo_json_data);
},
error => {
console.log(error.text());
alert('GEO JSON GET FAILED');
});
}
}
您应该在收到数据后尝试在layers
中初始化subscribe
var(和其他):这是一个示例:您应该安装以下内容:
ng new geojsondemo
cd geojsondemo/
npm install leaflet --save
npm install @types/leaflet --save-dev
npm install @asymmetrik/ngx-leaflet --save
npm install leaflet-providers --save
npm install @types/leaflet-providers --save-dev
你的app.module.ts应该是这样的:
import { BrowserModule } from '@angular/platform-browser';
import { NgModule } from '@angular/core';
import { HttpClientModule } from '@angular/common/http';
import { LeafletModule } from '@asymmetrik/ngx-leaflet';
import { AppComponent } from './app.component';
@NgModule({
declarations: [
AppComponent
],
imports: [
BrowserModule,
LeafletModule,
HttpClientModule
],
providers: [],
bootstrap: [AppComponent]
})
export class AppModule { }
您的app.component.html应如下所示:
<div leaflet style="height: 300px"
[leafletLayers]="layers"
[leafletLayersControl]="layersControl"
[leafletCenter]="center"
[leafletFitBounds]="fitBounds"></div>
你的app.component.ts应如下所示:
import { Component, OnInit } from '@angular/core';
import { HttpClient } from '@angular/common/http';
import { Layer, tileLayer, geoJSON, LayerOptions } from 'leaflet';
import 'leaflet-providers';
@Component({
selector: 'app-root',
templateUrl: './app.component.html',
styleUrls: ['./app.component.css']
})
export class AppComponent implements OnInit {
layers: Layer[];
layersControl: any;
center = [59.9386300, 30.3141300];
fitBounds = [[60.2448369, 29.6998985], [59.6337832, 30.254172]];
constructor(private http: HttpClient) { }
ngOnInit() {
this.http.get<any>('/assets/geojson/admin_level_4.geojson')
.subscribe(geo1 => {
this.http.get<any>('/assets/geojson/admin_level_5.geojson')
.subscribe(geo2 => {
let defaultBaseLayer = tileLayer.provider('OpenStreetMap.Mapnik');
let defaultOverlay = geoJSON(geo1);
this.layers = [
defaultBaseLayer,
defaultOverlay
];
this.layersControl = {
baseLayers: {
'OpenStreetMap Mapnik': defaultBaseLayer,
'OpenStreetMap BlackAndWhite': tileLayer.provider('OpenStreetMap.BlackAndWhite')
},
overlays: {
'Overlay One': defaultOverlay,
'Overlay Two': geoJSON(geo2)
}
};
});
});
}
}
有两个基础层和两个叠加层。对于基础部分,我使用了传单 - 更加清晰的代码。对于叠加,我使用了两个geojson文件。提供自己的并改变路径。还提供一个中心和一个fitBounds。并且不要忘记将leaflet.css
添加到.angular-cli.json
,就像这样"styles": ["../node_modules/leaflet/dist/leaflet.css","styles.css"]