index.js 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164
  1. 'use strict'
  2. var fs = require('fs')
  3. var path = require('path')
  4. var spider = require('./spider')
  5. /**
  6. * 输出 JSON 数据
  7. * @Author https://github.com/modood
  8. * @DateTime 2016-10-08 17:16
  9. */
  10. module.exports = {
  11. outputJSON: outputJSON,
  12. provinces: require(path.resolve(__dirname, 'dist/provinces.json')),
  13. cities: require(path.resolve(__dirname, 'dist/cities.json')),
  14. areas: require(path.resolve(__dirname, 'dist/areas.json')),
  15. streets: require(path.resolve(__dirname, 'dist/streets.json')),
  16. address2: require(path.resolve(__dirname, 'dist/address2.json')),
  17. address3: require(path.resolve(__dirname, 'dist/address3.json')),
  18. address4: require(path.resolve(__dirname, 'dist/address4.json'))
  19. }
  20. /**
  21. * 输出 JSON 数据到 dist 目录下
  22. * @author modood <https://github.com/modood>
  23. * @datetime 2016-12-19 16:45
  24. */
  25. function outputJSON () {
  26. spider.getData(function (err, result) {
  27. if (err) return console.log(err)
  28. var provinces = result.provinces
  29. var cities = result.cities
  30. var areas = result.areas
  31. var streets = result.streets
  32. console.log('[1/3] 正在生成 “省份、城市” 二级联动数据...')
  33. var pc = getAddressPC(provinces, cities)
  34. console.log('[2/3] 正在生成 “省份、城市、区县” 三级联动数据...')
  35. var pca = getAddressPCA(provinces, cities, areas, streets)
  36. console.log('[3/3] 正在生成 “省份、城市、区县、乡镇” 四级联动数据...')
  37. var pcas = getAddressPCAS(provinces, cities, areas, streets)
  38. console.log('[1/7] 正在导出 “省份” JSON 数据...')
  39. outputFile('provinces', provinces)
  40. console.log('[2/7] 正在导出 “城市” JSON 数据...')
  41. outputFile('cities', cities)
  42. console.log('[3/7] 正在导出 “区县” JSON 数据...')
  43. outputFile('areas', areas)
  44. console.log('[4/7] 正在导出 “乡镇” JSON 数据...')
  45. outputFile('streets', streets)
  46. console.log('[5/7] 正在导出 “省份、城市”二级联动 JSON 数据...')
  47. outputFile('address2', pc)
  48. console.log('[6/7] 正在导出 “省份、城市、区县”三级联动 JSON 数据...')
  49. outputFile('address3', pca)
  50. console.log('[7/7] 正在导出 “省份、城市、区县、乡镇” 四级联动 JSON 数据...')
  51. outputFile('address4', pcas)
  52. console.log('数据更新完成!')
  53. })
  54. }
  55. /**
  56. * 获取省市二级联动数据
  57. * @Author https://github.com/modood
  58. * @DateTime 2016-10-09 15:25
  59. */
  60. function getAddressPC (provinces, cities) {
  61. var doc = {}
  62. // 过滤三级联动时才有效的名称
  63. var filterName = ['县', '省直辖县级行政区划', '自治区直辖县级行政区划']
  64. provinces.forEach(function (p) {
  65. doc[p.name] = cities.filter(function (c) {
  66. return p.code === c.parent_code && filterName.every(function (filterName) {
  67. return c.name !== filterName
  68. })
  69. }).map(function (c) {
  70. return c.name === '市辖区' ? p.name : c.name
  71. })
  72. })
  73. return doc
  74. }
  75. /**
  76. * 获取省市区三级联动数据
  77. * @Author https://github.com/modood
  78. * @DateTime 2016-10-09 16:00
  79. */
  80. function getAddressPCA (provinces, cities, areas, streets) {
  81. var doc = {}
  82. provinces.forEach(function (p) {
  83. doc[p.name] = {}
  84. cities.filter(function (c) {
  85. return p.code === c.parent_code
  86. }).forEach(function (c) {
  87. // 特殊城市单独处理(中山市、东莞市、儋州市和嘉峪关市没有县级行政区划)
  88. if (['441900', '442000', '460400', '620200'].indexOf(c.code) !== -1) {
  89. doc[p.name][c.name] = streets.filter(function (s) {
  90. return (c.code === '620200' ? '620201' : c.code) === s.parent_code
  91. }).map(function (s) {
  92. return s.name
  93. })
  94. return
  95. }
  96. doc[p.name][c.name] = areas.filter(function (a) {
  97. return c.code === a.parent_code
  98. }).map(function (a) {
  99. return a.name
  100. })
  101. })
  102. })
  103. return doc
  104. }
  105. /**
  106. * 获取省市区镇四级联动数据
  107. * @Author https://github.com/modood
  108. * @DateTime 2016-10-09 16:09
  109. */
  110. function getAddressPCAS (provinces, cities, areas, streets) {
  111. var doc = {}
  112. provinces.forEach(function (p) {
  113. doc[p.name] = {}
  114. cities.filter(function (c) {
  115. return p.code === c.parent_code
  116. }).forEach(function (c) {
  117. doc[p.name][c.name] = {}
  118. areas.filter(function (a) {
  119. return c.code === a.parent_code
  120. }).forEach(function (a) {
  121. doc[p.name][c.name][a.name] = streets.filter(function (s) {
  122. return a.code === s.parent_code
  123. }).map(function (s) {
  124. return s.name
  125. })
  126. })
  127. })
  128. })
  129. // 特殊区县单独处理(福建省泉州市金门县没有乡镇级行政区划)
  130. doc['福建省']['泉州市']['金门县'].push('金门县')
  131. return doc
  132. }
  133. /**
  134. * 输出 JSON 文件
  135. * @Author https://github.com/modood
  136. * @DateTime 2016-10-08 17:16
  137. */
  138. function outputFile (name, data) {
  139. var fileName = 'dist/' + name + '.json'
  140. fs.writeFileSync(path.resolve(__dirname, fileName), JSON.stringify(data))
  141. }