// 示例 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);
});