Skip to content

Commit e9eb3ae

Browse files
committed
feat: feature as geojson
1 parent 736ffc3 commit e9eb3ae

File tree

3 files changed

+59
-19
lines changed

3 files changed

+59
-19
lines changed

src/layers/vector.android.ts

Lines changed: 29 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,14 @@ export const VectorElementDragResult = {
5252
},
5353
};
5454

55+
let geojsonWriter: com.carto.geometry.GeoJSONGeometryWriter;
56+
function getGeojsonWriter() {
57+
if (!geojsonWriter) {
58+
geojsonWriter = new com.carto.geometry.GeoJSONGeometryWriter();
59+
}
60+
return geojsonWriter;
61+
}
62+
5563
export abstract class BaseVectorTileLayer<T extends com.carto.layers.VectorTileLayer, U extends VectorTileLayerOptions> extends TileLayer<T, U> {
5664
projection?: Projection;
5765
listener?: IVectorTileEventListener;
@@ -94,20 +102,31 @@ export abstract class BaseVectorTileLayer<T extends com.carto.layers.VectorTileL
94102
const geometry = feature.getGeometry();
95103
let position = info.getClickPos();
96104
let featurePos = geometry.getCenterPos();
97-
105+
let projection: com.carto.projections.Projection;
106+
const dataSourceProjection = this.getNative().getDataSource().getProjection();
98107
if (this.projection) {
99-
const layerProj = this.getNative().getDataSource().getProjection();
100-
const nProj = this.projection.getNative();
101-
featurePos = nProj.fromWgs84(layerProj.toWgs84(featurePos));
102-
position = nProj.fromWgs84(layerProj.toWgs84(position));
108+
projection = this.projection.getNative();
109+
featurePos = projection.fromWgs84(dataSourceProjection.toWgs84(featurePos));
110+
position = projection.fromWgs84(dataSourceProjection.toWgs84(position));
103111
}
112+
const geoFeature = {
113+
id: info.getFeatureId(),
114+
layer: info.getFeatureLayerName(),
115+
get geometry() {
116+
const writer = getGeojsonWriter();
117+
writer.setSourceProjection(dataSourceProjection);
118+
return JSON.parse(getGeojsonWriter().writeGeometry(geometry));
119+
},
120+
properties: nativeVariantToJS(info.getFeature().getProperties()),
121+
};
104122
return (
105123
this.listener.onVectorTileClicked.call(this.listener, {
106124
clickType: info.getClickType().swigValue(),
107125
layer: this,
108-
featureId: info.getFeatureId(),
109-
featureData: nativeVariantToJS(info.getFeature().getProperties()),
110-
featureLayerName: info.getFeatureLayerName(),
126+
feature: geoFeature,
127+
featureId: geoFeature.id,
128+
featureData: geoFeature.properties,
129+
featureLayerName: geoFeature.layer,
111130
featureGeometry: geometry,
112131
featurePosition: fromNativeMapPos(featurePos),
113132
position: fromNativeMapPos(position),
@@ -216,7 +235,7 @@ export class VectorLayer extends BaseVectorLayer<com.carto.layers.VectorLayer, V
216235
if (!!options.dataSource) {
217236
const dataSource = options.dataSource.getNative();
218237
if (dataSource) {
219-
return new com.carto.layers.VectorLayer((options.dataSource as VectorDataSource<any, any>).getNative());
238+
return new com.carto.layers.VectorLayer(options.dataSource.getNative());
220239
}
221240
}
222241
return null;
@@ -240,7 +259,7 @@ export class EditableVectorLayer extends BaseVectorLayer<com.carto.layers.Editab
240259
if (!!options.dataSource) {
241260
const dataSource = options.dataSource.getNative();
242261
if (dataSource) {
243-
const result = new com.carto.layers.EditableVectorLayer((options.dataSource as VectorDataSource<any, any>).getNative());
262+
const result = new com.carto.layers.EditableVectorLayer(options.dataSource.getNative());
244263
// result.setVectorEditEventListener(VectorEditEventListenerImpl.initWithOwner(new WeakRef(this)));
245264
// result.setVectorElementEventListener(VectorElementEventListenerImpl.initWithOwner(new WeakRef(this)));
246265
return result;

src/layers/vector.d.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ export enum VectorElementDragResult {
2525
export interface VectorTileEventData<T = DefaultLatLonKeys> {
2626
clickType: ClickType;
2727
layer: BaseVectorTileLayer<any, any>;
28+
feature: any; // geojson object
2829
featureId: number;
2930
featureData: { [k: string]: string };
3031
featureLayerName: string;

src/layers/vector.ios.ts

Lines changed: 29 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,14 @@ export class NTVectorElementEventListenerImpl extends NTVectorElementEventListen
7070
}
7171
}
7272

73+
let geojsonWriter: NTGeoJSONGeometryWriter;
74+
function getGeojsonWriter() {
75+
if (!geojsonWriter) {
76+
geojsonWriter = NTGeoJSONGeometryWriter.alloc().init();
77+
}
78+
return geojsonWriter;
79+
}
80+
7381
@NativeClass
7482
export class NTVectorTileEventListenerImpl extends NTVectorTileEventListener {
7583
private _layer: WeakRef<BaseVectorLayer<any, any>>;
@@ -100,19 +108,31 @@ export class NTVectorTileEventListenerImpl extends NTVectorTileEventListener {
100108
let position = info.getClickPos();
101109
let featurePos = geometry.getCenterPos();
102110

111+
let projection: NTProjection;
112+
const dataSourceProjection = this._layer.get().getNative().getDataSource().getProjection();
103113
if (this.projection) {
104-
const layerProj = this._layer.get().getNative().getDataSource().getProjection();
105-
const nProj = this.projection.getNative();
106-
featurePos = nProj.fromWgs84(layerProj.toWgs84(featurePos));
107-
position = nProj.fromWgs84(layerProj.toWgs84(position));
114+
projection = this.projection.getNative();
115+
featurePos = projection.fromWgs84(dataSourceProjection.toWgs84(featurePos));
116+
position = projection.fromWgs84(dataSourceProjection.toWgs84(position));
108117
}
118+
const geoFeature = {
119+
id: info.getFeatureId(),
120+
layer: info.getFeatureLayerName(),
121+
get geometry() {
122+
const writer = getGeojsonWriter();
123+
writer.setSourceProjection(dataSourceProjection);
124+
return JSON.parse(getGeojsonWriter().writeGeometry(geometry));
125+
},
126+
properties: nativeVariantToJS(info.getFeature().getProperties()),
127+
};
109128
return (
110129
owner.onVectorTileClicked({
111130
clickType: info.getClickType() as any,
112131
layer: this._layer.get() as any,
113-
featureId: info.getFeatureId(),
114-
featureData: nativeVariantToJS(info.getFeature().getProperties()),
115-
featureLayerName: info.getFeatureLayerName(),
132+
feature: geoFeature,
133+
featureId: geoFeature.id,
134+
featureData: geoFeature.properties,
135+
featureLayerName: geoFeature.layer,
116136
featureGeometry: geometry,
117137
featurePosition: fromNativeMapPos(featurePos),
118138
position: fromNativeMapPos(position),
@@ -187,7 +207,7 @@ export class VectorLayer extends BaseVectorLayer<NTVectorLayer, VectorLayerOptio
187207
if (!!options.dataSource) {
188208
const dataSource = options.dataSource.getNative();
189209
if (dataSource) {
190-
return NTVectorLayer.alloc().initWithDataSource((options.dataSource as VectorDataSource<any, any>).getNative());
210+
return NTVectorLayer.alloc().initWithDataSource(options.dataSource.getNative());
191211
}
192212
}
193213
return null;
@@ -237,7 +257,7 @@ export class EditableVectorLayer extends BaseVectorLayer<NTEditableVectorLayer,
237257
if (!!options.dataSource) {
238258
const dataSource = options.dataSource.getNative();
239259
if (dataSource) {
240-
const result = NTEditableVectorLayer.alloc().initWithDataSource((options.dataSource as VectorDataSource<any, any>).getNative());
260+
const result = NTEditableVectorLayer.alloc().initWithDataSource(options.dataSource.getNative());
241261
// result.setVectorEditEventListener(NTVectorEditEventListenerImpl.initWithOwner(new WeakRef(this)));
242262
// result.setVectorElementEventListener(NTVectorElementEventListenerImpl.initWithOwner(new WeakRef(this)));
243263
return result;

0 commit comments

Comments
 (0)