node.js 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325
  1. let fs = require('fs');
  2. let params = {
  3. type: "FeatureCollection",
  4. totalFeatures: 544,
  5. features: [
  6. ]
  7. }
  8. function writeJson(params){
  9. //现将json文件读出来
  10. fs.readFile('./map_bf.json',function(err,data){
  11. console.log('读取文件')
  12. if(err){
  13. return console.error(err);
  14. }
  15. console.log('读取文件成功')
  16. let bangladesh = data.toString();//将二进制的数据转换为字符串
  17. bangladesh = JSON.parse(bangladesh);//将字符串转换为json对象
  18. let arr2 = [];
  19. console.log('开始计算')
  20. let i = 0;
  21. // let cityName = [];
  22. let provinceNameArr = ["Barisal", "Chittagong", "Rajshahi", "Rangpur", "Dhaka", "Sylhet", "Mymensingh", "Khulna"];
  23. let provinceNameArrJSON = {
  24. Barisal:{
  25. type: "FeatureCollection",
  26. totalFeatures: 544,
  27. features: [
  28. ],
  29. },
  30. Chittagong:{
  31. type: "FeatureCollection",
  32. totalFeatures: 544,
  33. features: [
  34. ],
  35. },
  36. Rajshahi:{
  37. type: "FeatureCollection",
  38. totalFeatures: 544,
  39. features: [
  40. ],
  41. },
  42. Rangpur:{
  43. type: "FeatureCollection",
  44. totalFeatures: 544,
  45. features: [
  46. ],
  47. },
  48. Dhaka:{
  49. type: "FeatureCollection",
  50. totalFeatures: 544,
  51. features: [
  52. ],
  53. },
  54. Sylhet:{
  55. type: "FeatureCollection",
  56. totalFeatures: 544,
  57. features: [
  58. ],
  59. },
  60. Mymensingh:{
  61. type: "FeatureCollection",
  62. totalFeatures: 544,
  63. features: [
  64. ],
  65. },
  66. Khulna:{
  67. type: "FeatureCollection",
  68. totalFeatures: 544,
  69. features: [
  70. ],
  71. },
  72. };
  73. let cityName = {
  74. Barisal:['Barguna','Barisal','Bhola','Jhalokati','Patuakhali','Pirojpur'],
  75. Chittagong:['Bandarban','Brahmanbaria','Chandpur','Chittagong','Khagrachhari','Lakshmipur','Noakhali','Rangamati','Comilla','Cox\'s Bazar','Feni'],
  76. Rajshahi:['Naogaon','Natore','Chapai Nawabganj','Pabna','Rajshahi','Sirajganj','Bogra','Joypurhat'],
  77. Rangpur:['Dinajpur','Gaibandha','Kurigram','Lalmonirhat','Nilphamari','Panchagarh','Rangpur','Thakurgaon'],
  78. Dhaka:[ 'Dhaka','Kishoreganj','Madaripur','Manikganj','Munshiganj','Narayanganj','Narsingdi','Rajbari','Shariatpur','Tangail','Faridpur','Gazipur','Gopalganj'],
  79. Sylhet:['Habiganj', 'Maulvibazar', 'Sunamganj', 'Sylhet'],
  80. Mymensingh:[ 'Mymensingh', 'Netrakona', 'Sherpur', 'Jamalpur'],
  81. Khulna:[ 'Bagerhat','Chuadanga','Jessore','Jhenaidah','Khulna','Kushtia','Magura','Meherpur','Narail','Satkhira']
  82. };
  83. let arr3Length = 0;
  84. let index = 0;
  85. let number = 0;
  86. let accuracy = 0.00000001;
  87. // Pirojpur
  88. // Division District
  89. let fun = function(arr,provinceName,name,item,cfName){
  90. let arr3 = [];
  91. // console.log('计算第'+i+'轮开始');
  92. // console.log(item)
  93. for(let d of arr){
  94. // d.properties.name = d.properties.Divi_name+'-'+ d.properties.Dist_name+'-'+ d.properties.Upaz_name;
  95. // d.properties.name = d.properties.Divi_name;
  96. // d.properties.name = d.properties.Dist_name;
  97. // d.properties.name = d.properties.Upaz_name;
  98. // console.log(d.properties.Dist_name+' '+name,'----8888888888888888-----')
  99. // let isLog = false;
  100. if(d.properties.Divi_name == provinceName){
  101. if(d.properties.Dist_name == name){
  102. if(d.properties.Upaz_name == "Comilla Adarsha Sadar Upazila"){
  103. accuracy = 0.00001;
  104. for(let j in d.geometry.coordinates[0][0]){
  105. d.geometry.coordinates[0][0][j][0] -= 0.00077
  106. d.geometry.coordinates[0][0][j][1] -= -0.000005
  107. }
  108. }else{
  109. accuracy = 0.00000001;
  110. }
  111. if(d.properties.Upaz_name=='Kutubdia Upazila'||d.properties.Upaz_name=='Sandwip Upazila'||d.properties.Upaz_name=='Phulbari Sadar Upazila'||(d.properties.Upaz_name=="Rajpara Thana"||d.properties.Upaz_name=="Shah Makhdum Thana"||d.properties.Upaz_name=="Boalia"||d.properties.Upaz_name=="Matihar Thana")||(d.properties.Upaz_name=="Dhanmondi Thana")||d.properties.Upaz_name=='Bhurungamari Upazila'){
  112. continue
  113. }
  114. if(cfName == d.properties.Upaz_name){
  115. continue
  116. }
  117. item.properties.name = d.properties.Dist_name+' District';
  118. // if(d.properties.Upaz_name=='Mathbaria Upazila'){
  119. // isLog = true;
  120. // }
  121. if(item.geometry.coordinates.length == 0){
  122. number++;
  123. item.geometry.coordinates = JSON.parse(JSON.stringify(d.geometry.coordinates));
  124. console.log('已筛选 '+number+' '+d.properties.Upaz_name+'-------------1---------');
  125. }else{
  126. let xArr = [],xIndex = 0;
  127. let yArr = [],yIndex = 0;
  128. let x1 = 0;
  129. let x2 = 0;
  130. let xhc = 0;
  131. let y1 = 0;
  132. let y2 = 0;
  133. let xk = false;
  134. let xkk = false;
  135. let yk = false;
  136. let ykk = false;
  137. for(let j in d.geometry.coordinates[0][0]){
  138. for(let key in item.geometry.coordinates[0][0]){
  139. if(Math.abs(item.geometry.coordinates[0][0][key][0] - d.geometry.coordinates[0][0][j][0])+Math.abs(item.geometry.coordinates[0][0][key][1] - d.geometry.coordinates[0][0][j][1]) < accuracy){
  140. if(!x1){
  141. x1 = Number(key);
  142. xArr[xIndex] = Number(key);
  143. }else{
  144. if(Math.abs(x2-Number(key)) > 10){
  145. xIndex++;
  146. xArr[xIndex] = x2;
  147. xIndex++;
  148. xArr[xIndex] = Number(key);
  149. }
  150. }
  151. if(!y1){
  152. y1 = Number(j);
  153. yArr[yIndex] = Number(j);
  154. }else{
  155. if(Math.abs(y2-Number(j)) > 10){
  156. yIndex++;
  157. yArr[yIndex] = y2;
  158. yIndex++;
  159. yArr[yIndex] = Number(j);
  160. }
  161. }
  162. x2 = Number(key);
  163. y2 = Number(j);
  164. if(!xk&&x1!=x2){
  165. xk = x2-x1>0?'+':'-'
  166. xkk = x2;
  167. }
  168. if(!yk&&y1!=y2){
  169. yk = y2-y1>0?'+':'-';
  170. ykk = y2;
  171. }
  172. break;
  173. }
  174. }
  175. }
  176. xIndex++;
  177. xArr[xIndex] = Number(x2);
  178. yIndex++;
  179. yArr[yIndex] = Number(y2);
  180. if(x1||x2||y1||y2){
  181. console.log(xArr,item.geometry.coordinates[0][0].length,yArr,d.geometry.coordinates[0][0].length,'-------')
  182. if(yArr.length >2){
  183. y1 = yArr[2]
  184. y2 = yArr[1]
  185. }
  186. if(y2>y1){
  187. arr2 = d.geometry.coordinates[0][0].slice(y2,d.geometry.coordinates[0][0].length)
  188. arr2.push(...(d.geometry.coordinates[0][0].slice(0,y1)))
  189. }else{
  190. arr2 = d.geometry.coordinates[0][0].slice(y2,y1)
  191. }
  192. if(d.properties.Upaz_name == "Comilla Adarsha Sadar Upazila"){
  193. x1 = xArr[2];
  194. x2 = xArr[1];
  195. }
  196. if(x2>x1){
  197. item.geometry.coordinates[0][0].splice(x2,item.geometry.coordinates[0][0].length-1-x2)
  198. item.geometry.coordinates[0][0].splice(0,x1,...arr2)
  199. }else if(x2 == x1){
  200. x1 = Math.max(...xArr)
  201. x2 = Math.min(...xArr)
  202. console.log(x1,x2)
  203. item.geometry.coordinates[0][0].splice(x2,x1-x2,...arr2)
  204. }else{
  205. item.geometry.coordinates[0][0].splice(x2,x1-x2,...arr2)
  206. }
  207. if(d.geometry.coordinates.length>1){
  208. item.geometry.coordinates.push(...d.geometry.coordinates.slice(1,d.geometry.coordinates.length))
  209. }
  210. number++;
  211. console.log('已筛选 '+number+' '+d.properties.Upaz_name+'-------------2---------');
  212. }else{
  213. arr3.push(d)
  214. }
  215. console.log(provinceName+'-'+name+'-'+d.properties.Upaz_name+' '+arr3.length+'_'+arr3Length+'-'+index);
  216. // d.geometry.coordinates[0][0] = arr1
  217. }
  218. }
  219. }
  220. }
  221. if(arr3Length == arr3.length){
  222. index++;
  223. }else{
  224. index = 0;
  225. arr3Length = 0;
  226. }
  227. if(arr3.length>0&&index<2){
  228. arr3Length = arr3.length;
  229. fun(arr3,provinceName,name,item)
  230. }else{
  231. if(index>=2){
  232. item = {
  233. type: "Feature",
  234. geometry: {
  235. type: "MultiPolygon",
  236. coordinates: arr3[0].geometry.coordinates
  237. },
  238. properties: {
  239. name:'',
  240. }
  241. }
  242. index = 0;
  243. number = 1;
  244. arr3Length = 0;
  245. console.log('已筛选 '+number+' '+arr3[0].properties.Upaz_name+'-------------3---------');
  246. fun(bangladesh.features,provinceName,name,item,arr3[0].properties.Upaz_name)
  247. }else{
  248. console.log(item.geometry.coordinates[0][0].length+'-------------')
  249. item.geometry.coordinates[0][0].splice(0,1)
  250. provinceNameArrJSON[provinceName].features.push(item)
  251. // let str = JSON.stringify(provinceNameArrJSON[provinceName]);//因为nodejs的写入文件只认识字符串或者二进制数,所以把json对象转换成字符串重新写入json文件中
  252. // // console.log(str)
  253. // fs.writeFile('./'+provinceName+'__.json',str,function(err){
  254. // if(err){
  255. // console.log(err);
  256. // }
  257. // console.log('----------'+provinceName+'计算完成-------------');
  258. // })
  259. if(provinceNameArrJSON[provinceName].features.length>0){
  260. console.log(provinceName+' '+name+'已计算');
  261. console.log(provinceNameArrJSON[provinceName].features.length+'-'+cityName[provinceName].length)
  262. if(provinceNameArrJSON[provinceName].features.length == cityName[provinceName].length){
  263. for(let d of provinceNameArrJSON[provinceName].features){
  264. for(let key=0;key<d.geometry.coordinates[0][0].length;key++){
  265. if(key==0){
  266. if(Math.abs(d.geometry.coordinates[0][0][0][0] - d.geometry.coordinates[0][0][1][0])+Math.abs(d.geometry.coordinates[0][0][0][1] - d.geometry.coordinates[0][0][1][1])>0.01&&Math.abs(d.geometry.coordinates[0][0][0][0] - d.geometry.coordinates[0][0][d.geometry.coordinates[0][0].length-1][0])+Math.abs(d.geometry.coordinates[0][0][0][1] - d.geometry.coordinates[0][0][d.geometry.coordinates[0][0].length-1][1])>0.01){
  267. d.geometry.coordinates[0][0].splice(key,1)
  268. key--;
  269. }
  270. }else if(key==d.geometry.coordinates[0][0].length-1){
  271. if(Math.abs(d.geometry.coordinates[0][0][key][0] - d.geometry.coordinates[0][0][Number(key)-1][0])+Math.abs(d.geometry.coordinates[0][0][key][1] - d.geometry.coordinates[0][0][Number(key)-1][1])>0.01&&Math.abs(d.geometry.coordinates[0][0][key][0] - d.geometry.coordinates[0][0][0][0])+Math.abs(d.geometry.coordinates[0][0][key][1] - d.geometry.coordinates[0][0][0][1])>0.01){
  272. d.geometry.coordinates[0][0].splice(key,1)
  273. key--;
  274. }
  275. }else{
  276. if(Math.abs(d.geometry.coordinates[0][0][key][0] - d.geometry.coordinates[0][0][Number(key)-1][0])+Math.abs(d.geometry.coordinates[0][0][key][1] - d.geometry.coordinates[0][0][Number(key)-1][1])>0.01&&Math.abs(d.geometry.coordinates[0][0][key][0] - d.geometry.coordinates[0][0][Number(key)+1][0])+Math.abs(d.geometry.coordinates[0][0][key][1] - d.geometry.coordinates[0][0][Number(key)+1][1])>0.01){
  277. d.geometry.coordinates[0][0].splice(key,1)
  278. key--;
  279. }
  280. }
  281. }
  282. }
  283. let str = JSON.stringify(provinceNameArrJSON[provinceName]);//因为nodejs的写入文件只认识字符串或者二进制数,所以把json对象转换成字符串重新写入json文件中
  284. // console.log(str)
  285. fs.writeFile('./'+provinceName+'.json',str,function(err){
  286. if(err){
  287. console.log(err);
  288. }
  289. console.log('----------'+provinceName+'计算完成-------------');
  290. })
  291. }
  292. }
  293. }
  294. }
  295. }
  296. // for(let provinceName of provinceNameArr){
  297. for(let name of cityName['Khulna']){
  298. let item = {
  299. type: "Feature",
  300. geometry: {
  301. type: "MultiPolygon",
  302. coordinates: []
  303. },
  304. properties: {
  305. name:'',
  306. }
  307. }
  308. index = 0;
  309. number = 0;
  310. arr3Length = 0;
  311. fun(bangladesh.features,'Khulna',name,item)
  312. }
  313. // fun(bangladesh.features,'Chittagong','Comilla',item)
  314. // }
  315. // fun(bangladesh.features,'Khulna')
  316. })
  317. }
  318. writeJson(params)//执行一下;