# Map 分析与查询

## Map 方法 · 分析与查询

示例页：[`/draw`](/draw)、[`/advanced`](/advanced)

### drawSearch(callback, param?)

* **类型**：`Function`
* **参数**：
  * `{Function} callback` — 查询完成回调
  * `{Object} [param]` — 绘制类型、过滤图层等
* **返回值**：无（无有效 callback 则直接 return）

```js
map.drawSearch((results, num) => {
  console.log('命中', num, results);
}, { type: 'Polygon' });
```

### cancelDrawing() / clearDrawing()

* **类型**：`Function`
* **参数**：无
* **返回值**：无

```js
map.cancelDrawing();
map.clearDrawing();
```

### getDrawResult(callback)

* **类型**：`Function`
* **参数**：
  * `{Function} callback(results, resultsNum)`
* **返回值**：无

```js
map.getDrawResult((results, num) => console.log(results, num));
```

### circleSearch(data, callback, radius?, options?)

* **类型**：`Function`
* **归属**：融合（内部创建 **OL** VectorLayer 画圆）
* **参数**：
  * `{Object} data` — 至少含 `objX`、`objY`（圆心，地图坐标）
  * `{Function} [callback]` — 返回命中 code 列表
  * `{number} [radius]` — 缓冲半径（公里级，turf buffer；默认约 `0.01`）
  * `{Object} [options]`
    * `{string} [options.layerCode]` — 仅在该云图层的 `turfGeometries` 上本地相交
    * `{string} [options.color]` — 命中要素临时样式色
* **返回值**：无
* **用法**：

```js
map.circleSearch(
  { objX: 13528430, objY: 3676466 },
  (codes) => console.log(codes),
  0.05,
  { layerCode: 'hydrant', color: '#f00' }
);
```

### cancelCircleSearch()

* **类型**：`Function`
* **说明**：当前为空实现占位。

### analysis(type, options)

* **类型**：`Function`
* **参数**：
  * `{string} type` — 分析模式，见下表
  * `{Object} options`
    * `{string[]} options.analysisLayerCodes` — 参与查询的图层（框选类必填，否则会查到不该查的层）
    * `{Function} options.finishCallback` — 结束回调，参数随 type 变化
    * `{Array} [options.data]` — 结果回显数据（`result` / `closeValveResult` 等）
    * `{string} [options.lineColor]` / `{string} [options.flowColor]` / `{number} [options.lineWidth]` — `flow` / `result` / `flowDirection` 流动画样式
    * `{boolean} [options.static]` — `true` 时只画虚线不滚动（大数据压测）
    * `{string} [options.renderMode]` — 默认 `'canvas'`（批量 Canvas）；传 `'vector'` 才用旧 Vector 动画
* **返回值**：无
* **用法**：

```js
// 默认 Canvas 批量流向（含小数据）
map.analysis('result', {
  data: [{ objXStart, objYStart, objXEnd, objYEnd }],
  lineColor: '#191970',
  flowColor: '#FFFF73'
});

// 10万级同样默认 canvas；也可显式写出
map.analysis('result', {
  data, // 行数组或 Float64Array([x0,y0,x1,y1,...])
  renderMode: 'canvas',
  lineColor: '#191970',
  flowColor: '#FFFF73',
  lineWidth: 1.5,
  flowSpeed: 28
});
// 等价：map.showFlowNetwork(data, { lineColor, flowColor, lineWidth });

// 仅调试旧动画时：
// renderMode: 'vector'

map.clearAnalysis(); // 清空分析层 / Canvas 流向层并停止动画
```

#### analysis type

| type | 交互 | finishCallback 典型参数 |
|------|------|-------------------------|
| `slope` | 绘面 | `(objCodes)` |
| `crossSection` | 绘线 | `(objCodes, distance[])` |
| `verticalSection` | 两点选管线 | `(results[])` |
| `verticalSectionResult` | 无交互，画结果线 | — |
| `flowDirection` | 绘面 | `(objCodes)` |
| `result` | 用 `options.data` 画流动画 | — |
| `trace` / `traceSource` / `connectedness` | 点选管线 | `(objCodes)` |
| `closeValve` | 点选 | `(objCodes)` |
| `closeValveResult` | 画关阀结果 | — |
| `point` | 点选管点 | `(objCodes)` |

### cancelAnalysis()

* **类型**：`Function`
* **参数**：无
* **返回值**：无
* **说明**：取消当前分析绘制交互；会停止分析图层上的流动画 rAF。

```js
map.cancelAnalysis();
```

### clearAnalysis()

* **类型**：`Function`
* **参数**：无
* **返回值**：无
* **说明**：停止分析层全部 feature 动画并 `source.clear()`，同时取消绘制。

```js
map.clearAnalysis();
```

### statistics(layerCodes, options?)

* **类型**：`Function`
* **参数**：
  * `{string[]} layerCodes`
  * `{Object} [options]` — 传给 `layer.changeStyle`；省略则 `layer.resume()`
* **返回值**：无

```js
map.statistics(['pipe'], { /* 分级样式 */ });
map.statistics(['pipe']); // 恢复
```

### statisticsByField(callback, options)

* **类型**：`Function`
* **参数**：
  * `{Function} callback(result)` — `result` 为 `{ [layerCode]: AggregationResults }`
  * `{Object} options` — 可含 `layerCodes` 过滤，以及统计字段等（并入 `_statistics`）
* **返回值**：无
* **说明**：用户绘面后对 GeoServer 图层做聚合统计。

```js
map.statisticsByField((result) => {
  console.log(result);
}, { layerCodes: ['pipe'] });
```

### isPointInRange(data, coordinates)

* **类型**：`Function`
* **参数**：
  * `{Object} data` — 含 `objX`、`objY`
  * `{number[][]} coordinates` — 多边形环；若不闭合会自动闭合
* **返回值**：`boolean`

```js
const inside = map.isPointInRange(
  { objX: 13528430, objY: 3676466 },
  [[x1,y1],[x2,y2],[x3,y3],[x1,y1]]
);
```

### getPointsInRange(data, coordinates)

* **类型**：`Function`
* **参数**：
  * `{Array<Object>} data` — 点列表（含 `objX`/`objY`/`objCode`）
  * `{number[][]} coordinates` — 多边形环
* **返回值**：`Array` — 落在范围内的 `objCode` 列表

```js
const codes = map.getPointsInRange(list, ring);
```

---
