| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879 |
- 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)
|