Skip to content

Commit

Permalink
发布 2023.231212.240303 版本,此版本边界中已手工移除上一版本添加的天津在涉县的飞地
Browse files Browse the repository at this point in the history
  • Loading branch information
xiangyuecn committed Mar 3, 2024
1 parent a0c7eec commit c41e6a4
Show file tree
Hide file tree
Showing 6 changed files with 369 additions and 84 deletions.
8 changes: 4 additions & 4 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -10,12 +10,12 @@

## 数据下载

当前最新版本:**2023.230831.231211版**更新于2023-12-11,整合了 `统计局2023-09-11``民政部2023-04-23``腾讯地图行政区划2023-08-31``高德地图行政区划采集当天` 数据。
当前最新版本:**2023.231212.240303版**更新于2024-03-03,整合了 `统计局2023-09-11``民政部2023-04-23``腾讯地图行政区划2023-12-12``高德地图行政区划采集当天` 数据。

文件名|大小|描述|下载地址
:--:|:--:|--|:-:
**ok_data_level3.csv** <br> **ok_data_level4.csv** <br> <sub>(在一个7z压缩包内)</sub> <br>​ |230KB <br> 3MB <br>​ <br>​ |【**区划三级**】省市区 三级行政区划 数据 <br> 【**区划四级**】省市区乡镇 四级行政区划 数据 <br> <sub>- 支持在线预览,在线生成JSON、多级联动js代码</sub> <br> <sub>- 可用转换工具导入数据库、转成sql</sub>|[线路一](https://gitee.com/xiangyuecn/AreaCity-JsSpider-StatsGov/releases/download/2023.230831.231211/ok_data_level3-4.csv.7z) / [线路二](https://github.com/xiangyuecn/AreaCity-JsSpider-StatsGov/releases/download/2023.230831.231211/ok_data_level3-4.csv.7z)
**ok_geo.csv.7z**|13MB|【**边界三级**】省市区 坐标和边界 数据,解压后130M+ <br> <sub>- 支持在线预览,可用转换工具转成shp、geojson、sql格式、转换坐标系</sub> <br> <sub>- 使用本库开源的高性能查询工具,1秒可查1万个以上坐标对应的城市信息</sub>|[线路一](https://gitee.com/xiangyuecn/AreaCity-JsSpider-StatsGov/releases/download/2023.230831.231211/ok_geo.csv.7z) / [线路二](https://github.com/xiangyuecn/AreaCity-JsSpider-StatsGov/releases/download/2023.230831.231211/ok_geo.csv.7z)
**ok_data_level3.csv** <br> **ok_data_level4.csv** <br> <sub>(在一个7z压缩包内)</sub> <br>​ |230KB <br> 3MB <br>​ <br>​ |【**区划三级**】省市区 三级行政区划 数据 <br> 【**区划四级**】省市区乡镇 四级行政区划 数据 <br> <sub>- 支持在线预览,在线生成JSON、多级联动js代码</sub> <br> <sub>- 可用转换工具导入数据库、转成sql</sub>|[线路一](https://gitee.com/xiangyuecn/AreaCity-JsSpider-StatsGov/releases/download/2023.231212.240303/ok_data_level3-4.csv.7z) / [线路二](https://github.com/xiangyuecn/AreaCity-JsSpider-StatsGov/releases/download/2023.231212.240303/ok_data_level3-4.csv.7z)
**ok_geo.csv.7z**|13MB|【**边界三级**】省市区 坐标和边界 数据,解压后130M+ <br> <sub>- 支持在线预览,可用转换工具转成shp、geojson、sql格式、转换坐标系</sub> <br> <sub>- 使用本库开源的高性能查询工具,1秒可查1万个以上坐标对应的城市信息</sub>|[线路一](https://gitee.com/xiangyuecn/AreaCity-JsSpider-StatsGov/releases/download/2023.231212.240303/ok_geo.csv.7z) / [线路二](https://github.com/xiangyuecn/AreaCity-JsSpider-StatsGov/releases/download/2023.231212.240303/ok_geo.csv.7z)
**ok_geo4_*.csv** [AD]|109MB|【**边界四级**】乡镇级 坐标和边界 数据,导出后300M+ <br> <sub>- 付费数据、广告、闭源,支持在线预览,提供了部分免费数据供测试</sub>|[点此下载](https://xiangyuecn.gitee.io/areacity-jsspider-statsgov/assets/geo-level4.html#xz)


Expand Down Expand Up @@ -158,7 +158,7 @@ polygon|string|行政区域边界,高德地图`GCJ-02`火星坐标系。格式

## 数据更新日志

- 2023.230831.231211版(更新时间: 2023-12-11)采集了4层,省、市、区、镇,来源:[统计局2023版数据](https://www.stats.gov.cn/sj/tjbz/tjyqhdmhcxhfdm/2023/index.html);省市区3级合并了[民政部2023-04-23数据](https://www.mca.gov.cn/n156/n186/index.html)[高德地图行政区域](https://lbs.amap.com/api/webservice/guide/api/district)[腾讯地图行政区划v20230831](https://lbs.qq.com/webservice_v1/guide-region.html)数据;乡镇级采用腾讯地图行政区划作为主要数据,综合高德和统计局的乡镇级。采集高德省市区三级坐标和行政区域边界范围。
- 2023.231212.240303版(更新时间: 2024-03-03)采集了4层,省、市、区、镇,来源:[统计局2023版数据](https://www.stats.gov.cn/sj/tjbz/tjyqhdmhcxhfdm/2023/index.html);省市区3级合并了[民政部2023-04-23数据](https://www.mca.gov.cn/n156/n186/index.html)[高德地图行政区域](https://lbs.amap.com/api/webservice/guide/api/district)[腾讯地图行政区划v20231212](https://lbs.qq.com/webservice_v1/guide-region.html)数据;乡镇级采用腾讯地图行政区划作为主要数据,综合高德和统计局的乡镇级。采集高德省市区三级坐标和行政区域边界范围。
- 2022.230704.230813版(更新时间: 2023-08-13)采集了4层,省、市、区、镇,来源:[统计局2022版数据](http://www.stats.gov.cn/sj/tjbz/tjyqhdmhcxhfdm/2022/index.html);省市区3级合并了[民政部2023-04-23数据](https://www.mca.gov.cn/n156/n186/index.html)[高德地图行政区域](https://lbs.amap.com/api/webservice/guide/api/district)[腾讯地图行政区划v20230302](https://lbs.qq.com/webservice_v1/guide-region.html)数据;乡镇级采用腾讯地图行政区划作为主要数据,综合高德和统计局的乡镇级。采集高德省市区三级坐标和行政区域边界范围。
- 2021.221019.221128版(更新时间: 2022-11-28)采集了4层,省、市、区、镇,来源:[统计局2021版数据](http://www.stats.gov.cn/sj/tjbz/tjyqhdmhcxhfdm/2021/index.html);省市区3级合并了[民政部2022-03-21数据](http://www.mca.gov.cn/article/sj/xzqh/1980/202203/20220300040708.shtml)[高德地图行政区域](https://lbs.amap.com/api/webservice/guide/api/district)[腾讯地图行政区划v20221019](https://lbs.qq.com/webservice_v1/guide-region.html)数据;乡镇级采用腾讯地图行政区划作为主要数据,综合高德和统计局的乡镇级。采集高德省市区三级坐标和行政区域边界范围。
- 2020.210510.1103版(2021)采集了4层,省、市、区、镇,来源:[统计局2020版数据](http://www.stats.gov.cn/sj/tjbz/tjyqhdmhcxhfdm/2020/index.html);省市区3级合并了[民政部2021-05-10数据](http://www.mca.gov.cn/article/sj/xzqh/1980/202105/20210500033655.shtml)[高德地图行政区域](https://lbs.amap.com/api/webservice/guide/api/district)[腾讯地图行政区划v20211103](https://lbs.qq.com/webservice_v1/guide-region.html)数据;乡镇级采用腾讯地图行政区划作为主要数据,综合高德和统计局的乡镇级。采集高德省市区三级坐标和行政区域边界范围。
Expand Down
2 changes: 1 addition & 1 deletion assets/csv-ver-date.js
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
更新ok_data_level*.csv、ok_geo*.csv后,需要同时更新这里的数据时间
**************/
(function(){
var OpenVer="2023.230831.231211",OpenDate="2023-12-11";
var OpenVer="2023.231212.240303",OpenDate="2024-03-03";

var UrlRoot="https://xiangyuecn.gitee.io/areacity-jsspider-statsgov/";
var UrlTool=UrlRoot+"assets/AreaCity-Geo-Transform-Tools.html";
Expand Down
2 changes: 1 addition & 1 deletion index.html
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
<meta charset="utf-8">
<link rel="shortcut icon" type="image/png" href="assets/icon.png">

<title>最新2023年省市区县乡镇街道行政区划数据可导入mysql sql server数据库可三级四级多级联动,坐标边界范围矢量数据支持shp geojson arcgis arcmap qgis mapinfo gis地理围栏 - AreaCity-JsSpider-StatsGov</title>
<title>最新2024年省市区县乡镇街道行政区划数据可导入mysql sql server数据库可三级四级多级联动,坐标边界范围矢量数据支持shp geojson arcgis arcmap qgis mapinfo gis地理围栏 - AreaCity-JsSpider-StatsGov</title>
<script>var PageIsRootIndex=true;</script>
</head>

Expand Down
10 changes: 10 additions & 0 deletions src/坐标和边界/map_geo_格式化.js
Original file line number Diff line number Diff line change
Expand Up @@ -195,6 +195,13 @@ for(var k=0;k<DATA_GEO.length;k++){
console.error(o);
throw new Error("polygon无效");
};
//删除重复的点,包括首尾闭合的点
for(var i=0;i<arr.length;i++){
var p=arr[i],p2=arr[i+1]||arr[0];
if(p[0]==p2[0] && p[1]==p2[1]){
arr.splice(i,1); i--;
}
}
while(arr[0].join(" ")==arr[arr.length-1].join(" ")){
arr.pop();
};
Expand All @@ -220,6 +227,9 @@ for(var k=0;k<DATA_GEO.length;k++){
polygon[j]=arr;
};

//把坐标点最多的环排前面,免得每次采集结果不一样导致差异
polygon.sort(function(a,b){ return b.length-a.length; });

polygon=checkAndBuildPolygon(polygon,o);
break;
};
Expand Down
274 changes: 274 additions & 0 deletions src/坐标和边界/map_geo_格式化2_fix.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,274 @@
/*
人工修复处理数据,将此代码粘贴到《AreaCity Geo格式转换工具》中执行,进行人工数据修复
1. 工具顶上选择临时数据保存目录
2. 复制上一步csv中的一个问题polygon文本,粘贴到输入框
3. 点击“保存成json”按钮
4. 用gis软件人工修复此json
5. 点击“修复完成转回csv”,将输入框内的这个polgyon文本粘贴回去
移除天津在涉县的一小块飞地
12 天津市
1201 天津市 天津市
120102 天津市 天津市 河东区
13 河北省
1304 河北省 邯郸市
130426 河北省 邯郸市 涉县
*/
(function(){


//显示控制按钮
Runtime.Ctrls([
{html:'<div>\
<div style="padding-bottom:10px">\
<div>待修复polygon文本:</div>\
<textarea class="in_polygon" placeholder="csv里面要修复的一个polygon文本" style="width:400px;height:80px"></textarea>\
</div>\
<div style="padding-bottom:10px">\
id:<input class="in_id" style="width:100px">\
</div>\
</div>'}
,{name:"保存成json",click:"save2JsonClick"}
,{name:"修复完成转回csv",click:"save2CsvClick"}
,{html:'<span style="margin:0 30px 0 20px">|</span>'}
,{name:"json转csv",click:"json2CsvClick"}
,{html:'<div>\
<div style="padding-top:10px">\
<div>已修复polygon文本:</div>\
<textarea class="in_polygonOK" placeholder="" style="width:400px;height:80px"></textarea>\
</div>\
</div>'}
]);

var jsonPath="";
window.save2JsonClick=function(){
jsonPath="";
//读取用户选择的文件夹路径
var config=JSON.parse(AppCmds.config());
var folder=config.Input.input_webview_folder;
if(!folder){
Runtime.Log("请先点击顶部“通用-选择文件夹”按钮,选择一个文件夹来保存待处理json数据",1);
return;
}

$(".in_polygonOK").val("");
var text=$(".in_polygon").val();
var id=+$(".in_id").val()||0;
if(!text || !id){
Runtime.Log("请填写一行csv数据 或 id",1);
return;
}
if(text.indexOf("~")!=-1){
Runtime.Log("不支持带孔洞的polygon",1);
return;
}
var wkt="POLYGON(("+text+","+/([^,]+),/.exec(text)[1]+"))";
if(text.indexOf(";")!=-1){
wkt="MULTIPOLYGON(";
var arr=text.split(";");
for(var i=0;i<arr.length;i++)
wkt+=(i?",":"")+"(("+arr[i]+","+/([^,]+),/.exec(arr[i])[1]+"))";
wkt+=")";
}

var json=lib.WKTList2GeoJSON([{id:id,name:"编辑",polygon:wkt}]);

jsonPath=folder+"\\"+id+".json";
AppCmds.transformStart("文件读写");
try{
var write=AppCmds.openFileWriteRes(jsonPath);
AppCmds.fileWrite(write,JSON.stringify(json),"TEXT");
var write=AppCmds.openFileWriteRes(jsonPath.replace(/\.json$/g,"-src.json"));
AppCmds.fileWrite(write,JSON.stringify(json),"TEXT");
var write=AppCmds.openFileWriteRes(jsonPath.replace(/\.json$/g,"-src.txt"));
AppCmds.fileWrite(write,text,"TEXT");
}finally{
AppCmds.transformEnd();
}

Runtime.Log("json文件已保存到:"+jsonPath+",请用gis软件编辑此文件",2);
};
window.save2CsvClick=function(){
if(!jsonPath){
Runtime.Log("请先保存成json",1);
return;
}
$(".in_polygonOK").val("");

AppCmds.transformStart("文件读写");
try{
var read=AppCmds.openFileReadRes(jsonPath);
var json=AppCmds.fileRead(read);
}finally{
AppCmds.transformEnd();
}

var csv=json2Csv(json);
if(!csv)return;
$(".in_polygonOK").val(csv);
Runtime.Log("已转回csv,请粘贴回csv文件内",2);
};
window.json2CsvClick=function(){
$(".in_polygonOK").val("");
var text=$(".in_polygon").val();
if(!text || text.indexOf("{")!=0){
Runtime.Log("请在polygon文本中填写json",1);
return;
}

var csv=json2Csv(text);
if(!csv)return;
$(".in_polygonOK").val(csv);
Runtime.Log("已转成csv",2);
};
var json2Csv=function(jsonTxt){
try{
var json=JSON.parse(jsonTxt);
}catch(e){
Runtime.Log("解析成json失败",1);
return;
}

var geom=json.features[0].geometry;
var pols=geom.coordinates;
if(geom.type=="Polygon"){
pols=[pols];
}
pols.sort(function(a,b){ return b[0].length-a[0].length });
var res=[];
for(var i0=0;i0<pols.length;i0++){
var pos=pols[i0]; if(pos.length!=1) throw new Error("不支持孔洞");
pos=pos[0];

//删除重复的点,包括首尾闭合的点
for(var i=0;i<pos.length;i++){
var p=pos[i],p2=pos[i+1]||pos[0];
if(p[0]==p2[0] && p[1]==p2[1]){
pos.splice(i,1); i--;
}
}
while(pos[0].join(" ")==pos[pos.length-1].join(" ")){
pos.pop();
};

//找到最小的一个坐标,环从这个坐标开始,免得每次采集起点不一样导致差异
var minX=999.999999,minY=minX,idx=0;
for(var i=0;i<pos.length;i++){
var x=pos[i][0],y=pos[i][1];
if(x<minX || (x==minX && y<minY)){
minX=x;minY=y;
idx=i;
}
};
var arr2=[];
for(var i=idx;i<pos.length;i++){
arr2.push(pos[i]);
}
for(var i=0;i<idx;i++){//起点接到尾部后面
arr2.push(pos[i]);
}
pos=arr2;

var arr=[];
for(var j=0;j<pos.length;j++){
var point=pos[j];
arr.push(point[0]+" "+point[1]);
};
res.push(arr.join(","));
};
return res.join(";");
};


//复制自 https://xiangyuecn.gitee.io/areacity-jsspider-statsgov/assets/geo-echarts.html
var lib={};
/*将wkt列表转成geojson FeatureCollection对象
wktList:[
{
id:123
,name:"武汉"
,polygon:"POLYGON((...))" "MULTIPOLYGON(((...)),((...)))" "EMPTY"
,其他属性
}
]
*/
lib.WKTList2GeoJSON=function(wktList){
var features=[];
var geoJson={type:"FeatureCollection",features:features};

for(var i=0;i<wktList.length;i++){
var item=wktList[i];
if(item.id==4603 && lib.Polygon4603Hide){//三沙市特殊处理
continue;
}
var pol=item.polygon; delete item.polygon;
features.push(lib.WKT2Feature(item,pol));
}
return geoJson;
};
/*将wkt字符串转成geojson Feature元素
prop:{
id:123
,name:"武汉"
,其他属性
}
wkt: "POLYGON((...))" "MULTIPOLYGON(((...)),((...)))" "EMPTY"
*/
lib.WKT2Feature=function(prop,wkt){
var feature={
type: "Feature"
,properties: prop
,geometry:{
type: "Polygon"
,coordinates:[]
}
};
var geometry=feature.geometry;

if(wkt.indexOf("EMPTY")+1){
//NOOP
}else if(wkt.indexOf("POLYGON")==0){
geometry.coordinates=parsePolygon(wkt.replace(/^POLYGON\s*\(\(|\)\)$/ig,""));
}else if(wkt.indexOf("MULTIPOLYGON")==0){
geometry.type="MultiPolygon";
var ps=wkt.replace(/^MULTIPOLYGON\s*\(\(\(|\)\)\)$/ig,"").split(/\)\)\s*,\s*\(\(/g);
var maxIdx=0,max=0;
for(var i2=0;i2<ps.length;i2++){
var arr=parsePolygon(ps[i2]);
if(arr[0].length>max){
max=arr[0].length;
maxIdx=i2;
}
geometry.coordinates.push(arr);
}
if(prop.id==46 && lib.Polygon4603Hide){//海南省界特殊处理
geometry.coordinates=[geometry.coordinates[maxIdx]];
}
}
return feature;
};
var parsePolygon=function(polygon){
var isZip=polygon.substr(0,2)=="Z:";//GeoZip压缩过
var arr = polygon.split(/\)\s*,\s*\(/g);
var vals = [];
for (var i = 0, l = arr.length; i < l; i++) {
if(isZip){
//压缩过,解压即可
vals.push(lib.GeoUnZip(arr[i]));
}else{
//普通的wkt
var ps = arr[i].split(/\s*,\s*/g);
var pos = [];
for (var j = 0, jl = ps.length; j < jl; j++) {
var v=ps[j].split(" ");
pos.push([+v[0], +v[1]]);
}
vals.push(pos);
}
}
return vals;
};

})();

Loading

0 comments on commit c41e6a4

Please sign in to comment.