/** * 用于更新高德数据库中的adCode信息到本地src/data/area.json中 */ import 'isomorphic-fetch'; import assert from 'assert'; import { writeFileSync } from 'fs-extra'; import { FormCreateData } from 'oak-domain/lib/types/Entity'; import { OpSchema as Area } from 'oak-app-domain/Area/Schema'; const KEY = '4f3d4499850ba51429b9dece8cedd8d2'; async function acquireAmap(keyWords: string, subdistrict: number) { const url = `https://restapi.amap.com/v3/config/district?keywords=${encodeURIComponent(keyWords)}&subdistrict=${subdistrict}&key=${KEY}`; const res = await fetch(url); return res.json(); } function processRepeatedAdCode(districts: any[], parentAdCode: string) { // 高德的street的adCode和父亲相同,这里统一处理一下 let jdCount = 0; let zCount = 100; let oCount = 400; let xCount = 200; const districts2 = districts.map( (ele) => { const { name, adcode } = ele; let ele2 = ele; if (adcode === parentAdCode) { if (name.endsWith('街道')) { ele2 = Object.assign(ele, { adcode: parseInt(adcode) * 1000 + jdCount }); jdCount++; } else if (name.endsWith('镇')) { ele2 = Object.assign(ele, { adcode: parseInt(adcode) * 1000 + zCount }); zCount++; } else if (name.endsWith('乡')) { ele2 = Object.assign(ele, { adcode: parseInt(adcode) * 1000 + xCount }); xCount++; } else { ele2 = Object.assign(ele, { adcode: parseInt(adcode) * 1000 + oCount }); oCount++; } } return ele2; } ); return districts2; } /** * 省份直接取到街道,然后存储 * @param provinceName * @returns {*} */ /* function getProvince(provinceName) { return acquireAmap(provinceName, 3) .then( (result) => { const { districts: cities, adcode: provinceCode } = result.districts[0]; cities.forEach( (city) => { const { districts, adcode: cityCode } = city; const districts2 = processRepeatedAdCode(districts, cityCode); saveDistricts(districts2, cityCode); districts2.forEach( (district) => { const { districts: streets, adcode: districtCode } = district; const streets2 = processRepeatedAdCode(streets, districtCode); saveDistricts(streets2, districtCode); } ); } ); } ); } */ async function main() { const areaDebug: FormCreateData[] = []; const areaTotal: FormCreateData[] = []; function saveAreas(areas: any[], parentId: string | null, depth: 0 | 1 | 2 | 3 | 4, dest: FormCreateData[] = areaDebug) { areas.forEach( (ele) => { const { adcode, center, citycode, level, name } = ele; const coords = center.split(','); dest.push({ code: adcode, level, parentId, name, depth, id: adcode, center: { type: 'point', coordinate: [parseFloat(coords[0]), parseFloat(coords[1])], }, }); } ); } const result = await acquireAmap('中国', 1); const { districts } = result; const country = districts[0]; saveAreas([country], null, 0); saveAreas([country], null, 0, areaTotal); const { districts: provinces, adcode: countryCode } = country; async function saveBelowProvinces(dest: FormCreateData[], limit?: number) { const provinces2 = limit ? provinces.slice(0, limit) : provinces; saveAreas(provinces2, countryCode, 1, dest); for (const dist of provinces) { const result2 = await acquireAmap(dist.name, 3); const { districts: cities, adcode: provinceCode } = result2.districts[0]; // cities.forEach((ele: any) => assert(ele.level === 'city')); const cities2 = limit ? cities.slice(0, limit) : cities; saveAreas(cities2, provinceCode, 2, dest); for (const city of cities2) { const { districts, adcode: cityCode } = city; const districts2 = processRepeatedAdCode(districts, cityCode); const districts3 = limit ? districts2.slice(0, limit) : districts2; // districts2.forEach((ele: any) => assert(ele.level === 'district')); saveAreas(districts3, cityCode, 3, dest); districts2.forEach( (district) => { const { districts: streets, adcode: districtCode } = district; const streets2 = processRepeatedAdCode(streets, districtCode); const streets3 = limit ? streets2.slice(0, limit) : streets2; // streets2.forEach((ele: any) => assert(ele.level === 'street')); saveAreas(streets3, districtCode, 4, dest); } ); } } } await saveBelowProvinces(areaDebug, 1); await saveBelowProvinces(areaTotal); writeFileSync(`${__dirname}/../src/data/area-debug.json`, JSON.stringify(areaDebug)); writeFileSync(`${__dirname}/../src/data/area.json`, JSON.stringify(areaTotal)); } main().then( () => console.log('success') ); /* acquireAmap('中国', 1) .then( (result) => { saveDistricts(result.districts, null); const country = result.districts[0]; const { districts: provinces, adcode: countryCode } = country; saveDistricts(provinces, countryCode); function provIter(idx) { if (idx === provinces.length) { return Promise.resolve(); } const prov = provinces[idx]; return getProvince(prov.name) .then( () => { console.log(`${prov.name}处理完毕`); return provIter(idx + 1); } ); } return provIter(0); } ) .catch( (err) => { console.error(err); process.exit(-1); } ); */