import real from '../src/data/realBases.js' import fs from 'fs' import path from 'path' import { fileURLToPath } from 'url' const __dirname = path.dirname(fileURLToPath(import.meta.url)) const b = real.find((x) => x.name === '东莞壹号农业') if (!b) throw new Error('东莞壹号农业 not found') const lon0 = b.lon0 const lat0 = b.lat0 const mPerDegLat = 111320 const mPerDegLon = 111320 * Math.cos((lat0 * Math.PI) / 180) const toLL = (mx, my) => [ +(lon0 + mx / mPerDegLon).toFixed(7), +(lat0 + my / mPerDegLat).toFixed(7), ] function flatToRing(flat) { const ring = [] for (let i = 0; i < flat.length; i += 2) ring.push(toLL(flat[i], flat[i + 1])) if (ring.length && (ring[0][0] !== ring.at(-1)[0] || ring[0][1] !== ring.at(-1)[1])) { ring.push([...ring[0]]) } return ring } function flatToPts(flat, prefix) { const pts = [] for (let i = 0; i < flat.length; i += 2) { const [lng, lat] = toLL(flat[i], flat[i + 1]) pts.push({ code: `${prefix}-${String(pts.length + 1).padStart(2, '0')}`, lng, lat }) } return pts } const ZNAME = { A: '抗旱性试验区', B: '抗寒性试验区' } const zones = b.plots.map((p, i) => { const flat = p.r[0] || p.r const prefix = `P${i + 1}` const pts = flatToPts(p.s || [], prefix) const step = pts.length > 40 ? Math.ceil(pts.length / 28) : 1 const sampled = pts.filter((_, idx) => idx % step === 0) return { id: prefix, part: p.part, sub: p.sub, name: `分区${p.sub} · ${ZNAME[p.sub] || '试验区'}`, role: p.role, group: p.g, mu: p.mu, ring: flatToRing(flat), points: sampled, pointTotal: pts.length, } }) const allPts = zones.flatMap((z) => z.points.map((pt) => ({ ...pt, zoneId: z.id, role: z.role }))) const out = { id: 'FN-155', key: b.key, name: b.name, prov: b.prov, city: b.city, crop: b.crop, lon0, lat0, mu: b.mu, zones, samplePointCount: allPts.length, plantCount: 1039, gridCount: 55, } const dir = path.join(__dirname, '../src/api/mock') fs.mkdirSync(dir, { recursive: true }) const file = path.join(dir, 'dongguan-map.json') fs.writeFileSync(file, JSON.stringify(out)) console.log('zones', zones.length, 'points', allPts.length, 'bytes', fs.statSync(file).size)