Skip to content

Commit 10cd609

Browse files
committed
feat: raster layer click
1 parent 28a6cab commit 10cd609

File tree

4 files changed

+142
-4
lines changed

4 files changed

+142
-4
lines changed

plugin/layers/raster.ios.d.ts

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,19 @@
1-
import { CartoOnlineRasterTileLayerOptions, RasterTileLayerOptions } from './raster';
1+
import { CartoOnlineRasterTileLayerOptions, RasterTileEventListener as IRasterTileEventListener, RasterTileLayerOptions } from './raster';
22
import { RasterTileLayerBase } from './raster.common';
3-
export declare class RasterTileLayer extends RasterTileLayerBase<NTRasterTileLayer, RasterTileLayerOptions> {
3+
import { Projection } from '../projections';
4+
export declare class NTRasterTileEventListenerImpl extends NTRasterTileEventListener {
5+
private _layer;
6+
private _owner;
7+
private projection?;
8+
static initWithOwner(owner: WeakRef<IRasterTileEventListener>, layer: WeakRef<RasterTileLayer>, projection?: Projection): NTRasterTileEventListenerImpl;
9+
onRasterTileClicked(info: NTRasterTileClickInfo): boolean;
10+
}
11+
export declare abstract class RasterTileLayerCommon<NativeClass extends NTRasterTileLayer, U extends RasterTileLayerOptions> extends RasterTileLayerBase<NativeClass, U> {
12+
setRasterTileEventListener(listener: IRasterTileEventListener, projection?: Projection): void;
13+
}
14+
export declare class RasterTileLayer extends RasterTileLayerCommon<NTRasterTileLayer, RasterTileLayerOptions> {
415
createNative(options: RasterTileLayerOptions): NTRasterTileLayer;
16+
setRasterTileEventListener(listener: IRasterTileEventListener, projection?: Projection): void;
517
}
618
export declare class CartoOnlineRasterTileLayer extends RasterTileLayerBase<NTCartoOnlineRasterTileLayer, CartoOnlineRasterTileLayerOptions> {
719
createNative(options: any): NTCartoOnlineRasterTileLayer;
Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
package com.akylas.carto.additions;
2+
3+
import android.os.Handler;
4+
import android.util.Log;
5+
6+
import com.carto.layers.RasterTileEventListener;
7+
import com.carto.ui.RasterTileClickInfo;
8+
9+
public class AKRasterTileEventListener extends RasterTileEventListener {
10+
Handler mainHandler = null;
11+
12+
public interface Listener {
13+
boolean onRasterTileClicked(final RasterTileClickInfo clickInfo);
14+
}
15+
16+
Listener listener = null;
17+
18+
public void setListener(Listener listener) {
19+
this.listener = listener;
20+
}
21+
22+
public AKRasterTileEventListener(Listener listener) {
23+
super();
24+
setListener(listener);
25+
}
26+
27+
@Override
28+
public boolean onRasterTileClicked(final RasterTileClickInfo clickInfo) {
29+
if (AKMapView.RUN_ON_MAIN_THREAD) {
30+
final Object[] arr = new Object[1];
31+
if (mainHandler == null) {
32+
mainHandler = new Handler(android.os.Looper.getMainLooper());
33+
}
34+
SynchronousHandler.postAndWait(mainHandler, new Runnable() {
35+
@Override
36+
public void run() {
37+
if (listener != null) {
38+
arr[0] = new Boolean(listener.onRasterTileClicked(clickInfo));
39+
} else {
40+
arr[0] = new Boolean(AKRasterTileEventListener.super.onRasterTileClicked(clickInfo));
41+
}
42+
}
43+
});
44+
if (arr[0] != null) {
45+
return (Boolean) arr[0];
46+
} else {
47+
return false;
48+
}
49+
} else {
50+
if (listener != null) {
51+
return new Boolean(listener.onRasterTileClicked(clickInfo));
52+
} else {
53+
return new Boolean(super.onRasterTileClicked(clickInfo));
54+
}
55+
}
56+
}
57+
}

src/layers/raster.d.ts

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,13 +10,25 @@ export enum RasterTileFilterMode {
1010
RASTER_TILE_FILTER_MODE_BICUBIC,
1111
}
1212

13+
export interface RasterTileClickInfo<T = DefaultLatLonKeys> {
14+
clickType: ClickType;
15+
layer: BaseVectorTileLayer<any, any>;
16+
position: GenericMapPos<T>;
17+
nearestColor: Color;
18+
interpolatedColor: Color;
19+
}
20+
export interface RasterTileEventListener<T = DefaultLatLonKeys> {
21+
onRasterTileClicked(info: RasterTileClickInfo<T>): boolean;
22+
}
23+
1324
export interface RasterTileLayerOptions extends TileLayerOptions {
1425
tileFilterMode?: RasterTileFilterMode;
1526
dataSource?: TileDataSource<any, any>;
1627
}
1728
export class RasterTileLayer extends TileLayer<any, RasterTileLayerOptions> {
1829
// dataSource?: TileDataSource<any, any>;
1930
tileFilterMode?: RasterTileFilterMode;
31+
setRasterTileEventListener<T = DefaultLatLonKeys>(listener: RasterTileEventListener<T>, projection?: Projection): void;
2032
}
2133

2234
export interface CartoOnlineRasterTileLayerOptions extends RasterTileLayerOptions {
@@ -49,4 +61,5 @@ export class HillshadeRasterTileLayer extends TileLayer<any, HillshadeRasterTile
4961
public getElevationAsync<T = DefaultLatLonKeys>(pos: GenericMapPos<T>, callback: (error: Error, res: number) => void);
5062
public getElevations<T = DefaultLatLonKeys>(pos: MapPosVector<T> | GenericMapPos<T>[]): DoubleVector;
5163
public getElevationsAsync<T = DefaultLatLonKeys>(pos: MapPosVector<T> | GenericMapPos<T>[], callback: (error: Error, res: DoubleVector) => void);
64+
setRasterTileEventListener<T = DefaultLatLonKeys>(listener: RasterTileEventListener<T>, projection?: Projection): void;
5265
}

src/layers/raster.ios.ts

Lines changed: 58 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,67 @@
1-
import { CartoOnlineRasterTileLayerOptions, HillshadeRasterTileLayerOptions, RasterTileLayerOptions } from './raster';
1+
import { CartoOnlineRasterTileLayerOptions, HillshadeRasterTileLayerOptions, RasterTileEventListener as IRasterTileEventListener, RasterTileLayerOptions } from './raster';
22
import { RasterTileLayerBase } from './raster.common';
33
import { nativeProperty } from '../';
4+
import { Projection } from '../projections';
5+
import { fromNativeMapPos } from '../core';
6+
import { Color } from '@nativescript/core';
47

5-
export class RasterTileLayer extends RasterTileLayerBase<NTRasterTileLayer, RasterTileLayerOptions> {
8+
@NativeClass
9+
export class NTRasterTileEventListenerImpl extends NTRasterTileEventListener {
10+
private _layer: WeakRef<RasterTileLayer>;
11+
private _owner: WeakRef<IRasterTileEventListener>;
12+
private projection?: Projection;
13+
14+
public static initWithOwner(owner: WeakRef<IRasterTileEventListener>, layer: WeakRef<RasterTileLayer>, projection?: Projection): NTRasterTileEventListenerImpl {
15+
const delegate = NTRasterTileEventListenerImpl.new() as NTRasterTileEventListenerImpl;
16+
delegate._owner = owner;
17+
delegate._layer = layer;
18+
delegate.projection = projection;
19+
return delegate;
20+
}
21+
public onRasterTileClicked(info: NTRasterTileClickInfo) {
22+
const owner = this._owner.get();
23+
if (owner && owner.onRasterTileClicked) {
24+
let position = info.getClickPos();
25+
if (this.projection) {
26+
const layerProj = this._layer.get().getNative().getDataSource().getProjection();
27+
const nProj = this.projection.getNative();
28+
position = nProj.fromWgs84(layerProj.toWgs84(position));
29+
}
30+
return (
31+
owner.onRasterTileClicked({
32+
clickType: info.getClickType() as any,
33+
layer: this._layer.get() as any,
34+
nearestColor: new Color(info.getNearestColor().getARGB()),
35+
interpolatedColor: new Color(info.getInterpolatedColor().getARGB()),
36+
position: fromNativeMapPos(position),
37+
}) || false
38+
);
39+
}
40+
return false;
41+
}
42+
}
43+
44+
export abstract class RasterTileLayerCommon<NativeClass extends NTRasterTileLayer, U extends RasterTileLayerOptions> extends RasterTileLayerBase<NativeClass, U> {
45+
setRasterTileEventListener(listener: IRasterTileEventListener, projection?: Projection) {
46+
if (listener) {
47+
this.getNative().setRasterTileEventListener(NTRasterTileEventListenerImpl.initWithOwner(new WeakRef(listener), new WeakRef(this), projection));
48+
} else {
49+
this.getNative().setRasterTileEventListener(null);
50+
}
51+
}
52+
}
53+
54+
export class RasterTileLayer extends RasterTileLayerCommon<NTRasterTileLayer, RasterTileLayerOptions> {
655
createNative(options: RasterTileLayerOptions) {
756
return NTRasterTileLayer.alloc().initWithDataSource(options.dataSource.getNative());
857
}
58+
setRasterTileEventListener(listener: IRasterTileEventListener, projection?: Projection) {
59+
if (listener) {
60+
this.getNative().setRasterTileEventListener(NTRasterTileEventListenerImpl.initWithOwner(new WeakRef(listener), new WeakRef(this), projection));
61+
} else {
62+
this.getNative().setRasterTileEventListener(null);
63+
}
64+
}
965
}
1066

1167
export class CartoOnlineRasterTileLayer extends RasterTileLayerBase<NTCartoOnlineRasterTileLayer, CartoOnlineRasterTileLayerOptions> {

0 commit comments

Comments
 (0)