// 示例 3:按矩形 + 按条件表达式查询实体要素。 // // 用法: // node 03_query_features.js [mapid] [version] 'use strict'; const { makeClient, sampleMapid, sampleVersion } = require('./_common'); function parseBounds(raw) { if (typeof raw === 'string') { return raw.replace(/^\[|\]$/g, '').split(',').map(Number); } if (Array.isArray(raw)) return raw.map(Number); if (raw && raw.min && raw.max) { return [raw.min.x, raw.min.y, raw.max.x, raw.max.y]; } throw new Error(`unknown bounds shape: ${JSON.stringify(raw)}`); } (async () => { const svc = makeClient(); const mapid = process.argv[2] || sampleMapid(); const version = process.argv[3] || sampleVersion(); console.log('[1/3] 读取 bounds'); const meta = await svc.metadata(mapid, version); const [x1, y1, x2, y2] = parseBounds(meta.bounds); console.log(' bounds =', meta.bounds); // 要素里没有图层名字段——只有 layerindex;名字要查 metadata.layers(每项 {index, name, ...}) const layers = typeof meta.layers === 'string' ? JSON.parse(meta.layers) : (meta.layers || []); const layerNameOf = (idx) => (layers.find((l) => l.index === idx) || {}).name || `?(${idx})`; console.log('[2/3] 按矩形查实体(querytype=rect, limit=10)'); const rectRes = await svc.queryFeatures({ querytype: 'rect', mapid, version, x1, y1, x2, y2, limit: 10, fields: 'name,objectid,layerindex', }); const result = (rectRes && rectRes.result) || {}; const features = Array.isArray(result) ? result : (result.features || []); if (features.length) { console.log(' matched:', features.length, 'features'); console.log(' first:', JSON.stringify(features[0]).slice(0, 300)); } else { console.log(' (no features)'); } console.log('[3/3] 按条件查实体(querytype=condition)'); const condRes = await svc.queryFeatures({ querytype: 'condition', mapid, version, condition: "name<>''", limit: 5, fields: 'name,objectid,layerindex', }); const cr = condRes && condRes.result; if (Array.isArray(cr)) { // result 里每项是扁平字段对象(不是 GeoJSON properties 包裹) cr.slice(0, 3).forEach((f) => { console.log(' -', f.name, '| layer=', layerNameOf(f.layerindex)); }); } else { console.log(' response:', JSON.stringify(condRes).slice(0, 300)); } })().catch((e) => { console.error('失败:', e.body || e.message || e); process.exit(1); });