From 4121d5f065a9412ab76abb7adb17673596163b40 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=AB=98=E5=9D=9A=E6=9E=9C?= <753610399@qq.com> Date: Sun, 31 Jul 2022 17:49:20 +0800 Subject: [PATCH] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E6=96=87=E6=A1=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 14 +- assets/AreaCity-Geo-Transform-Tools.html | 17 +- assets/csv-ver-date.js | 26 +- assets/download.html | 13 +- assets/geo-echarts-aqg-tools.js | 4 +- assets/geo-echarts-drop-cscode.js | 333 ++++++++++++++++++----- assets/geo-echarts.html | 27 +- assets/geo-echarts.js | 93 ++++--- assets/geo-level4.html | 9 +- 9 files changed, 401 insertions(+), 135 deletions(-) diff --git a/README.md b/README.md index 77a9432..3a85f6a 100644 --- a/README.md +++ b/README.md @@ -5,7 +5,7 @@ - [【在线测试和预览】省市区镇四级行政区划数据](https://xiangyuecn.gitee.io/areacity-jsspider-statsgov/):支持在线生成JSON、多级联动js; - [【在线测试和预览】ECharts Map四级下钻在线测试和预览+代码生成](https://xiangyuecn.gitee.io/areacity-jsspider-statsgov/assets/geo-echarts.html):坐标边界范围在线测试和预览; - [【转换工具】AreaCity-Geo格式转换工具软件](https://xiangyuecn.gitee.io/areacity-jsspider-statsgov/assets/AreaCity-Geo-Transform-Tools.html):csv文件导入数据库,坐标、边界范围转换(支持转成`sql`、`shp`、`geojson`); -- [【查询工具】AreaCity-Query-Geometry](https://github.com/xiangyuecn/AreaCity-Query-Geometry):高性能的坐标数据、边界数据查询工具,Java开源程序、带http查询接口,内存占用低。 +- [【查询工具】AreaCity-Query-Geometry](https://github.com/xiangyuecn/AreaCity-Query-Geometry)([Gitee镜像库](https://gitee.com/xiangyuecn/AreaCity-Query-Geometry)):高性能的坐标数据、边界数据查询工具,Java开源程序、带http查询接口,内存占用低。 ## 数据下载 @@ -25,9 +25,19 @@ > 通过本库提供的 [AreaCity-Geo格式转换工具](https://xiangyuecn.gitee.io/areacity-jsspider-statsgov/assets/AreaCity-Geo-Transform-Tools.html) 可快速方便的将省市区、坐标、边界范围csv文件导入数据库,并且提供格式转换功能(shp、geojson、sql),欢迎下载使用。边界导出成geojson后可通过 [AreaCity-Query-Geometry](https://github.com/xiangyuecn/AreaCity-Query-Geometry) Java开源程序进行高性能的坐标数据、边界数据查询。 +[​](?) + +**如需数据、功能定制,网站、App、小程序、前端后端开发等需求;矢量专题地图绘制、修改,前端地图、大屏、ECharts数据展示开发,后端数据处理、接口开发;请加本文档下面的QQ群,联系群主(即作者),谢谢~** + +[​](?) + +[​](?) + +[​](?) + [​](?) [​](?) @@ -263,7 +273,7 @@ ECharts + 高德地图四级下钻: # :open_book:坐标边界查询工具 - AreaCity-Query-Geometry -[AreaCity-Query-Geometry](https://github.com/xiangyuecn/AreaCity-Query-Geometry) 是一个高性能的坐标数据、边界数据查询工具,Java开源程序、带http查询接口,内存占用低,比数据库查询快几百倍;先用上面的格式转换工具将ok_geo.csv转成geojson格式,然后运行此工具即可测试使用。 +[AreaCity-Query-Geometry](https://github.com/xiangyuecn/AreaCity-Query-Geometry) ([Gitee镜像库](https://gitee.com/xiangyuecn/AreaCity-Query-Geometry))是一个高性能的坐标数据、边界数据查询工具,Java开源程序、带http查询接口,内存占用低,比数据库查询快几百倍;先用上面的格式转换工具将ok_geo.csv转成geojson格式,然后运行此工具即可测试使用。 ## 工具支持: - 查询一个坐标点对应的城市信息; diff --git a/assets/AreaCity-Geo-Transform-Tools.html b/assets/AreaCity-Geo-Transform-Tools.html index ce9cf33..e0247c2 100644 --- a/assets/AreaCity-Geo-Transform-Tools.html +++ b/assets/AreaCity-Geo-Transform-Tools.html @@ -203,6 +203,7 @@
  • 自动校验坐标和边界矢量数据的有效性。
  • 可执行自定义 JavaScript 脚本,可扩展出丰富功能。
  • 转换精度高,速度快,内存占用小,3-5分钟左右可转换完所有数据。
  • +
  • 配套提供坐标数据、边界数据查询工具:AreaCity-Query-Geometry开源库(Gitee镜像库),支持Java调用或HTTP API接口调用,内存占用低,1秒可查1万个以上坐标对应的城市信息。
  • 支持Win10、Win8、Win7,32位、64位系统使用(其他系统装虚拟机可用)。
  • @@ -447,6 +448,12 @@ +
    + 查询性能:数据库查询一个坐标对应的城市性能一般比较低,可以使用 AreaCity-Query-Geometry 开源库,支持Java调用或HTTP API接口调用,内存占用低,1秒可查1万个以上坐标对应的城市信息。 + + 详细请阅读FAQ。 +
    +
    注意:MySQL 5.* 中进行空间计算查询时,不带ST_打头的函数均为采用Polygon的外接矩形计算,会导致结果不准确,应当使用带ST_打头的方法来进行查询。 MySQL的空间索引很难生效 官方文档,从而导致空间查询异常缓慢,可通过增加一个字段: polygon_envelope=ST_Envelope(polygon) 来自建索引,查询的时候先查 polygon_envelope ,然后再查 polygon 字段,速度就会快很多(10倍+),也可同时切换成MyISAM引擎,会比InnoDB引擎的空间查询快很多。 @@ -763,9 +770,17 @@ and ST_Intersects(polygon,ST_GeomFromText('POINT(114.044346 22.691963)',0))=1;也可同时切换成MyISAM引擎,会比InnoDB引擎的空间查询快很多。

    +
    高性能:如何做到1秒查询1万个以上坐标对应的城市信息?
    +
    +

    使用配套提供的坐标数据、边界数据查询工具:AreaCity-Query-Geometry开源库(Gitee镜像库),支持Java调用或HTTP API接口调用,内存占用低,1秒可查1万个以上坐标对应的城市信息。

    + +

    使用方法:先使用转换工具将 ok_geo.csv 转换成 geojson格式;然后打开查询工具并使用此geojson文件进行初始化,然后根据菜单启动HTTP API服务,就能调用API进行查询了;或者直接编写Java代码,代码中使用此geojson文件进行初始化,然后调用对应的查询方法进行查询。

    +
    +
    如何在QQ群内下载本工具?
    - 加入QQ群:①群 484560085、②群 626141661,口令areacity,然后到群文件中下载。 + 加入QQ群:,然后到群文件中下载。 +
    Mac OS等非Windows系统上如何使用本工具?
    diff --git a/assets/csv-ver-date.js b/assets/csv-ver-date.js index 391a0e2..68c279d 100644 --- a/assets/csv-ver-date.js +++ b/assets/csv-ver-date.js @@ -34,7 +34,7 @@ var CsvPubDate=window.CsvPubDate={ ,Geo4:{ name:"乡镇第4级坐标边界数据" - ,desc:'['+Url("下载",UrlRoot+"assets/geo-level4.html")+']['+Url("在线预览",UrlEcharts)+'][付费数据] 文件大小:90MB+压缩包,导出后300M+;包含字段:矢量边界polygon、中心坐标centroid_geo、编号id、上级区县pid、乡镇名称name;'+GeoTips+'。本数据源自:第三方购买 + 公开数据源整合;部分省份由于没有最新的数据源,但上级区县变更往往会囊括原有的乡镇,乡镇边界一般少有大的变化,所以乡镇边界与压缩包内最新版的省市区行政区划、边界均可进行关联匹配。下表中的省份年月为一个大概的值(不一定准确),仅用于参考。' + ,desc:'['+Url("下载",UrlRoot+"assets/geo-level4.html#xz")+']['+Url("在线预览",UrlEcharts)+'][付费数据]['+Url("文档",UrlRoot+"assets/geo-level4.html")+'] 文件大小:90MB+压缩包,导出后300M+;包含字段:矢量边界polygon、中心坐标centroid_geo、编号id、上级区县pid、乡镇名称name;'+GeoTips+'。本数据源自:第三方购买 + 公开数据源整合;部分省份由于没有最新的数据源,但上级区县变更往往会囊括原有的乡镇,乡镇边界一般少有大的变化,所以乡镇边界与压缩包内最新版的省市区行政区划、边界均可进行关联匹配。下表中的省份年月为一个大概的值(不一定准确),仅用于参考。' ,file:"ok_geo4_ETD220408.csv" ,version:"ETD220408" ,dates:{//年-月 A排序年.月 @@ -187,4 +187,28 @@ if(set.geo4){ }; + + + + +window.QQGroupList={ + List:[{name:"①群",qq:"484560085"},{name:"②群",qq:"626141661"}] + ,HTML_i:function(cls){ + var html=[]; + for(var i=0;i'+o.qq+''); + } + html=html.join("、")+',口令areacity'; + if(cls){ + document.querySelector(cls).innerHTML=html; + } + return html; + } +}; + + + + + })(); \ No newline at end of file diff --git a/assets/download.html b/assets/download.html index 6145e9d..49e203a 100644 --- a/assets/download.html +++ b/assets/download.html @@ -88,7 +88,8 @@
    - 【免费开源】【三级】省市区 行政区划 数据下载 + 【免费开源】【三级】省市区 行政区划 数据 + 下载 文件路径: (200KB+) @@ -98,7 +99,8 @@
    - 【免费开源】【四级】省市区镇 行政区划 数据下载 + 【免费开源】【四级】省市区镇 行政区划 数据 + 下载 文件路径: (3MB+) @@ -108,7 +110,8 @@
    - 【免费开源】【GEO三级】省市区 坐标和边界 数据下载 + 【免费开源】【GEO三级】省市区 坐标和边界 数据 + 下载 文件路径: (13MB+压缩包 解压后130M+) @@ -118,7 +121,8 @@
    - 【付费数据】【GEO四级】乡镇 坐标和边界 数据下载 + 【付费数据】【GEO四级】乡镇 坐标和边界 数据 + 下载 乡镇第4级坐标边界数据 ok_geo4_*.csv, (90MB+压缩包 导出后300M+) @@ -164,6 +168,7 @@ mainLog("发现"+file,2); }; +mainLog('高性能:如何做到1秒查询1万个以上坐标对应的城市信息?使用配套提供的坐标数据、边界数据查询工具:AreaCity-Query-Geometry开源库(Gitee镜像库),支持Java调用或HTTP API接口调用,内存占用低,1秒可查1万个以上坐标对应的城市信息',"#000;font-weight:bold;font-size:24px"); mainLog('坐标和边界数据为csv格式,需自行解析提取。或者使用《AreaCity-Geo格式转换工具软件》快速的转换成shp、geojson、sql、导入数据库、转换坐标系,本工具也支持将行政区划数据导入数据库',"#f60;font-weight:bold;font-size:24px"); mainLog('点击上方下载按钮即可下载csv格式数据,行政区划数据如果需要其他格式,可点此在线转换',"#0b1;font-weight:bold;font-size:24px"); mainLog('GitHub Releases中提供的下载连接可能下载缓慢,因此提供本Gitee Pages外链下载,速度会快很多~'); diff --git a/assets/geo-echarts-aqg-tools.js b/assets/geo-echarts-aqg-tools.js index 1717f81..e791851 100644 --- a/assets/geo-echarts-aqg-tools.js +++ b/assets/geo-echarts-aqg-tools.js @@ -99,7 +99,7 @@ var pointQuery=function(url,args){ url+="?lng="+lng+"&lat="+lat+"&returnWKTKey=polygon"; var t1=Date.now(); geoEChartsLib.Post(url,{},function(data){ - mapPointAdd(new AMap.Marker({ position: [lng,lat] })); + mapPointAdd("查询坐标点",lng,lat); addFeatures(Date.now()-t1,data); },function(err){ log(err,1); @@ -126,7 +126,7 @@ var extPathQuery=function(url,args){ var Features=[],QueryID=0; var clearFeatures=function(){ - mapPointReview(true); + mapPointClear(); Features=[]; }; var addFeatures=function(loadMs,data){ diff --git a/assets/geo-echarts-drop-cscode.js b/assets/geo-echarts-drop-cscode.js index 2a1aa30..34cd6d1 100644 --- a/assets/geo-echarts-drop-cscode.js +++ b/assets/geo-echarts-drop-cscode.js @@ -18,10 +18,20 @@ $(".dropChoiceBox").html(` WKT文本
    -
    -
    文件编码:
    -
    保留已绘制的:
    -
    名称字段:
    +
    +
    + 保留已绘制的: + 文件编码: +
    +
    坐标系: + +
    +
    名称字段:
    @@ -48,12 +58,12 @@ window.dropChoiceWKTClick=function(){ $(".ConfirmBox").css("width","65vw") $(".PromptBox textarea").attr("placeholder",`【支持粘贴文本内容格式】: - 查询结果的单个纯WKT文本(需留意WKT过长时有没有被查询工具截断),如: - POLYGON(( ... )) + POLYGON(( ... )) 或 MULTIPOLYGON((( ... ))) 或 POINT( ... ) - 查询结果复制为多行文本,如: - POLYGON(( ... )) - 可选名称 POLYGON(( ... )) - .. 可选名称 MULTIPOLYGON((( ... ))) .. + POLYGON(( ... )) MULTIPOLYGON((( ... ))) POINT( ... ) 一行可以有多个点和面 + 可选名称 POLYGON( ... ) POINT( ... ) 左边如果有一个文本会自动当做名称 + xxx 可选名称 MULTIPOLYGON((( ... ))) xxx - 查询结果复制为Insert、Update多行SQL语句,如: insert xx(..) values(..,'前一字符串始终作为名称','MULTIPOLYGON(( ... ))',..) @@ -64,13 +74,15 @@ window.dropChoiceWKTClick=function(){ var choiceFeatures=[],choiceID=0; -var log,encode,nameKey,append; +var log,encode,srcGCS,nameKey,append; var init=function(msg){ encode=$(".dropChoiceEncode").val()||"utf-8"; nameKey=$(".dropChoiceNameKey").val()||"name"; append=$(".dropChoiceAppend")[0].checked; + srcGCS=$(".dropChoiceGCS").val()||"gcj02"; if(!append){ choiceFeatures=[]; + mapPointClear(); $(".dropChoiceLogs").html(""); }; @@ -78,10 +90,16 @@ var init=function(msg){ $(".dropChoiceLogs").prepend('
    '+msg+'
    '); }; log(msg+",配置: " - +JSON.stringify({encode:encode,append:append,nameKey:nameKey}) + +JSON.stringify({encode:encode,append:append,srcGCS:srcGCS,nameKey:nameKey}) +",开始处理..."); }; var drawMap=function(){ + if(mapPointList.length && !choiceFeatures.length){ + //只显示坐标点,无需绘制(保留之前的地图) + mapPointReview(); + return; + } + //绘图,照抄GeoECharts.load var mapDatas=[],existsName={}; var geojson={type: "FeatureCollection",features:[]}; @@ -89,12 +107,7 @@ var drawMap=function(){ for(var i=0;i1){ name=name+" ["+en+"]"; @@ -128,11 +141,64 @@ var drawMap=function(){ }; end(); }; +var rawName=function(raw){ + var name=raw[nameKey]; + if(name==null){ + name="[数据中无"+nameKey+"字段]"; + }else{ + name=name||"[无名称]"; + } + return name; +}; +//转换坐标系 +var translateGCSFeature=function(feature){ + if(srcGCS=="gcj02"){ + return; + } + var geom=feature.geometry,arr0=geom.coordinates; + if(geom.type=="Point"){ + translateGCS(arr0); + return; + } + if(geom.type=="Polygon"){ + arr0=[arr0]; + } + if(geom.type=="Polygon" || geom.type=="MultiPolygon"){ + for(var i0=0;i0=files.length){ PageModule.closeMask(); - var msg="已处理完所有文件,共"+choiceFeatures.length+"个边界" + var msg="已处理完所有文件,共"+choiceFeatures.length+"个边界、"+mapPointList.length+"个点" +(errCount?",有"+errCount+"个文件处理出错":"") +"。"; log(msg,errCount?1:2); @@ -240,22 +329,33 @@ var readChoiceFile=function(files){ if(!features.length){ throw new Error("没有一个feature,空文件无需处理"); } - var polygonCount=0; + var polygonCount=0,pointCount=0,otherCount=0; for(var i=0;i 坐标 - 标注 - + 标注 +
    @@ -310,7 +410,7 @@ map.on("click",function(e){ var log=function(msg,color){ $(".mapPointLogs").prepend('
    '+msg+'
    '); }; -window.mapPointShowClick=function(){ +window.mapMarkerShowClick=function(){ var val=$(".mapPointTxt").val().trim(); if(!val){ return Toast("请填写坐标",1); @@ -348,28 +448,111 @@ window.mapPointShowClick=function(){ ]; for(var i=0;i'+tag+o.t+'
    ' - } - })); + addMarker(markerList, o.p, tag+o.t, o.c); }; $(".mapPointClearBtn").show(); mapPointReview(); }; +//标注数据 var markerList=[],tagIdx=0; -window.mapPointAdd=function(marker){ - markerList.push(marker); +var addMarker=function(arr, pos, name, color){ + var m=new AMap.Marker({ position: pos, + label:name?{ + offset: new AMap.Pixel(2, -5), direction: "right", + content: '
    '+name+'
    ' + }:null + }); + m._Pos=pos; + m._Name=name; + arr.push(m); +}; +window.mapPointClearClick=function(){ + markerClear(markerList); + markerList=[];tagIdx=0; + $(".mapPointLogs").html(""); + + mapPointClear(); }; -window.mapPointReview=function(clear){ - for(var i=0;i + @@ -185,13 +186,16 @@
    - 因为api接口返回的边界数据已经过了重新采样抽稀处理+GeoZip压缩(大幅节省流量,算法源码在页面下方);抽稀后最高的从5万个坐标点变成1200个坐标点,两个边界之间放大后会明显感受到不够精细(因算法简单,未考虑相邻区域的拓扑结构),自己使用时可以调高采样数或者直接返回原始数据,就没有这个问题了。 + 默认的后端api接口返回的边界数据已经过:重采样Simplify简化处理 + GeoZip压缩,大幅节省流量,算法源码在本页面下面;简化后最高的从5万个坐标点变成1200个坐标点 + ,两个边界之间放大后会明显感受到不够精细 + ,因后端api接口使用的Simplify算法太简单,未考虑相邻区域的拓扑结构,放大后会出现间隙或重叠,甚至边角缺失的现象 + ;自己使用时可以调高采样数、或使用专业的Simplify算法、或直接返回原始数据,就没有这个问题了
    自定义数据源 - 文本文件 - json、wkt + json、wkt,支持图形:Point、Polygon、MultiPolygon
    @@ -200,13 +204,24 @@
    自定义数据源 - AreaCity-Query-Geometry - 一个高性能的坐标数据、边界数据查询工具 + 坐标数据、边界数据查询工具,1秒可查1万个以上坐标对应的城市信息
    +
    +
    功能定制开发
    + +
    + 如需数据、功能定制,网站、App、小程序、前端后端开发等需求; + 矢量专题地图绘制、修改,前端地图、大屏、ECharts数据展示开发,后端数据处理、接口开发; + 请加QQ群:,联系群主(即作者),谢谢~ + +
    +
    +
    数据下载
    @@ -236,7 +251,6 @@
    数据版本
    -
    @@ -517,10 +531,11 @@ })()} map.setFitView(); - - window.mapPointReview&&mapPointReview(); } } + ,onDraw:function(){ + window.mapPointReview&&mapPointReview(); + } }); var goLevel=function(idx){ diff --git a/assets/geo-echarts.js b/assets/geo-echarts.js index e7261c0..5b30c4c 100644 --- a/assets/geo-echarts.js +++ b/assets/geo-echarts.js @@ -85,7 +85,9 @@ geoECharts.load(); //开始加载数据,加载成功后会显示图形 dataProcess: fn(call:fn(next)) 自行处理函数,如果调用了本方法,代表你要自己处理数据,比如修改tips next:fn() 处理完成后调用本方法继续后续图形绘制 */ - + + ,onDraw:NOOP //echarts绘制完成时回调,重绘时也会回调 + ,reqPost:lib.Post //post请求实现方法,默认使用普通的ajax实现 }; for(var k in set){ @@ -493,20 +495,25 @@ geoECharts.load(); //开始加载数据,加载成功后会显示图形 for(var i=0;iSQL如何查询空间数据、查询出WKT文本、其他数据库的支持,均请阅读上面转换工具使用教程文档,在转成sql文件这一章节。
    +
    + 查询性能:数据库查询一个坐标对应的城市性能一般比较低,可以使用 AreaCity-Query-Geometry 开源库,支持Java调用或HTTP API接口调用,内存占用低,1秒可查1万个以上坐标对应的城市信息。 + + 详细请阅读FAQ。 +
    +
    注意:MySQL 5.* 中进行空间计算查询时,不带ST_打头的函数均为采用Polygon的外接矩形计算,会导致结果不准确,应当使用带ST_打头的方法来进行查询。 MySQL的空间索引很难生效 官方文档,从而导致空间查询异常缓慢,可通过增加一个字段: polygon_envelope=ST_Envelope(polygon) 来自建索引,查询的时候先查 polygon_envelope ,然后再查 polygon 字段,速度就会快很多(10倍+),也可同时切换成MyISAM引擎,会比InnoDB引擎的空间查询快很多。 @@ -517,7 +523,8 @@
    如何在QQ群内下载本数据?
    - 加入QQ群:①群 484560085、②群 626141661,口令areacity,然后到群文件中下载。 + 加入QQ群:,然后到群文件中下载。 +
    购买数据能砍价吗?