@hzab/map-combine 0.4.2-alpha.6 → 0.4.2-alpha.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@hzab/map-combine",
3
- "version": "0.4.2-alpha.6",
3
+ "version": "0.4.2-alpha.7",
4
4
  "description": "地图组件",
5
5
  "main": "src",
6
6
  "scripts": {
@@ -1,6 +1,7 @@
1
1
  import { BasicElement, type BasicElementOption } from "./BasicElement";
2
2
 
3
3
  export interface BasicModelOption extends BasicElementOption {
4
+ name?: string;
4
5
  /** 经度 */
5
6
  lon: number;
6
7
  /** 纬度 */
@@ -16,7 +16,8 @@ export abstract class MapElement<T extends MapElementOption = MapElementOption>
16
16
  this.map = map;
17
17
  this._option = option;
18
18
  if (map.elements.has(option.name)) {
19
- throw new Error(`已存在同名元素 ${option.name}`);
19
+ console.error(new Error(`已存在同名元素 ${option.name}`));
20
+ return;
20
21
  }
21
22
  map.elements.set(option.name, this);
22
23
  }
@@ -5,6 +5,11 @@ export class MapEvent extends Eventful<{
5
5
  "pointer-move": () => void;
6
6
  "pointer-up": () => void;
7
7
  "left-click": () => void;
8
+ /**
9
+ * 获取当前点击位置的所有元素
10
+ * @returns
11
+ */
12
+ "drill-pick": (elements) => void;
8
13
  "right-click": () => void;
9
14
  "double-click": () => void;
10
15
  "view-change": () => void;
@@ -22,6 +22,7 @@ export function bindEvent(map: CesiumMap) {
22
22
  event.geography = map.canvasTgeography(event.canvas);
23
23
  let _target: any = undefined;
24
24
  const res = viewer.scene.pick(e.endPosition);
25
+
25
26
  const a = res ? (res.id ? res.id : res.primitive ? res.primitive : undefined) : undefined;
26
27
 
27
28
  if (a && !a.silent) {
@@ -64,6 +65,17 @@ export function bindEvent(map: CesiumMap) {
64
65
  target.onLClick?.();
65
66
  }
66
67
  event.trigger("left-click");
68
+
69
+ // 穿透拾取,获取点击位置的所有对象
70
+ const pickedObjects = viewer.scene.drillPick(e.position);
71
+ if (pickedObjects && pickedObjects.length > 0) {
72
+ event.trigger("drill-pick", {
73
+ event: e,
74
+ pickedTargets: pickedObjects.map((it) => it.id?.target),
75
+ sourceObjects: pickedObjects,
76
+ position: e.position,
77
+ });
78
+ }
67
79
  }, Cesium.ScreenSpaceEventType.LEFT_CLICK);
68
80
  handler.setInputAction(() => {
69
81
  if (target) {
@@ -11,6 +11,10 @@ export class CesiumModel extends BasicModel {
11
11
 
12
12
  this._shape = map.viewer.scene.primitives.add(
13
13
  Cesium.Model.fromGltf({
14
+ id: {
15
+ name: option.name,
16
+ target: this,
17
+ },
14
18
  show: this.option.show,
15
19
  url: this.option.model,
16
20
  modelMatrix: this._initMatrix(),
@@ -20,6 +20,8 @@ export function drawPoint(map: CesiumMap, point: Point<unknown>) {
20
20
  rotation: point.rotation,
21
21
  allowPicking: !point.silent,
22
22
  id: {
23
+ name: point.name,
24
+ target: point,
23
25
  cursor: point.cursor,
24
26
  silent: point.silent,
25
27
  onPointerIn() {
@@ -67,6 +67,8 @@ export function drawPolygon(map: CesiumMap, polygon: Polygon<unknown>) {
67
67
  );
68
68
 
69
69
  const _event = {
70
+ name: polygon.name,
71
+ target: polygon,
70
72
  cursor: polygon.cursor,
71
73
  silent: polygon.silent,
72
74
  onPointerIn() {
@@ -74,6 +74,8 @@ export function drawPolyline(map: CesiumMap, polyline: Polyline<unknown>) {
74
74
  );
75
75
 
76
76
  const _event = {
77
+ name: polyline.name,
78
+ target: polyline,
77
79
  cursor: polyline.cursor,
78
80
  silent: polyline.silent,
79
81
  onPointerIn() {
@@ -69,6 +69,27 @@ export function bindEvent(map: OpenlayerMap) {
69
69
  event.trigger("left-click");
70
70
  });
71
71
 
72
+ // 监听地图的单击事件
73
+ viewer.on("singleclick", function (e) {
74
+ // 使用 forEachFeatureAtPixel 查询该像素位置下的所有要素
75
+ const pickedObjects = [];
76
+ viewer.forEachFeatureAtPixel(e.pixel, function (feature, layer) {
77
+ // 这个回调函数会为每一个被点击到的要素执行
78
+ pickedObjects.push(feature);
79
+ // 返回 true 可以提前终止遍历
80
+ // return true;
81
+ });
82
+
83
+ if (pickedObjects.length > 0) {
84
+ event.trigger("drill-pick", {
85
+ event: e,
86
+ pickedTargets: pickedObjects.map((it) => it?.values_?.userData?.target),
87
+ sourceObjects: pickedObjects,
88
+ position: map.canvasTgeography(e.pixel),
89
+ });
90
+ }
91
+ });
92
+
72
93
  viewer.on("dblclick", () => {
73
94
  if (target) {
74
95
  target.onDbClick?.();
@@ -26,7 +26,12 @@ export function drawPoint(map: OpenlayerMap, point: Point<unknown>) {
26
26
  visible: point.show,
27
27
  });
28
28
  viewer.addLayer(layer);
29
- const feature = new Feature();
29
+ const feature = new Feature({
30
+ userData: {
31
+ name: point.name,
32
+ target: point,
33
+ },
34
+ });
30
35
  const geometry = new OlPoint([0, 0]);
31
36
  const style = new Style({
32
37
  image: new Icon({
@@ -26,7 +26,12 @@ export function drawPolygon(map: OpenlayerMap, polygon: Polygon<unknown>) {
26
26
  let status = 0;
27
27
  let skip = 0;
28
28
 
29
- const feature = new Feature();
29
+ const feature = new Feature({
30
+ userData: {
31
+ name: polygon.name,
32
+ target: polygon,
33
+ },
34
+ });
30
35
  const geometry = new OlPolygon([
31
36
  [
32
37
  [0, 0],
@@ -25,7 +25,12 @@ export function drawPolyline(map: OpenlayerMap, polyline: Polyline<unknown>) {
25
25
  let status = 0;
26
26
  let skip = 0;
27
27
 
28
- const feature = new Feature();
28
+ const feature = new Feature({
29
+ userData: {
30
+ name: polyline.name,
31
+ target: polyline,
32
+ },
33
+ });
29
34
  const geometry = new LineString([
30
35
  [0, 0],
31
36
  [0, 0],
@@ -64,6 +69,8 @@ export function drawPolyline(map: OpenlayerMap, polyline: Polyline<unknown>) {
64
69
  });
65
70
 
66
71
  const _event = {
72
+ name: polyline.name,
73
+ target: polyline,
67
74
  cursor: polyline.cursor,
68
75
  silent: polyline.silent,
69
76
  onPointerIn() {