全国城市数据获取 mysql全国城市数据
发布时间
阅读量:
阅读量
全国城市数据@TOC
全国城市数据
数据来源 中华人民共和国民政部 根据国家发布的最新城市数据进行处理
访问页面查看数据
2020年中华人民共和国县以上行政区划代码(截止2020年12月31日)
点击后可查看全国县以上数据。
抓取数据
这个是急慌慌写出来的,然后就插到了我们自己的数据库了,感兴趣的可以看一下。
其中有个 com.fy.utils.JsonUtils 工具类 自己使用ObjectMapper即可,这里就不再单独展示了。
使用了jsoup对html进行处理
<dependency>
<groupId>org.jsoup</groupId>
<artifactId>jsoup</artifactId>
<version>1.11.3</version>
</dependency>
实体
/** * */
package com.fy.utils;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
/** * @author
* */
public class CityModel implements Serializable{
/** * */
private static final long serialVersionUID = 1L;
private Long code;
private String name;
private int layer;
private Long parent;
private List<CityModel> children = new ArrayList<CityModel>();
public Long getCode() {
return code;
}
public void setCode(Long code) {
this.code = code;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getLayer() {
return layer;
}
public void setLayer(int layer) {
this.layer = layer;
}
public Long getParent() {
return parent;
}
public void setParent(Long parent) {
this.parent = parent;
}
public List<CityModel> getChildren() {
return children;
}
public void setChildren(List<CityModel> children) {
this.children = children;
}
/* * @Override public String toString() { return "CityModel [code=" + code +
* ", name=" + name + ", layer=" + layer + ", parent=" + parent + ", children="
* + children + "]"; }
*/
}
逻辑
/** * */
package com.fy.config;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.nio.file.StandardOpenOption;
import java.util.ArrayList;
import java.util.List;
import org.apache.commons.lang3.StringUtils;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
import org.springframework.web.client.RestTemplate;
import com.fy.utils.CityModel;
import com.fy.utils.JsonUtils;
/** * * @author
* */
public class CityUtils {
public static void main(String[] args) {
RestTemplate rest = new RestTemplate();
String r = rest.getForObject("http://www.mca.gov.cn/article/sj/xzqh/2020/20201201.html", String.class);
Document document = Jsoup.parse(r);
Elements es = document.select("table").select("tr");
es.removeIf(e -> !"19".equals(e.attr("height")));
List<CityModel> l = new ArrayList<>();
for (Element tr : es) {
Elements tds = tr.select("td");
int i = 1;
String key = "key", value = "value";
CityModel m = new CityModel();
for (Element td : tds) {
String text = td.text();
if (StringUtils.isBlank(text))
continue;
if (i % 2 == 0)
key = text;
else
value = text;
i++;
}
if (StringUtils.isNumeric(value)) {
m.setCode(Long.valueOf(value));
m.setName(key);
l.add(m);
}
}
List<CityModel> ones = new ArrayList<CityModel>();
for (CityModel cityModel : l) {
if (cityModel.getName().contains("省")
|| cityModel.getName().contains("自治区")
|| cityModel.getName().contains("特别")
|| cityModel.getName().contains("北京市")
|| cityModel.getName().contains("天津市")
|| cityModel.getName().contains("重庆市")
|| cityModel.getName().contains("上海市")
) {
cityModel.setLayer(2);
cityModel.setParent(0L);
ones.add(getChildren(cityModel, l));
}
}
CityModel m = new CityModel();
m.setParent(-1L);
m.setName("中国");
m.setCode(0L);
m.setLayer(1);
m.setChildren(ones);
String a = JsonUtils.writeValueAsString(m);
// System.err.println(a);
try {
Files.createFile(Paths.get("C://city.json"));
Files.write(Paths.get("C://city.json"), a.getBytes(), StandardOpenOption.WRITE);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
private static CityModel getChildren(CityModel model, List<CityModel> list) {
String code = model.getCode() + ""; //城市编码 例如北京市:110000
//处理特别行政区
if(model.getName().contains("特别")) {
return model;
}
//处理直辖市
if(model.getName().equals("北京市")
|| model.getName().equals("天津市")
|| model.getName().equals("重庆市")
|| model.getName().equals("上海市")) {
code = code.substring(0, 3);
for (CityModel cityModel : list) {
String zxsCityCode = cityModel.getCode() + "";
String cityCode =zxsCityCode.substring(0, 3),
endCode = zxsCityCode.substring(zxsCityCode.length() - 2, zxsCityCode.length());
if(code.equals(cityCode) && !"00".equals(endCode)) {
cityModel.setParent(model.getCode());
cityModel.setLayer(model.getLayer() + 1);
model.getChildren().add(cityModel);
}
}
return model;
}
// 找个每个省下的地级市以及地级市下的行政区
// 山东为例 370000
// 匹配规则 地级市和省的编码前两位以及最后两位一致就是地级市
String startWithCode = code.substring(0, 2), //省编码前两位 37
endWithCode = code.substring(code.length() - 2, code.length()), // 省编码后两位 00
lastCode = code.substring(code.length() - 4, code.length());// 后四位 0000 则为省
if("0000".equals(lastCode)) {
for (CityModel cityModel : list) {
String cityCode = (cityModel.getCode() + "");// 济南 370100
String cityLastCode = cityCode.substring(cityCode.length() - 4, cityCode.length()); // 后四位 0100
if(cityCode.startsWith(startWithCode) && cityCode.endsWith(endWithCode) && !"0000".equals(cityLastCode)) {
cityModel.setParent(model.getCode());
cityModel.setLayer(model.getLayer() + 1);
model.getChildren().add(getChildren(cityModel, list));
}
}
return model;
}
//处理地级市下行政区
String cityTempCode = code.substring(0, 4);
for (CityModel cityModel : list) {
String cityCode = (cityModel.getCode() + "");
if(cityCode.contains(cityTempCode) && !cityModel.getName().equals(model.getName())) {
cityModel.setParent(model.getCode());
cityModel.setLayer(model.getLayer() + 1);
model.getChildren().add(cityModel);
}
}
return model;
}
}
全部评论 (0)
还没有任何评论哟~
