唯杰地图 logo唯杰地图
VJMAP
EN

03_query_features.js

vjmap-service/examples/nodejs/03_query_features.js 2.5 KB68 行
原文
// 示例 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);
});