extract-dongguan.mjs 2.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. import real from '../src/data/realBases.js'
  2. import fs from 'fs'
  3. import path from 'path'
  4. import { fileURLToPath } from 'url'
  5. const __dirname = path.dirname(fileURLToPath(import.meta.url))
  6. const b = real.find((x) => x.name === '东莞壹号农业')
  7. if (!b) throw new Error('东莞壹号农业 not found')
  8. const lon0 = b.lon0
  9. const lat0 = b.lat0
  10. const mPerDegLat = 111320
  11. const mPerDegLon = 111320 * Math.cos((lat0 * Math.PI) / 180)
  12. const toLL = (mx, my) => [
  13. +(lon0 + mx / mPerDegLon).toFixed(7),
  14. +(lat0 + my / mPerDegLat).toFixed(7),
  15. ]
  16. function flatToRing(flat) {
  17. const ring = []
  18. for (let i = 0; i < flat.length; i += 2) ring.push(toLL(flat[i], flat[i + 1]))
  19. if (ring.length && (ring[0][0] !== ring.at(-1)[0] || ring[0][1] !== ring.at(-1)[1])) {
  20. ring.push([...ring[0]])
  21. }
  22. return ring
  23. }
  24. function flatToPts(flat, prefix) {
  25. const pts = []
  26. for (let i = 0; i < flat.length; i += 2) {
  27. const [lng, lat] = toLL(flat[i], flat[i + 1])
  28. pts.push({ code: `${prefix}-${String(pts.length + 1).padStart(2, '0')}`, lng, lat })
  29. }
  30. return pts
  31. }
  32. const ZNAME = { A: '抗旱性试验区', B: '抗寒性试验区' }
  33. const zones = b.plots.map((p, i) => {
  34. const flat = p.r[0] || p.r
  35. const prefix = `P${i + 1}`
  36. const pts = flatToPts(p.s || [], prefix)
  37. const step = pts.length > 40 ? Math.ceil(pts.length / 28) : 1
  38. const sampled = pts.filter((_, idx) => idx % step === 0)
  39. return {
  40. id: prefix,
  41. part: p.part,
  42. sub: p.sub,
  43. name: `分区${p.sub} · ${ZNAME[p.sub] || '试验区'}`,
  44. role: p.role,
  45. group: p.g,
  46. mu: p.mu,
  47. ring: flatToRing(flat),
  48. points: sampled,
  49. pointTotal: pts.length,
  50. }
  51. })
  52. const allPts = zones.flatMap((z) => z.points.map((pt) => ({ ...pt, zoneId: z.id, role: z.role })))
  53. const out = {
  54. id: 'FN-155',
  55. key: b.key,
  56. name: b.name,
  57. prov: b.prov,
  58. city: b.city,
  59. crop: b.crop,
  60. lon0,
  61. lat0,
  62. mu: b.mu,
  63. zones,
  64. samplePointCount: allPts.length,
  65. plantCount: 1039,
  66. gridCount: 55,
  67. }
  68. const dir = path.join(__dirname, '../src/api/mock')
  69. fs.mkdirSync(dir, { recursive: true })
  70. const file = path.join(dir, 'dongguan-map.json')
  71. fs.writeFileSync(file, JSON.stringify(out))
  72. console.log('zones', zones.length, 'points', allPts.length, 'bytes', fs.statSync(file).size)