Skip to content

Commit a6fd597

Browse files
committed
feat: feature as geojson
# Conflicts: # src/layers/vector.ios.ts
1 parent 274f6b8 commit a6fd597

File tree

3 files changed

+57
-21
lines changed

3 files changed

+57
-21
lines changed

src/layers/vector.android.ts

Lines changed: 27 additions & 8 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
setLabelRenderOrder(order: com.carto.layers.VectorTileRenderOrder) {
5765
this.getNative().setLabelRenderOrder(order);
@@ -85,20 +93,31 @@ export abstract class BaseVectorTileLayer<T extends com.carto.layers.VectorTileL
8593
const geometry = feature.getGeometry();
8694
let position = info.getClickPos();
8795
let featurePos = geometry.getCenterPos();
88-
96+
let projection: com.carto.projections.Projection;
97+
const dataSourceProjection = this.getNative().getDataSource().getProjection();
8998
if (this.projection) {
90-
const layerProj = this.getNative().getDataSource().getProjection();
91-
const nProj = this.projection.getNative();
92-
featurePos = nProj.fromWgs84(layerProj.toWgs84(featurePos));
93-
position = nProj.fromWgs84(layerProj.toWgs84(position));
99+
projection = this.projection.getNative();
100+
featurePos = projection.fromWgs84(dataSourceProjection.toWgs84(featurePos));
101+
position = projection.fromWgs84(dataSourceProjection.toWgs84(position));
94102
}
103+
const geoFeature = {
104+
id: info.getFeatureId(),
105+
layer: info.getFeatureLayerName(),
106+
get geometry() {
107+
const writer = getGeojsonWriter();
108+
writer.setSourceProjection(dataSourceProjection);
109+
return JSON.parse(getGeojsonWriter().writeGeometry(geometry));
110+
},
111+
properties: nativeVariantToJS(info.getFeature().getProperties()),
112+
};
95113
return (
96114
this.listener.onVectorTileClicked.call(this.listener, {
97115
clickType: info.getClickType().swigValue(),
98116
layer: this,
99-
featureId: info.getFeatureId(),
100-
featureData: nativeVariantToJS(info.getFeature().getProperties()),
101-
featureLayerName: info.getFeatureLayerName(),
117+
feature: geoFeature,
118+
featureId: geoFeature.id,
119+
featureData: geoFeature.properties,
120+
featureLayerName: geoFeature.layer,
102121
featureGeometry: geometry,
103122
featurePosition: fromNativeMapPos(featurePos),
104123
position: fromNativeMapPos(position),

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 & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,14 @@ export class NTVectorElementEventListenerImpl extends NTVectorElementEventListen
7474
}
7575
}
7676

77+
let geojsonWriter: NTGeoJSONGeometryWriter;
78+
function getGeojsonWriter() {
79+
if (!geojsonWriter) {
80+
geojsonWriter = NTGeoJSONGeometryWriter.alloc().init();
81+
}
82+
return geojsonWriter;
83+
}
84+
7785
@NativeClass
7886
export class NTVectorTileEventListenerImpl extends NTVectorTileEventListener {
7987
private _layer: WeakRef<BaseVectorLayer<any, any>>;
@@ -104,23 +112,31 @@ export class NTVectorTileEventListenerImpl extends NTVectorTileEventListener {
104112
let position = info.getClickPos();
105113
let featurePos = geometry.getCenterPos();
106114

115+
let projection: NTProjection;
116+
const dataSourceProjection = this._layer.get().getNative().getDataSource().getProjection();
107117
if (this.projection) {
108-
const layerProj = this._layer
109-
.get()
110-
.getNative()
111-
.getDataSource()
112-
.getProjection();
113-
const nProj = this.projection.getNative();
114-
featurePos = nProj.fromWgs84(layerProj.toWgs84(featurePos));
115-
position = nProj.fromWgs84(layerProj.toWgs84(position));
118+
projection = this.projection.getNative();
119+
featurePos = projection.fromWgs84(dataSourceProjection.toWgs84(featurePos));
120+
position = projection.fromWgs84(dataSourceProjection.toWgs84(position));
116121
}
122+
const geoFeature = {
123+
id: info.getFeatureId(),
124+
layer: info.getFeatureLayerName(),
125+
get geometry() {
126+
const writer = getGeojsonWriter();
127+
writer.setSourceProjection(dataSourceProjection);
128+
return JSON.parse(getGeojsonWriter().writeGeometry(geometry));
129+
},
130+
properties: nativeVariantToJS(info.getFeature().getProperties()),
131+
};
117132
return (
118133
owner.onVectorTileClicked({
119134
clickType: info.getClickType() as any,
120135
layer: this._layer.get() as any,
121-
featureId: info.getFeatureId(),
122-
featureData: nativeVariantToJS(info.getFeature().getProperties()),
123-
featureLayerName: info.getFeatureLayerName(),
136+
feature: geoFeature,
137+
featureId: geoFeature.id,
138+
featureData: geoFeature.properties,
139+
featureLayerName: geoFeature.layer,
124140
featureGeometry: geometry,
125141
featurePosition: fromNativeMapPos(featurePos),
126142
position: fromNativeMapPos(position)
@@ -195,7 +211,7 @@ export class VectorLayer extends BaseVectorLayer<NTVectorLayer, VectorLayerOptio
195211
if (!!options.dataSource) {
196212
const dataSource = options.dataSource.getNative();
197213
if (dataSource) {
198-
return NTVectorLayer.alloc().initWithDataSource((options.dataSource as VectorDataSource<any, any>).getNative());
214+
return NTVectorLayer.alloc().initWithDataSource(options.dataSource.getNative());
199215
}
200216
}
201217
return null;
@@ -247,7 +263,7 @@ export class EditableVectorLayer extends BaseVectorLayer<NTEditableVectorLayer,
247263
if (!!options.dataSource) {
248264
const dataSource = options.dataSource.getNative();
249265
if (dataSource) {
250-
const result = NTEditableVectorLayer.alloc().initWithDataSource((options.dataSource as VectorDataSource<any, any>).getNative());
266+
const result = NTEditableVectorLayer.alloc().initWithDataSource(options.dataSource.getNative());
251267
// result.setVectorEditEventListener(NTVectorEditEventListenerImpl.initWithOwner(new WeakRef(this)));
252268
// result.setVectorElementEventListener(NTVectorElementEventListenerImpl.initWithOwner(new WeakRef(this)));
253269
return result;

0 commit comments

Comments
 (0)