头条创作挑战赛目录1,关于省市县数据2,使用chinaregions项目3,总结1,关于省市县数据 github上有中国的省市县开源项目,找到一个特别评分高的项目2。9K星星: https:github。comwecatchchinaregions 我修改的代码放到这里了,包括脚本和SQL: https:github。comfreewebsyschinaregionslite 设计思路,这个项目有多种方式的接入。 1,json文件,放服务端客户端都行,直接数据写死了。 2,数据库的ddl文件直接存储到数据库中。 个人偏向第二中,存储到数据库中,可以方便维护点,同时在做数据处理分析的时候。 可以直接join表,数据的修改查询也很方便。2,使用chinaregions项目gitclonehttps:github。comwecatchchinaregions。gitcdchinaregionsmysql有数据库相关脚本 但是现在有个问题,这个数据库的脚本是分3个表的,本身数据量也不大,没有必要分成三个表。 于是合并成一个region表得了。同时发现这个地区编码,为了兼容乡村使用的是12位的。 如果要是使用省市区,使用前6位就可以了。 数据库表设计:CREATETABLEregion(idvarchar(10)NOTNULLCOMMENT地区主键编号,namevarchar(50)NOTNULLCOMMENT地区名称,parentidvarchar(10)DEFAULTNULLCOMMENT地区父id,levelint(2)DEFAULTNULLCOMMENT1省、自治区、直辖市2地级市,3市辖区、县,PRIMARYKEY(id))ENGINEInnoDBDEFAULTCHARSETutf8COMMENT地区表;默认,父节点和level都是0 但是现在有个问题,没有提供相关的数据库文件,是拆分的。 不用担心,作者已经有个python的脚本了。直接修改python代码,自定义生成一个表就行了。 上pyhton3脚本,修改下官方的脚本就可以了:coding:utf8importjsonimportosimportcodecsfromcollectionsimportOrderedDictddlCREATETABLEregion(idvarchar(10)NOTNULLCOMMENT地区主键编号,namevarchar(50)NOTNULLCOMMENT地区名称,parentidvarchar(10)DEFAULTNULLCOMMENT地区父id,levelint(2)DEFAULTNULLCOMMENT1省、自治区、直辖市2地级市,3市辖区、县,PRIMARYKEY(id))ENGINEInnoDBDEFAULTCHARSETutf8COMMENT地区表;sqltmpINSERTIGNOREINTOregion(id,name,parentid,level)VALUES(s,s,s,s);regionpathmysqlregiondefmakedata():只读取省市县数据。sourcefilelist〔county,city,province〕forkinlist(reversed(sourcefilelist)):datacodecs。open(jsons。jsonk,r,utf8)。read()jsondatajson。loads(data)mysqldatalist〔〕ifkprovince:forindex,provinceinenumerate(jsondata):tmpidprovince〔id〕mysqldatasqltmp(province〔id〕〔0:6〕,province〔name〕,0,1)noqamysqldatalist。append(mysqldata)ifkcity:index0forprovinceidinsorted(jsondata。keys()):forcityinjsondata〔provinceid〕:index1mysqldatasqltmp(city〔id〕〔0:6〕,city〔name〕,provinceid〔0:6〕,2)noqamysqldatalist。append(mysqldata)ifkcounty:index0forcityidinsorted(jsondata。keys()):forcountyinjsondata〔cityid〕:index1mysqldatasqltmp(county〔id〕〔0:6〕,county〔name〕,cityid〔0:6〕,3)noqamysqldatalist。append(mysqldata)ifkin〔province,city,county〕:outmysqlcodecs。open(regionpaths。sqlk,w,utf8)index0start0whilestartlen(mysqldatalist):endstart1000outmysql。write(。join(mysqldatalist〔start:end〕))startendoutmysql。close()defmain():ifnotos。path。exists(regionpath):os。mkdir(regionpath)makedata()ifnamemain:main() 然后生成了省市区的相关的SQL代码:INSERTIGNOREINTOregion(id,name,parentid,level)VALUES(110000,北京市,0,1);INSERTIGNOREINTOregion(id,name,parentid,level)VALUES(120000,天津市,0,1);INSERTIGNOREINTOregion(id,name,parentid,level)VALUES(130000,河北省,0,1);INSERTIGNOREINTOregion(id,name,parentid,level)VALUES(140000,山西省,0,1);INSERTIGNOREINTOregion(id,name,parentid,level)VALUES(150000,内蒙古自治区,0,1);INSERTIGNOREINTOregion(id,name,parentid,level)VALUES(210000,辽宁省,0,1);。。。。INSERTIGNOREINTOregion(id,name,parentid,level)VALUES(110101,东城区,110100,3);INSERTIGNOREINTOregion(id,name,parentid,level)VALUES(110102,西城区,110100,3);INSERTIGNOREINTOregion(id,name,parentid,level)VALUES(110105,朝阳区,110100,3);INSERTIGNOREINTOregion(id,name,parentid,level)VALUES(110106,丰台区,110100,3);INSERTIGNOREINTOregion(id,name,parentid,level)VALUES(110107,石景山区,110100,3);INSERTIGNOREINTOregion(id,name,parentid,level)VALUES(110108,海淀区,110100,3);INSERTIGNOREINTOregion(id,name,parentid,level)VALUES(110109,门头沟区,110100,3);。。。。。INSERTIGNOREINTOregion(id,name,parentid,level)VALUES(110101,东城区,110100,3);INSERTIGNOREINTOregion(id,name,parentid,level)VALUES(110102,西城区,110100,3);INSERTIGNOREINTOregion(id,name,parentid,level)VALUES(110105,朝阳区,110100,3);INSERTIGNOREINTOregion(id,name,parentid,level)VALUES(110106,丰台区,110100,3);INSERTIGNOREINTOregion(id,name,parentid,level)VALUES(110107,石景山区,110100,3);INSERTIGNOREINTOregion(id,name,parentid,level)VALUES(110108,海淀区,110100,3);INSERTIGNOREINTOregion(id,name,parentid,level)VALUES(110109,门头沟区,110100,3);共3644条记录。。。。 数据都对1,2,3级数据都关联对了,同时对字符串进行裁剪了下,之前的区号是12位,包括到乡镇。 这个是6位符合邮编代码。其他的数据就不用了。 3,总结 单个数据表可以解决省市区的问题,要是到乡镇的话还是拆分成小表比较好。 查询速度也快了。要是就着三级查询,合并成一张表就行。 这个项目本地也可以启动 cdlocationdemo npminstall npmrunstart 就可在http:localhost:4200访问了。