Skip to content
This repository was archived by the owner on Jun 23, 2025. It is now read-only.

Commit 128c8f3

Browse files
Fluccionisebholstein
authored andcommitted
feat(AgmDataLayer): add loadGeoJson method
Closes #1003
1 parent 9b6b878 commit 128c8f3

4 files changed

Lines changed: 43 additions & 10 deletions

File tree

src/core/directives/data-layer.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -214,7 +214,7 @@ export class AgmDataLayer implements OnInit, OnDestroy, OnChanges {
214214
/**
215215
* The geoJson to be displayed
216216
*/
217-
@Input() geoJson: Object | null = null;
217+
@Input() geoJson: Object | string | null = null;
218218

219219
/**
220220
* The layer's style function.

src/core/services/google-maps-api-wrapper.ts

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,17 @@ export class GoogleMapsAPIWrapper {
7777
});
7878
}
7979

80+
/**
81+
* Creates a new google.map.Data layer for the current map
82+
*/
83+
createDataLayer(options?: mapTypes.DataOptions): Promise<mapTypes.Data> {
84+
return this._map.then(m => {
85+
let data = new google.maps.Data(options);
86+
data.setMap(m);
87+
return data;
88+
});
89+
}
90+
8091
/**
8192
* Determines if given coordinates are insite a Polygon path.
8293
*/

src/core/services/google-maps-types.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -389,6 +389,7 @@ export interface Data extends MVCObject {
389389
*/
390390
setStyle(style: () => void): void;
391391
forEach(callback: (feature: Feature) => void): void;
392+
loadGeoJson(url: string, options?: GeoJsonOptions, callback?: (feats: Feature[]) => void): void;
392393
/* tslint:enable */
393394
}
394395

src/core/services/managers/data-layer-manager.ts

Lines changed: 30 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -22,15 +22,14 @@ export class DataLayerManager {
2222
* Adds a new Data Layer to the map.
2323
*/
2424
addDataLayer(layer: AgmDataLayer) {
25-
const newLayer = this._wrapper.getNativeMap().then(m => {
26-
var dataLayer = new google.maps.Data(<DataOptions>{
27-
map: m,
28-
style: layer.style
29-
});
25+
const newLayer = this._wrapper.createDataLayer(<DataOptions>{
26+
style: layer.style
27+
})
28+
.then(d => {
3029
if (layer.geoJson) {
31-
dataLayer.features = dataLayer.addGeoJson(layer.geoJson);
30+
this.getDataFeatures(d, layer.geoJson).then(features => d.features = features);
3231
}
33-
return dataLayer;
32+
return d;
3433
});
3534
this._layers.set(layer, newLayer);
3635
}
@@ -42,7 +41,7 @@ export class DataLayerManager {
4241
});
4342
}
4443

45-
updateGeoJson(layer: AgmDataLayer, geoJson: Object) {
44+
updateGeoJson(layer: AgmDataLayer, geoJson: Object | string) {
4645
this._layers.get(layer).then(l => {
4746
l.forEach(function (feature: Feature) {
4847
l.remove(feature);
@@ -52,7 +51,7 @@ export class DataLayerManager {
5251
l.features.splice(index, 1);
5352
}
5453
});
55-
l.features = l.addGeoJson(geoJson);
54+
this.getDataFeatures(l, geoJson).then(features => l.features = features);
5655
});
5756
}
5857

@@ -76,4 +75,26 @@ export class DataLayerManager {
7675
});
7776
});
7877
}
78+
79+
/**
80+
* Extract features from a geoJson using google.maps Data Class
81+
* @param d : google.maps.Data class instance
82+
* @param geoJson : url or geojson object
83+
*/
84+
getDataFeatures(d: Data, geoJson: Object | string): Promise<Feature[]> {
85+
return new Promise<Feature[]>((resolve, reject) => {
86+
if (typeof geoJson === 'object') {
87+
try {
88+
const features = d.addGeoJson(geoJson);
89+
resolve(features);
90+
} catch (e) {
91+
reject(e);
92+
}
93+
} else if (typeof geoJson === 'string') {
94+
d.loadGeoJson(geoJson, null, resolve);
95+
} else {
96+
reject(`Impossible to extract features from geoJson: wrong argument type`);
97+
}
98+
});
99+
}
79100
}

0 commit comments

Comments
 (0)