From 22cb435960e1d209ec8f463c5a4be304e7f5e477 Mon Sep 17 00:00:00 2001 From: pioneer Date: Tue, 8 Nov 2022 14:45:11 +0800 Subject: [PATCH] open --- README.md | 7 + plugin.xml | 28 + src/com/fr/plugin/lzljgdmap/LzljMapChart.java | 614 +++ .../lzljgdmap/LzljMapChartLocaleFinder.java | 10 + .../lzljgdmap/LzljMapChartProvider.java | 11 + .../fr/plugin/lzljgdmap/LzljMapChartUI.java | 44 + .../lzljgdmap/data/LzljMapDataConfig.java | 187 + .../lzljgdmap/data/LzljMapDataPane.java | 89 + .../lzljgdmap/data/LzljMapReportDataPane.java | 89 + src/com/fr/plugin/lzljgdmap/images/demo.png | Bin 0 -> 120307 bytes src/com/fr/plugin/lzljgdmap/images/icon.png | Bin 0 -> 3517 bytes .../lzljgdmap/locale/lzljgdmap.properties | 106 + .../locale/lzljgdmap_zh_CN.properties | 106 + .../plugin/lzljgdmap/ui/ImageChooserPane.java | 136 + .../fr/plugin/lzljgdmap/ui/ImageEntity.java | 42 + .../ui/LzljMapClusterPointStyleCreator.java | 188 + .../plugin/lzljgdmap/ui/LzljMapHyperLink.java | 55 + .../ui/LzljMapPointCondListPane.java | 146 + .../ui/LzljMapPointStyleCreator.java | 223 + .../lzljgdmap/ui/LzljMapStyleBaseMapPane.java | 192 + .../lzljgdmap/ui/LzljMapStyleHeatMapPane.java | 159 + .../lzljgdmap/ui/LzljMapStyleLabelsPane.java | 198 + .../lzljgdmap/ui/LzljMapStyleOtherPane.java | 84 + .../plugin/lzljgdmap/ui/LzljMapStylePane.java | 39 + .../ui/LzljMapStylePointMapPane.java | 167 + .../lzljgdmap/ui/LzljMapStyleTipsPane.java | 163 + .../lzljgdmap/ui/LzljMapStyleTitlePane.java | 142 + .../lzljgdmap/ui/LzljMapStyleToolsPane.java | 239 ++ src/com/fr/plugin/lzljgdmap/ui/MapUtil.java | 94 + .../vo/ClusterPointMapStyleJson.java | 14 + .../plugin/lzljgdmap/vo/CustomJsonObject.java | 23 + .../lzljgdmap/vo/PointMapStyleJson.java | 14 + .../fr/plugin/lzljgdmap/web/LzljMapChart.css | 307 ++ .../lzljgdmap/web/LzljMapChartWrapper.js | 1754 ++++++++ src/com/fr/plugin/lzljgdmap/web/jstree.js | 3689 +++++++++++++++++ 35 files changed, 9359 insertions(+) create mode 100644 README.md create mode 100644 plugin.xml create mode 100644 src/com/fr/plugin/lzljgdmap/LzljMapChart.java create mode 100644 src/com/fr/plugin/lzljgdmap/LzljMapChartLocaleFinder.java create mode 100644 src/com/fr/plugin/lzljgdmap/LzljMapChartProvider.java create mode 100644 src/com/fr/plugin/lzljgdmap/LzljMapChartUI.java create mode 100644 src/com/fr/plugin/lzljgdmap/data/LzljMapDataConfig.java create mode 100644 src/com/fr/plugin/lzljgdmap/data/LzljMapDataPane.java create mode 100644 src/com/fr/plugin/lzljgdmap/data/LzljMapReportDataPane.java create mode 100644 src/com/fr/plugin/lzljgdmap/images/demo.png create mode 100644 src/com/fr/plugin/lzljgdmap/images/icon.png create mode 100644 src/com/fr/plugin/lzljgdmap/locale/lzljgdmap.properties create mode 100644 src/com/fr/plugin/lzljgdmap/locale/lzljgdmap_zh_CN.properties create mode 100644 src/com/fr/plugin/lzljgdmap/ui/ImageChooserPane.java create mode 100644 src/com/fr/plugin/lzljgdmap/ui/ImageEntity.java create mode 100644 src/com/fr/plugin/lzljgdmap/ui/LzljMapClusterPointStyleCreator.java create mode 100644 src/com/fr/plugin/lzljgdmap/ui/LzljMapHyperLink.java create mode 100644 src/com/fr/plugin/lzljgdmap/ui/LzljMapPointCondListPane.java create mode 100644 src/com/fr/plugin/lzljgdmap/ui/LzljMapPointStyleCreator.java create mode 100644 src/com/fr/plugin/lzljgdmap/ui/LzljMapStyleBaseMapPane.java create mode 100644 src/com/fr/plugin/lzljgdmap/ui/LzljMapStyleHeatMapPane.java create mode 100644 src/com/fr/plugin/lzljgdmap/ui/LzljMapStyleLabelsPane.java create mode 100644 src/com/fr/plugin/lzljgdmap/ui/LzljMapStyleOtherPane.java create mode 100644 src/com/fr/plugin/lzljgdmap/ui/LzljMapStylePane.java create mode 100644 src/com/fr/plugin/lzljgdmap/ui/LzljMapStylePointMapPane.java create mode 100644 src/com/fr/plugin/lzljgdmap/ui/LzljMapStyleTipsPane.java create mode 100644 src/com/fr/plugin/lzljgdmap/ui/LzljMapStyleTitlePane.java create mode 100644 src/com/fr/plugin/lzljgdmap/ui/LzljMapStyleToolsPane.java create mode 100644 src/com/fr/plugin/lzljgdmap/ui/MapUtil.java create mode 100644 src/com/fr/plugin/lzljgdmap/vo/ClusterPointMapStyleJson.java create mode 100644 src/com/fr/plugin/lzljgdmap/vo/CustomJsonObject.java create mode 100644 src/com/fr/plugin/lzljgdmap/vo/PointMapStyleJson.java create mode 100644 src/com/fr/plugin/lzljgdmap/web/LzljMapChart.css create mode 100644 src/com/fr/plugin/lzljgdmap/web/LzljMapChartWrapper.js create mode 100644 src/com/fr/plugin/lzljgdmap/web/jstree.js diff --git a/README.md b/README.md new file mode 100644 index 0000000..71fefdd --- /dev/null +++ b/README.md @@ -0,0 +1,7 @@ + +# open-JSD-8935 + +JSD-8935 新增一种图表,支持在点地图上面显示热力块\ +免责说明:该源码为第三方爱好者提供,不保证源码和方案的可靠性,也不提供任何形式的源码教学指导和协助!\ +仅作为开发者学习参考使用!禁止用于任何商业用途!\ +为保护开发者隐私,开发者信息已隐去!若原开发者希望公开自己的信息,可联系【pioneer】处理。 \ No newline at end of file diff --git a/plugin.xml b/plugin.xml new file mode 100644 index 0000000..c58d001 --- /dev/null +++ b/plugin.xml @@ -0,0 +1,28 @@ + + + com.fr.plugin.lzljgdmap + com.fr.plugin.lzljgdmap.v10 + + yes + 1.0.2 + 10.0~11.0 + 2021-04-24 + fr.open + 热力点组合图_

]]>
+ [2022-08-25]开发1.0版本

]]>
+ + + + + + + + + + + + + +
\ No newline at end of file diff --git a/src/com/fr/plugin/lzljgdmap/LzljMapChart.java b/src/com/fr/plugin/lzljgdmap/LzljMapChart.java new file mode 100644 index 0000000..8df1f42 --- /dev/null +++ b/src/com/fr/plugin/lzljgdmap/LzljMapChart.java @@ -0,0 +1,614 @@ +package com.fr.plugin.lzljgdmap; + +import com.fr.base.Base64; +import com.fr.extended.chart.AbstractChart; +import com.fr.extended.chart.HyperLinkPara; +import com.fr.extended.chart.StringFormula; +import com.fr.extended.chart.ToHyperlinkJSONHelper; +import com.fr.general.ComparatorUtils; +import com.fr.js.NameJavaScript; +import com.fr.js.NameJavaScriptGroup; +import com.fr.json.*; +import com.fr.log.FineLoggerFactory; +import com.fr.plugin.lzljgdmap.data.LzljMapDataConfig; +import com.fr.plugin.transform.ExecuteFunctionRecord; +import com.fr.plugin.transform.FunctionRecorder; +import com.fr.stable.AssistUtils; +import com.fr.stable.StringUtils; +import com.fr.stable.web.Repository; +import com.fr.stable.xml.XMLPrintWriter; +import com.fr.stable.xml.XMLableReader; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +/** + * @author fr.open + * @date 2022/8/19 + */ +@FunctionRecorder +public class LzljMapChart extends AbstractChart { + + private static final String ID = "LzljMapChart"; + private static final String NAME = "热力点组合图__EK"; + + private JSONObject titleConf; + private JSONObject mapConf; + private JSONObject pointConf; + private JSONObject heatConf; + private JSONObject toolConf; + private JSONObject labelConf; + private JSONObject tipsConf; + + private JSONArray pointStyleCond; + private NameJavaScriptGroup linkNameGroup; + + @Override + protected String getChartID() { + return ID; + } + + @Override + public String getChartName() { + return NAME; + } + + @ExecuteFunctionRecord + @Override + protected void addJSON(LzljMapDataConfig dataConfig, JSONObject jsonObject, Repository repository, JSONPara jsonPara) throws JSONException { + + jsonObject.put("titleConf", getTitleConf()); + jsonObject.put("mapConf", getMapConf()); + jsonObject.put("pointConf", getPointConf()); + jsonObject.put("heatConf", getHeatConf()); + jsonObject.put("toolConf", getToolConf()); + jsonObject.put("labelConf", getLabelConf()); + jsonObject.put("tipsConf", getTipsConf()); + jsonObject.put("pointStyleCond", getPointStyleCond()); + + addAutoLinkJSON(jsonObject, jsonPara); + + jsonObject.put("data", makeChartData(dataConfig, repository)); + } + + private JSONArray makeChartData(LzljMapDataConfig dataConfig, Repository repository) { + + JSONArray dataArr = JSONFactory.createJSON(JSON.ARRAY); + if (null == dataConfig || null == dataConfig.getDatatype()) { + return dataArr; + } + + List region = dataConfig.getRegion().getValues(); + List area = dataConfig.getArea().getValues(); + List county = dataConfig.getCounty().getValues(); + List layertype = dataConfig.getLayertype().getValues(); + List datatype = dataConfig.getDatatype().getValues(); + List lng = dataConfig.getLng().getValues(); + List lat = dataConfig.getLat().getValues(); + List name = dataConfig.getName().getValues(); + List val = dataConfig.getVal().getValues(); + List desc = dataConfig.getDesc().getValues(); + + for (int i = 0; i < datatype.size(); i++) { + try { + JSONObject dataObj = JSONFactory.createJSON(JSON.OBJECT); + + if(null == layertype || layertype.isEmpty()) { + continue; + } + if(null == datatype || datatype.isEmpty()) { + continue; + } + if(null == lng || lng.isEmpty() || null == lat || lat.isEmpty()) { + continue; + } + + if(null != region && !region.isEmpty()) { + dataObj.put("region", region.get(i)); + } else { + dataObj.put("region", ""); + } + if(null != area && !area.isEmpty()) { + dataObj.put("area", area.get(i)); + } else { + dataObj.put("area", ""); + } + if(null != county && !county.isEmpty()) { + dataObj.put("county", county.get(i)); + } else { + dataObj.put("county", ""); + } + if(null != layertype && !layertype.isEmpty()) { + dataObj.put("layertype", layertype.get(i)); + } else { + dataObj.put("layertype", ""); + } + if(null != datatype && !datatype.isEmpty()) { + dataObj.put("datatype", datatype.get(i)); + } else { + dataObj.put("datatype", ""); + } + if(null != lng && !lng.isEmpty()) { + dataObj.put("lng", lng.get(i)); + } else { + dataObj.put("lng", ""); + } + if(null != lat && !lat.isEmpty()) { + dataObj.put("lat", lat.get(i)); + } else { + dataObj.put("lat", ""); + } + if(null != name && !name.isEmpty()) { + dataObj.put("name", name.get(i)); + } else { + dataObj.put("name", ""); + } + if(null != val && !val.isEmpty()) { + dataObj.put("val", val.get(i)); + } else { + dataObj.put("val", ""); + } + if(null != desc && !desc.isEmpty()) { + dataObj.put("desc", desc.get(i)); + } else { + dataObj.put("desc", ""); + } + + dataArr.put(dataObj); + } catch (Exception e) { + FineLoggerFactory.getLogger().error("热力点组合图__EK,数据处理有错误," + e.getMessage(), e); + } + } + return dataArr; + } + + @Override + protected String[] requiredJS() { + return new String[]{ + "com/fr/plugin/lzljgdmap/web/jstree.js", + "com/fr/plugin/lzljgdmap/web/LzljMapChartWrapper.js" + }; + } + + @Override + protected String[] requiredCSS() { + return new String[]{ + "com/fr/plugin/lzljgdmap/web/LzljMapChart.css" + }; + } + + @Override + protected String wrapperName() { + return "LzljMapChartWrapper"; + } + + private void addAutoLinkJSON(JSONObject paramJSONObject, JSONPara paramAbstractChart) + throws JSONException { + ToHyperlinkJSONHelper.addECNameToLinkGroup(paramAbstractChart.ecName, paramAbstractChart.sheetIndex, this.getLinkNameGroup()); + paramJSONObject.put("pointLink", ToHyperlinkJSONHelper.addAutoLinkJSON(this.getLinkNameGroup(), hyperLinkParas())); + } + + @Override + public NameJavaScriptGroup getHotHyperlink(String s) { + NameJavaScriptGroup retLinkGroup = new NameJavaScriptGroup(); + for (int i = 0; i < linkNameGroup.size(); i++) { + NameJavaScript hyperlink = linkNameGroup.getNameHyperlink(i); + if ("pointLink".equals(s)) { + try { + retLinkGroup.addNameHyperlink((NameJavaScript)hyperlink.clone()); + } catch (CloneNotSupportedException e) { + e.printStackTrace(); + } + } + } + return retLinkGroup; + } + + @Override + protected HyperLinkPara[] hyperLinkParas() { + return new HyperLinkPara[]{ + new HyperLinkPara() { + @Override + public String getName() { + return "分类"; + } + + @Override + public String getFormulaContent() { + return "LAYERTYPE"; + } + + @Override + public String[] getProps() { + return new String[]{"layertype"}; + } + }, + new HyperLinkPara() { + @Override + public String getName() { + return "类型"; + } + + @Override + public String getFormulaContent() { + return "DATATYPE"; + } + + @Override + public String[] getProps() { + return new String[]{"datatype"}; + } + }, + new HyperLinkPara() { + @Override + public String getName() { + return "名称"; + } + + @Override + public String getFormulaContent() { + return "POINTNAME"; + } + + @Override + public String[] getProps() { + return new String[]{"name"}; + } + }, + new HyperLinkPara() { + @Override + public String getName() { + return "经度"; + } + + @Override + public String getFormulaContent() { + return "POINTLNG"; + } + + @Override + public String[] getProps() { + return new String[]{"lng"}; + } + }, + new HyperLinkPara() { + @Override + public String getName() { + return "纬度"; + } + + @Override + public String getFormulaContent() { + return "POINTLAT"; + } + + @Override + public String[] getProps() { + return new String[]{"lat"}; + } + }, + new HyperLinkPara() { + @Override + public String getName() { + return "描述"; + } + + @Override + public String getFormulaContent() { + return "POINTDESC"; + } + + @Override + public String[] getProps() { + return new String[]{"desc"}; + } + } + }; + } + + @Override + protected void readAttr(XMLableReader xmLableReader) { + super.readAttr(xmLableReader); + String jsonStr = xmLableReader.getAttrAsString("titleConf", ""); + if (StringUtils.isNotEmpty(jsonStr)) { + this.setTitleConf(new JSONObject(jsonStr)); + } + jsonStr = xmLableReader.getAttrAsString("mapConf", ""); + if (StringUtils.isNotEmpty(jsonStr)) { + this.setMapConf(new JSONObject(jsonStr)); + } + jsonStr = xmLableReader.getAttrAsString("pointConf", ""); + if (StringUtils.isNotEmpty(jsonStr)) { + this.setPointConf(new JSONObject(jsonStr)); + } + jsonStr = xmLableReader.getAttrAsString("heatConf", ""); + if (StringUtils.isNotEmpty(jsonStr)) { + this.setHeatConf(new JSONObject(jsonStr)); + } + jsonStr = xmLableReader.getAttrAsString("toolConf", ""); + if (StringUtils.isNotEmpty(jsonStr)) { + this.setToolConf(new JSONObject(jsonStr)); + } + jsonStr = xmLableReader.getAttrAsString("labelConf", ""); + if (StringUtils.isNotEmpty(jsonStr)) { + this.setLabelConf(new JSONObject(jsonStr)); + } + jsonStr = xmLableReader.getAttrAsString("tipsConf", ""); + if (StringUtils.isNotEmpty(jsonStr)) { + this.setTipsConf(new JSONObject(jsonStr)); + } + + jsonStr = xmLableReader.getAttrAsString("pointStyleCond", ""); + if (StringUtils.isNotEmpty(jsonStr)) { + this.setPointStyleCond(new JSONArray(new String(Base64.decode(jsonStr)))); + } + + if (null == linkNameGroup) { + linkNameGroup = (NameJavaScriptGroup)xmLableReader.readXMLObject(new NameJavaScriptGroup()); + } + } + + @Override + protected void writeAttr(XMLPrintWriter xmlPrintWriter) { + super.writeAttr(xmlPrintWriter); + if (null != titleConf) { + xmlPrintWriter.attr("titleConf", titleConf.toString()); + } + if (null != mapConf) { + xmlPrintWriter.attr("mapConf", mapConf.toString()); + } + if (null != pointConf) { + xmlPrintWriter.attr("pointConf", pointConf.toString()); + } + if (null != heatConf) { + xmlPrintWriter.attr("heatConf", heatConf.toString()); + } + if (null != toolConf) { + xmlPrintWriter.attr("toolConf", toolConf.toString()); + } + if (null != labelConf) { + xmlPrintWriter.attr("labelConf", labelConf.toString()); + } + if (null != tipsConf) { + xmlPrintWriter.attr("tipsConf", tipsConf.toString()); + } + if (null != pointStyleCond) { + xmlPrintWriter.attr("pointStyleCond", Base64.encode(pointStyleCond.toString().getBytes())); + } + + if (null != linkNameGroup) { + linkNameGroup.writeXML(xmlPrintWriter); + } + } + + @Override + public boolean equals(Object o) { + boolean isEq = super.equals(o) + && o instanceof LzljMapChart + && ComparatorUtils.equals(((LzljMapChart) o).getTitleConf(), this.titleConf) + && ComparatorUtils.equals(((LzljMapChart) o).getMapConf(), this.mapConf) + && ComparatorUtils.equals(((LzljMapChart) o).getPointConf(), this.pointConf) + && ComparatorUtils.equals(((LzljMapChart) o).getHeatConf(), this.heatConf) + && ComparatorUtils.equals(((LzljMapChart) o).getToolConf(), this.toolConf) + && ComparatorUtils.equals(((LzljMapChart) o).getLabelConf(), this.labelConf) + && ComparatorUtils.equals(((LzljMapChart) o).getTipsConf(), this.tipsConf) + && ComparatorUtils.equals(((LzljMapChart) o).getPointStyleCond(), this.pointStyleCond) + && ComparatorUtils.equals(((LzljMapChart) o).getLinkNameGroup(), this.linkNameGroup) + ; + return isEq; + } + + @Override + public int hashCode() { + return super.hashCode() + AssistUtils.hashCode(new Object[]{this.titleConf, this.mapConf,this.pointConf,this.heatConf,this.toolConf,this.labelConf, this.tipsConf, this.pointStyleCond}); + } + + @Override + public LzljMapChart clone() throws CloneNotSupportedException { + LzljMapChart chart = (LzljMapChart)super.clone(); + if (this.linkNameGroup != null) { + chart.setLinkNameGroup((NameJavaScriptGroup) this.getLinkNameGroup().clone()); + } + return chart; + } + + @Override + protected List formulas() { + List formulaList = new ArrayList(); + return formulaList; + } + + @Override + protected String demoImagePath() { + return "com/fr/plugin/lzljgdmap/images/demo.png"; + } + + + public JSONObject getTitleConf() { + if (null == titleConf) { + titleConf = new JSONObject(); + titleConf.put("titlevisiable", false); + titleConf.put("titlename", "热力点组合图"); + titleConf.put("titleposition", 0); + titleConf.put("titlesize", 13); + titleConf.put("titlestyle", 1); + titleConf.put("titlefamily", "微软雅黑"); + titleConf.put("titlecolor", "#ffffff"); + titleConf.put("titlebgcolor", "#000000"); + titleConf.put("titleBgOpacity", 55); + } + return titleConf; + } + + public void setTitleConf(JSONObject titleConf) { + this.titleConf = titleConf; + } + + public JSONObject getTipsConf() { + if (null == tipsConf) { + tipsConf = new JSONObject(); + tipsConf.put("showPointTips", true); + tipsConf.put("tipBgColor", "#c0c0c0"); + tipsConf.put("tipBgOpacity", 70.0); + tipsConf.put("showLayerType", true); + tipsConf.put("showDataType", true); + tipsConf.put("showDesc", true); + tipsConf.put("showLat", true); + tipsConf.put("showLng", true); + tipsConf.put("showName", true); + tipsConf.put("tipfamily", "微软雅黑"); + tipsConf.put("tipstyle", 0); + tipsConf.put("tipsize", 12); + tipsConf.put("tipcolor", "#ffcc00"); + } + return tipsConf; + } + + public void setTipsConf(JSONObject tipsConf) { + this.tipsConf = tipsConf; + } + + + public JSONArray getPointStyleCond() { + if (null == pointStyleCond || pointStyleCond.size() == 0) { + pointStyleCond = JSONArray.create(); + } + return pointStyleCond; + } + + public void setPointStyleCond(JSONArray pointStyleCond) { + this.pointStyleCond = pointStyleCond; + } + + public JSONObject getMapConf() { + if (null == mapConf) { + mapConf = new JSONObject(); + mapConf.put("areaBorderColor", "#808080"); + mapConf.put("centerx", "118.796452"); + mapConf.put("centery", "32.058908"); + mapConf.put("circleBorderColor", "#ff0000"); + mapConf.put("circleBorderWidth", 2); + mapConf.put("circleFillColor", "#ff0000"); + mapConf.put("circleOpacity", "#575656"); + mapConf.put("countryBorderColor", 64); + mapConf.put("mapKey", "grey"); + mapConf.put("mapzoom", 10); + mapConf.put("regionBorderColor", "#c0c0c0"); + mapConf.put("regionBorderWidth", 3); + mapConf.put("showCircleDetail", true); + } + return mapConf; + } + + public void setMapConf(JSONObject mapConf) { + this.mapConf = mapConf; + } + + public JSONObject getPointConf() { + if (null == pointConf) { + pointConf = new JSONObject(); + pointConf.put("clusterBgOpacity", 100); + pointConf.put("clusterBorderColor", "#3366ff"); + pointConf.put("clusterFillColor", "#1fade5"); + pointConf.put("clusterMaxZoom", 12); + pointConf.put("clusterPointSize", 32); + pointConf.put("clusterTextColor", "#ffffff"); + pointConf.put("pointSize", 32); + pointConf.put("pointimg", "iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAD60lEQVR4nO1YMWgUQRTd4mb2orYiJpnZw84gaGEhImIhCJJC0gixEQVJmiAowcJCECSdSRrRoGIhGAVNYWEhpEiCAdOI3u1tjhAbG1OoIMTu/D+5O3f3Ljszyc3MBefBh2V3/p/3/v75M7ue5+Dg4ODg4GAKqwUvX+G0b5n7/WAjNevHe/jMNj8tiHjuVMTprTL358ucVrPNn8ex6GOb946xHNABELUgFr2lLWAM2zqUEfWQoyGjz3cgPGEYC2Pa1iWFckAvlRn53i7xDcOYENu2vkxEgX+j7cJThnPY1tkSEaMXdYtvJAHmsq03AezYpsQ3ktApu0SJ0SOwba2YTwBdwblt6/e22e3XoYw/wJ7/AG3zmq6rxsG5rYqv7fMKpMn7MMidbHXiw3v4DMeoxLR6TigrHXLIhHxcMqGQhAWdGrfEMs+flSW5cijPVeOjj3QVABcdGjMBE4/JkCux3Om0b8jJNXi2BPYLmtmXkNO3rbY29JVMwpgZ1THUBIjKfjzuA+v1MNx/l+HzEb8Kk/OQcYkELBkVjw1LgtTvz91drO4DJ7jzcO+nyA8rIp4EjIGxRH5GP6WRoFBIQBfjPiDsqUJje5HwhVgin3TlaAX+wBCKYPRxfXxYyBcUxKP9KfZ5tO6PsUQ+yMlkAkbECSDDjQT05s4oJqCKPv8SQIYlEjBiLAFAaEgoIPZGdpqAUKriyJCxBGye2ASEAnq7Pl6mZ2RWAMQSjgdOxhJQ3O/tkxDxKu6D3V0hAd/ivhhL5IOcjCVggxQjs1mEQHAlKYLcl377nN6J+2IsQfnPGhWPKHH/ungZkCtxH7j3UmLpPEn4QAyRD3Ixqx5QLJBjqqWMiLj/cIuxP+DN30uPxxjC8gcuZlQ3k5sRkcMDUNrva7DnIJZ53UqMXvh0wNubHid5eJoxo7YFQuafk1nTpYBcVY2NPlL9Ajjo0CYNIDEt1dygUclsVRtbrKDBxmzahMZswqqHnIC+gaPt3TCgA1FvVw8aXuO9jWcKseJnBauAtfpMKQltMJzTtu4GKgVywnQCcE7buhOA8/ojU+JxLtt6m1D75F01kIBVnMu23pYIGbms/e3DHLZ1ZkLxz49q42s6VHUcNC6Fzi39NHQshY4v/TTauRR2RemngeUq/I6XE1/ZNaWfhtS/PFHpm/zbqwNh4N/ctnjwtc2/LYi4P6Ve+v6Ubd5tw+ZPVH9OPgH+nPGfnLoB3/jHQdiahPg1HGubrxbAd/+geN3TQds8tQJEjmYkYNQ2PyOIOJlsbnpk0jYvo4gYfd0QD9e2+RhH1fNyIaOLaHhtm48VFLvzHM02DwcHBwcHh/8UfwE/2Xk+00CsAAAAAABJRU5ErkJggg=="); + pointConf.put("pointimgh", 64); + pointConf.put("pointimgw", 64); + pointConf.put("pointimgtype", "png"); + } + return pointConf; + } + + public void setPointConf(JSONObject pointConf) { + this.pointConf = pointConf; + } + + public JSONObject getHeatConf() { + if (null == heatConf) { + heatConf = new JSONObject(); + heatConf.put("bgOpacity", 100); + heatConf.put("interval", 4); + heatConf.put("intervalColors", "#0000ff|#0000ff|#00ff00|#ffea00|#ff0000"); + heatConf.put("intervalPos", "0.0|0.1849315|0.47945204|0.760274|1.0"); + heatConf.put("maxValue", 1); + heatConf.put("radius", 100); + } + return heatConf; + } + + public void setHeatConf(JSONObject heatConf) { + this.heatConf = heatConf; + } + + public JSONObject getToolConf() { + if (null == toolConf) { + toolConf = new JSONObject(); + toolConf.put("toolBgColor", "#808080"); + toolConf.put("toolBgOpacity", 80); + toolConf.put("toolBtnColor", "#fc8d51"); + toolConf.put("toolcolor", "#ffffff"); + toolConf.put("toolfamily", "微软雅黑"); + toolConf.put("toolsize", 13); + toolConf.put("toolstyle", 0); + + toolConf.put("detailBgColor", "#ffffff"); + toolConf.put("detailTitleBgColor", "#ecb562"); + toolConf.put("detailBgOpacity", 100); + toolConf.put("showRegion", true); + toolConf.put("showArea", true); + toolConf.put("showName", true); + toolConf.put("showLayerType", true); + toolConf.put("showDataType", true); + toolConf.put("showLng", true); + toolConf.put("showLat", true); + toolConf.put("showVal", true); + toolConf.put("showDesc", true); + toolConf.put("detailsize", 14); + toolConf.put("detailstyle", 0); + toolConf.put("detailfamily", "微软雅黑"); + toolConf.put("detailcolor", "#333333"); + } + return toolConf; + } + + public void setToolConf(JSONObject toolConf) { + this.toolConf = toolConf; + } + + public JSONObject getLabelConf() { + if (null == labelConf) { + labelConf = new JSONObject(); + labelConf.put("labelBgColor", "transparent"); + labelConf.put("labelJsPane", ""); + labelConf.put("labelType", 1); + labelConf.put("labelcolor", "#ff0000"); + labelConf.put("labelfamily", "微软雅黑"); + labelConf.put("labelsize", 10); + labelConf.put("labelstyle", 0); + labelConf.put("showDataType", true); + labelConf.put("showDesc", true); + labelConf.put("showLat", true); + labelConf.put("showLng", true); + labelConf.put("showLayerType", true); + labelConf.put("showName", true); + labelConf.put("showPointLabel", true); + } + return labelConf; + } + + public void setLabelConf(JSONObject labelConf) { + this.labelConf = labelConf; + } + + public NameJavaScriptGroup getLinkNameGroup() { + return linkNameGroup; + } + + public void setLinkNameGroup(NameJavaScriptGroup linkNameGroup) { + this.linkNameGroup = linkNameGroup; + } +} diff --git a/src/com/fr/plugin/lzljgdmap/LzljMapChartLocaleFinder.java b/src/com/fr/plugin/lzljgdmap/LzljMapChartLocaleFinder.java new file mode 100644 index 0000000..4f3037f --- /dev/null +++ b/src/com/fr/plugin/lzljgdmap/LzljMapChartLocaleFinder.java @@ -0,0 +1,10 @@ +package com.fr.plugin.lzljgdmap; + +import com.fr.stable.fun.impl.AbstractLocaleFinder; + +public class LzljMapChartLocaleFinder extends AbstractLocaleFinder { + @Override + public String find() { + return "com/fr/plugin/lzljgdmap/locale/lzljgdmap"; + } +} diff --git a/src/com/fr/plugin/lzljgdmap/LzljMapChartProvider.java b/src/com/fr/plugin/lzljgdmap/LzljMapChartProvider.java new file mode 100644 index 0000000..4b40279 --- /dev/null +++ b/src/com/fr/plugin/lzljgdmap/LzljMapChartProvider.java @@ -0,0 +1,11 @@ +package com.fr.plugin.lzljgdmap; + +import com.fr.extended.chart.AbstractChart; +import com.fr.extended.chart.AbstractExtentChartProvider; + +public class LzljMapChartProvider extends AbstractExtentChartProvider { + @Override + protected AbstractChart createChart() { + return new LzljMapChart(); + } +} diff --git a/src/com/fr/plugin/lzljgdmap/LzljMapChartUI.java b/src/com/fr/plugin/lzljgdmap/LzljMapChartUI.java new file mode 100644 index 0000000..02f4580 --- /dev/null +++ b/src/com/fr/plugin/lzljgdmap/LzljMapChartUI.java @@ -0,0 +1,44 @@ +package com.fr.plugin.lzljgdmap; + +import com.fr.design.gui.frpane.AttributeChangeListener; +import com.fr.design.mainframe.chart.AbstractChartAttrPane; +import com.fr.design.mainframe.chart.gui.data.report.AbstractReportDataContentPane; +import com.fr.extended.chart.AbstractExtendedChartTableDataPane; +import com.fr.extended.chart.AbstractExtendedChartUIProvider; +import com.fr.plugin.lzljgdmap.data.LzljMapDataPane; +import com.fr.plugin.lzljgdmap.data.LzljMapReportDataPane; +import com.fr.plugin.lzljgdmap.ui.LzljMapStylePane; + +/** + * @author fr.open + * @date 2022/8/19 + */ +public class LzljMapChartUI extends AbstractExtendedChartUIProvider { + + @Override + protected AbstractExtendedChartTableDataPane getTableDataSourcePane() { + return new LzljMapDataPane(); + } + + @Override + protected AbstractReportDataContentPane getReportDataSourcePane() { + return new LzljMapReportDataPane(); + } + + @Override + public String getIconPath() { + return "com/fr/plugin/lzljgdmap/images/icon.png"; + } + + @Override + public AbstractChartAttrPane[] getAttrPaneArray(AttributeChangeListener attributeChangeListener) { + return new AbstractChartAttrPane[]{ + new LzljMapStylePane(attributeChangeListener) + }; + } + + @Override + public String[] getDemoImagePath() { + return new String[]{"com/fr/plugin/lzljgdmap/images/demo.png"}; + } +} diff --git a/src/com/fr/plugin/lzljgdmap/data/LzljMapDataConfig.java b/src/com/fr/plugin/lzljgdmap/data/LzljMapDataConfig.java new file mode 100644 index 0000000..66b020d --- /dev/null +++ b/src/com/fr/plugin/lzljgdmap/data/LzljMapDataConfig.java @@ -0,0 +1,187 @@ +package com.fr.plugin.lzljgdmap.data; + +import com.fr.extended.chart.AbstractDataConfig; +import com.fr.extended.chart.ExtendedField; +import com.fr.stable.AssistUtils; +import com.fr.stable.xml.XMLPrintWriter; +import com.fr.stable.xml.XMLableReader; + +/** + * @author fr.open + * @date 2022/8/25 + */ +public class LzljMapDataConfig extends AbstractDataConfig { + + private ExtendedField region = new ExtendedField(); + private ExtendedField area = new ExtendedField(); + private ExtendedField county = new ExtendedField(); + private ExtendedField layertype = new ExtendedField(); + private ExtendedField datatype = new ExtendedField(); + private ExtendedField lng = new ExtendedField(); + private ExtendedField lat = new ExtendedField(); + private ExtendedField name = new ExtendedField(); + private ExtendedField val = new ExtendedField(); + private ExtendedField desc = new ExtendedField(); + + @Override + protected void readAttr(XMLableReader xmLableReader) { + readExtendedField(region, "region", xmLableReader); + readExtendedField(area, "area", xmLableReader); + readExtendedField(county, "county", xmLableReader); + readExtendedField(layertype, "layertype", xmLableReader); + readExtendedField(datatype, "datatype", xmLableReader); + readExtendedField(lng, "lng", xmLableReader); + readExtendedField(lat, "lat", xmLableReader); + readExtendedField(name, "name", xmLableReader); + readExtendedField(val, "val", xmLableReader); + readExtendedField(desc, "desc", xmLableReader); + } + + @Override + protected void writeAttr(XMLPrintWriter xmlPrintWriter) { + writeExtendedField(region, "region", xmlPrintWriter); + writeExtendedField(area, "area", xmlPrintWriter); + writeExtendedField(county, "county", xmlPrintWriter); + writeExtendedField(layertype, "layertype", xmlPrintWriter); + writeExtendedField(datatype, "datatype", xmlPrintWriter); + writeExtendedField(lng, "lng", xmlPrintWriter); + writeExtendedField(lat, "lat", xmlPrintWriter); + writeExtendedField(name, "name", xmlPrintWriter); + writeExtendedField(val, "val", xmlPrintWriter); + writeExtendedField(desc, "desc", xmlPrintWriter); + } + + @Override + public ExtendedField[] dataSetFields() { + return new ExtendedField[]{ + region, + area, + county, + layertype, + datatype, + lng, + lat, + name, + val, + desc + }; + } + + @Override + public LzljMapDataConfig clone() throws CloneNotSupportedException { + LzljMapDataConfig result = new LzljMapDataConfig(); + result.setRegion(this.getRegion().clone()); + result.setArea(this.getArea().clone()); + result.setCounty(this.getCounty().clone()); + result.setLayertype(this.getLayertype().clone()); + result.setDatatype(this.getDatatype().clone()); + result.setLng(this.getLng().clone()); + result.setLat(this.getLat().clone()); + result.setName(this.getName().clone()); + result.setVal(this.getVal().clone()); + result.setDesc(this.getDesc().clone()); + return result; + } + + @Override + public int hashCode() { + return super.hashCode() + AssistUtils.hashCode(this.getRegion(), this.getArea(), this.getCounty(), this.getLayertype(), this.getDatatype(), this.getLng(), this.getLat(), this.getName(),this.getVal(),this.getDesc()); + } + + @Override + public boolean equals(Object obj) { + return super.equals(obj) + && obj instanceof LzljMapDataConfig + && AssistUtils.equals(this.getRegion(), ((LzljMapDataConfig) obj).getRegion()) + && AssistUtils.equals(this.getArea(), ((LzljMapDataConfig) obj).getArea()) + && AssistUtils.equals(this.getCounty(), ((LzljMapDataConfig) obj).getCounty()) + && AssistUtils.equals(this.getLayertype(), ((LzljMapDataConfig) obj).getLayertype()) + && AssistUtils.equals(this.getDatatype(), ((LzljMapDataConfig) obj).getDatatype()) + && AssistUtils.equals(this.getLng(), ((LzljMapDataConfig) obj).getLng()) + && AssistUtils.equals(this.getLat(), ((LzljMapDataConfig) obj).getLat()) + && AssistUtils.equals(this.getName(), ((LzljMapDataConfig) obj).getName()) + && AssistUtils.equals(this.getVal(), ((LzljMapDataConfig) obj).getVal()) + && AssistUtils.equals(this.getDesc(), ((LzljMapDataConfig) obj).getDesc()) + ; + } + + public ExtendedField getDatatype() { + return datatype; + } + + public void setDatatype(ExtendedField datatype) { + this.datatype = datatype; + } + + public ExtendedField getLayertype() { + return layertype; + } + + public void setLayertype(ExtendedField layertype) { + this.layertype = layertype; + } + + public ExtendedField getLng() { + return lng; + } + + public void setLng(ExtendedField lng) { + this.lng = lng; + } + + public ExtendedField getLat() { + return lat; + } + + public void setLat(ExtendedField lat) { + this.lat = lat; + } + + public ExtendedField getName() { + return name; + } + + public void setName(ExtendedField name) { + this.name = name; + } + + public ExtendedField getVal() { + return val; + } + + public void setVal(ExtendedField val) { + this.val = val; + } + + public ExtendedField getDesc() { + return desc; + } + + public void setDesc(ExtendedField desc) { + this.desc = desc; + } + + public ExtendedField getRegion() { + return region; + } + + public void setRegion(ExtendedField region) { + this.region = region; + } + + public ExtendedField getArea() { + return area; + } + + public void setArea(ExtendedField area) { + this.area = area; + } + + public ExtendedField getCounty() { + return county; + } + + public void setCounty(ExtendedField county) { + this.county = county; + } +} diff --git a/src/com/fr/plugin/lzljgdmap/data/LzljMapDataPane.java b/src/com/fr/plugin/lzljgdmap/data/LzljMapDataPane.java new file mode 100644 index 0000000..78a0beb --- /dev/null +++ b/src/com/fr/plugin/lzljgdmap/data/LzljMapDataPane.java @@ -0,0 +1,89 @@ +package com.fr.plugin.lzljgdmap.data; + +import com.fr.design.gui.icombobox.UIComboBox; +import com.fr.design.i18n.Toolkit; +import com.fr.extended.chart.AbstractExtendedChartTableDataPane; + +/** + * @author fr.open + * @date 2022/8/25 + */ +public class LzljMapDataPane extends AbstractExtendedChartTableDataPane { + + private UIComboBox layertype; + private UIComboBox datatype; + private UIComboBox lng; + private UIComboBox lat; + private UIComboBox name; + private UIComboBox val; + private UIComboBox desc; + private UIComboBox region; + private UIComboBox area; + private UIComboBox county; + + + @Override + protected String[] fieldLabels() { + return new String[]{ + Toolkit.i18nText("Plugin_LzljMap_region"), + Toolkit.i18nText("Plugin_LzljMap_area"), + Toolkit.i18nText("Plugin_LzljMap_county"), + Toolkit.i18nText("Plugin_LzljMap_layertype"), + Toolkit.i18nText("Plugin_LzljMap_datatype"), + Toolkit.i18nText("Plugin_LzljMap_lng"), + Toolkit.i18nText("Plugin_LzljMap_lat"), + Toolkit.i18nText("Plugin_LzljMap_name"), + Toolkit.i18nText("Plugin_LzljMap_val"), + Toolkit.i18nText("Plugin_LzljMap_desc") + }; + } + + @Override + protected UIComboBox[] filedComboBoxes() { + if (null == datatype) { + region = new UIComboBox(); + area = new UIComboBox(); + county = new UIComboBox(); + layertype = new UIComboBox(); + datatype = new UIComboBox(); + lng = new UIComboBox(); + lat = new UIComboBox(); + name = new UIComboBox(); + val = new UIComboBox(); + desc = new UIComboBox(); + } + return new UIComboBox[]{ + region, area, county, layertype, datatype, lng, lat, name, val, desc + }; + } + + @Override + protected void populate(LzljMapDataConfig dataConfig) { + populateField(region, dataConfig.getRegion()); + populateField(area, dataConfig.getArea()); + populateField(county, dataConfig.getCounty()); + populateField(layertype, dataConfig.getLayertype()); + populateField(datatype, dataConfig.getDatatype()); + populateField(lng, dataConfig.getLng()); + populateField(lat, dataConfig.getLat()); + populateField(name, dataConfig.getName()); + populateField(val, dataConfig.getVal()); + populateField(desc, dataConfig.getDesc()); + } + + @Override + protected LzljMapDataConfig update() { + LzljMapDataConfig dataConfig = new LzljMapDataConfig(); + updateField(region, dataConfig.getRegion()); + updateField(area, dataConfig.getArea()); + updateField(county, dataConfig.getCounty()); + updateField(layertype, dataConfig.getLayertype()); + updateField(datatype, dataConfig.getDatatype()); + updateField(lng, dataConfig.getLng()); + updateField(lat, dataConfig.getLat()); + updateField(name, dataConfig.getName()); + updateField(val, dataConfig.getVal()); + updateField(desc, dataConfig.getDesc()); + return dataConfig; + } +} diff --git a/src/com/fr/plugin/lzljgdmap/data/LzljMapReportDataPane.java b/src/com/fr/plugin/lzljgdmap/data/LzljMapReportDataPane.java new file mode 100644 index 0000000..dcee39c --- /dev/null +++ b/src/com/fr/plugin/lzljgdmap/data/LzljMapReportDataPane.java @@ -0,0 +1,89 @@ +package com.fr.plugin.lzljgdmap.data; + +import com.fr.design.formula.TinyFormulaPane; +import com.fr.design.i18n.Toolkit; +import com.fr.extended.chart.AbstractExtendedChartReportDataPane; + +/** + * @author fr.open + * @date 2022/8/25 + */ +public class LzljMapReportDataPane extends AbstractExtendedChartReportDataPane { + + private TinyFormulaPane layertype; + private TinyFormulaPane datatype; + private TinyFormulaPane lng; + private TinyFormulaPane lat; + private TinyFormulaPane name; + private TinyFormulaPane val; + private TinyFormulaPane desc; + private TinyFormulaPane region; + private TinyFormulaPane area; + private TinyFormulaPane county; + + + @Override + protected String[] fieldLabel() { + return new String[]{ + Toolkit.i18nText("Plugin_LzljMap_region"), + Toolkit.i18nText("Plugin_LzljMap_area"), + Toolkit.i18nText("Plugin_LzljMap_county"), + Toolkit.i18nText("Plugin_LzljMap_layertype"), + Toolkit.i18nText("Plugin_LzljMap_datatype"), + Toolkit.i18nText("Plugin_LzljMap_lng"), + Toolkit.i18nText("Plugin_LzljMap_lat"), + Toolkit.i18nText("Plugin_LzljMap_name"), + Toolkit.i18nText("Plugin_LzljMap_val"), + Toolkit.i18nText("Plugin_LzljMap_desc") + }; + } + + @Override + protected TinyFormulaPane[] formulaPanes() { + if (null == datatype) { + region = new TinyFormulaPane(); + area = new TinyFormulaPane(); + county = new TinyFormulaPane(); + layertype = new TinyFormulaPane(); + datatype = new TinyFormulaPane(); + lng = new TinyFormulaPane(); + lat = new TinyFormulaPane(); + name = new TinyFormulaPane(); + val = new TinyFormulaPane(); + desc = new TinyFormulaPane(); + } + return new TinyFormulaPane[]{ + region, area, county, layertype, datatype, lng, lat, name, val, desc + }; + } + + @Override + protected void populate(LzljMapDataConfig dataConfig) { + populateField(region, dataConfig.getRegion()); + populateField(area, dataConfig.getArea()); + populateField(county, dataConfig.getCounty()); + populateField(layertype, dataConfig.getLayertype()); + populateField(datatype, dataConfig.getDatatype()); + populateField(lng, dataConfig.getLng()); + populateField(lat, dataConfig.getLat()); + populateField(name, dataConfig.getName()); + populateField(val, dataConfig.getVal()); + populateField(desc, dataConfig.getDesc()); + } + + @Override + protected LzljMapDataConfig update() { + LzljMapDataConfig dataConfig = new LzljMapDataConfig(); + updateField(region, dataConfig.getRegion()); + updateField(area, dataConfig.getArea()); + updateField(county, dataConfig.getCounty()); + updateField(layertype, dataConfig.getLayertype()); + updateField(datatype, dataConfig.getDatatype()); + updateField(lng, dataConfig.getLng()); + updateField(lat, dataConfig.getLat()); + updateField(name, dataConfig.getName()); + updateField(val, dataConfig.getVal()); + updateField(desc, dataConfig.getDesc()); + return dataConfig; + } +} diff --git a/src/com/fr/plugin/lzljgdmap/images/demo.png b/src/com/fr/plugin/lzljgdmap/images/demo.png new file mode 100644 index 0000000000000000000000000000000000000000..c1c8b4e7086877e8ab040184969fb155a1d0a75e GIT binary patch literal 120307 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Ð@~HFR^pN(;-S1!o@&77>Iygd`I#o5B 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 rg|tCOI*^&kqzaW(N=c>E { + private ImageFileChooser imageChooser; + private ImagePreviewPane imagePreview; + + private UIButton imagebtn; + + private ImageEntity imageEntity; + + public ImageChooserPane() { + this.setLayout(new BorderLayout()); + + imagePreview = new ImagePreviewPane(); + imageEntity = new ImageEntity(); + imagebtn = new UIButton("选择图标"); + UILabel imageLab = new UILabel("点图标"); + + double p = TableLayout.PREFERRED; + double f = TableLayout.FILL; + double[] columnSize = {p, f}; + double[] rowSize = {p, p, p}; + Component[][] acomponents = new Component[][]{ + new Component[]{imageLab, imagebtn}, + new Component[]{null, imagePreview} + }; + + JPanel panel = TableLayoutHelper.createTableLayoutPane(acomponents, rowSize, columnSize); + + this.add(panel, BorderLayout.CENTER); + + this.setVisible(true); + + imageChooser = new ImageFileChooser(); + imageChooser.setMultiSelectionEnabled(false); + initLiseners(); + } + + private void initLiseners() { + this.imagebtn.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + int returnVal = imageChooser.showOpenDialog(ImageChooserPane.this); + if (returnVal != JFileChooser.CANCEL_OPTION) { + dealWithImageFile(); + } + } + }); + } + + private void dealWithImageFile() { + final File selectedFile = imageChooser.getSelectedFile(); + if (selectedFile != null && selectedFile.isFile()) { + BufferedImage image = BaseUtils.readImage(selectedFile.getPath()); + if (null == image) { + return; + } + if (image.getWidth() > 300 || image.getHeight() > 300) { + JOptionPane.showMessageDialog(null, + "图片太大,请重新选择!大小不超过300*300,当前尺寸:" + image.getWidth() + "*" + image.getHeight(), + "信息提示", + JOptionPane.ERROR_MESSAGE); + return; + } + + String type = ImageUtils.getImageType(selectedFile); + String iconBase64 = Base64Converter.encode(GeneralXMLTools.imageEncode(image, type)); + + if (null == this.imageEntity) { + this.imageEntity = new ImageEntity(); + } + this.imageEntity.setImagestr(iconBase64); + this.imageEntity.setImagetype(type); + this.imageEntity.setWidth(image.getWidth()); + this.imageEntity.setHeight(image.getHeight()); + + if (imagePreview != null) { + ImageWithSuffix imageWithSuffix = new ImageWithSuffix(image, type); + imagePreview.setImageStyle(Style.getInstance()); + imagePreview.setImageWithSuffix(imageWithSuffix); + imagePreview.repaint(); + } + } + } + + @Override + public void populateBean(ImageEntity ob) { + if (null == ob || null == ob.getImagestr() || "".equals(ob.getImagestr())) { + this.imageEntity = new ImageEntity(); + this.imagePreview.setImage(null); + this.imagePreview.repaint(); + new ImagePreviewPane(); + return; + } + this.imageEntity = ob; + BufferedImage image = (BufferedImage) GeneralXMLTools.imageDecode(Base64Converter.decode(ob.getImagestr().getBytes())); + if (imagePreview != null && null != image) { + ImageWithSuffix imageWithSuffix = new ImageWithSuffix(image, ob.getImagetype()); + imagePreview.setImageStyle(Style.getInstance()); + imagePreview.setImageWithSuffix(imageWithSuffix); + imagePreview.repaint(); + } + } + + @Override + public ImageEntity updateBean() { + return this.imageEntity; + } + + @Override + protected String title4PopupWindow() { + return "点图标设置"; + } + +} diff --git a/src/com/fr/plugin/lzljgdmap/ui/ImageEntity.java b/src/com/fr/plugin/lzljgdmap/ui/ImageEntity.java new file mode 100644 index 0000000..1957d76 --- /dev/null +++ b/src/com/fr/plugin/lzljgdmap/ui/ImageEntity.java @@ -0,0 +1,42 @@ +package com.fr.plugin.lzljgdmap.ui; + +import java.io.Serializable; + +public class ImageEntity implements Serializable { + private String imagestr; + private String imagetype; + private int width; + private int height; + + public String getImagestr() { + return imagestr; + } + + public void setImagestr(String imagestr) { + this.imagestr = imagestr; + } + + public String getImagetype() { + return imagetype; + } + + public void setImagetype(String imagetype) { + this.imagetype = imagetype; + } + + public int getWidth() { + return width; + } + + public void setWidth(int width) { + this.width = width; + } + + public int getHeight() { + return height; + } + + public void setHeight(int height) { + this.height = height; + } +} diff --git a/src/com/fr/plugin/lzljgdmap/ui/LzljMapClusterPointStyleCreator.java b/src/com/fr/plugin/lzljgdmap/ui/LzljMapClusterPointStyleCreator.java new file mode 100644 index 0000000..684f12f --- /dev/null +++ b/src/com/fr/plugin/lzljgdmap/ui/LzljMapClusterPointStyleCreator.java @@ -0,0 +1,188 @@ +package com.fr.plugin.lzljgdmap.ui; + +import com.fr.design.gui.frpane.UINumberDragPane; +import com.fr.design.gui.ibutton.UIButton; +import com.fr.design.gui.icombobox.UIComboBox; +import com.fr.design.gui.ilable.UILabel; +import com.fr.design.gui.ispinner.UISpinner; +import com.fr.design.gui.itextarea.UITextArea; +import com.fr.design.gui.itextfield.UITextField; +import com.fr.design.i18n.Toolkit; +import com.fr.design.layout.TableLayout; +import com.fr.design.layout.TableLayoutHelper; +import com.fr.design.style.color.ColorSelectBox; +import com.fr.json.JSONObject; +import com.fr.plugin.lzljgdmap.vo.ClusterPointMapStyleJson; +import com.fr.plugin.lzljgdmap.vo.CustomJsonObject; +import com.fr.van.chart.designer.AbstractVanChartScrollPane; +import com.fr.van.chart.designer.TableLayout4VanChartHelper; + +import javax.swing.*; +import java.awt.*; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; + +/** + * @author fr.open + */ +public class LzljMapClusterPointStyleCreator extends AbstractVanChartScrollPane { + + private UITextArea condition; + + private UISpinner clusterPointSize; + private ColorSelectBox clusterBorderColor; + private ColorSelectBox clusterFillColor; + private ColorSelectBox clusterTextColor; + private UINumberDragPane clusterBgOpacity; + + + @Override + protected JPanel createContentPane() { + return new ContentPane(); + } + + @Override + public void populateBean(CustomJsonObject json) { + JSONObject chartConf = null; + if (null != json) { + chartConf = json.get(); + } + if (null != chartConf) { + this.clusterPointSize.setValue(chartConf.getDouble("clusterPointSize")); + this.clusterBorderColor.setSelectObject(MapUtil.toColor(chartConf.getString("clusterBorderColor"))); + this.clusterFillColor.setSelectObject(MapUtil.toColor(chartConf.getString("clusterFillColor"))); + this.clusterTextColor.setSelectObject(MapUtil.toColor(chartConf.getString("clusterTextColor"))); + this.clusterBgOpacity.populateBean(chartConf.getDouble("clusterBgOpacity")); + this.condition.setText(chartConf.getString("condition")); + } + } + + @Override + public CustomJsonObject updateBean() { + JSONObject chartConf = JSONObject.create(); + + chartConf.put("clusterPointSize", this.clusterPointSize.getValue()); + chartConf.put("clusterBorderColor", MapUtil.toHex(this.clusterBorderColor.getSelectObject())); + chartConf.put("clusterFillColor", MapUtil.toHex(this.clusterFillColor.getSelectObject())); + chartConf.put("clusterTextColor", MapUtil.toHex(this.clusterTextColor.getSelectObject())); + chartConf.put("clusterBgOpacity", this.clusterBgOpacity.updateBean()); + chartConf.put("condition", this.condition.getText()); + + ClusterPointMapStyleJson json = new ClusterPointMapStyleJson(); + chartConf.put("title", json.getTilte()); + json.put(chartConf); + return json; + } + + @Override + protected String title4PopupWindow() { + return Toolkit.i18nText("Plugin-LzljMap-Cond-pointMapTitle"); + } + + protected class ContentPane extends JPanel { + public ContentPane() { + initComponents(); + } + + private void initComponents() { + this.setLayout(new BorderLayout()); + + JPanel condPane = createConditionPane(); + JPanel stylePane = createStylePane(); + + double p = TableLayout.PREFERRED; + double f = TableLayout.FILL; + double[] columnSize = {f}; + double[] rowSize = {p, p, p}; + Component[][] acomponents = new Component[][]{ + new Component[]{condPane}, + new Component[]{stylePane} + }; + + JPanel panel = TableLayoutHelper.createTableLayoutPane(acomponents, rowSize, columnSize); + this.add(panel, BorderLayout.CENTER); + this.setVisible(true); + } + } + + private JPanel createStylePane() { + + this.clusterPointSize = new UISpinner(0, 1000, 1, 32); + this.clusterBorderColor = new ColorSelectBox(100); + this.clusterFillColor = new ColorSelectBox(100); + this.clusterTextColor = new ColorSelectBox(100); + this.clusterBgOpacity = new UINumberDragPane(0, 100); + + Component[][] components = new Component[][]{ + {null, null}, + new Component[]{new UILabel(Toolkit.i18nText("Plugin-LzljMap-pointSize")), this.clusterPointSize}, + new Component[]{new UILabel(Toolkit.i18nText("Plugin-LzljMap-clusterBorderColor")), this.clusterBorderColor}, + new Component[]{new UILabel(Toolkit.i18nText("Plugin-LzljMap-clusterFillColor")), this.clusterFillColor}, + new Component[]{new UILabel(Toolkit.i18nText("Plugin-LzljMap-clusterTextColor")), this.clusterTextColor}, + new Component[]{new UILabel(Toolkit.i18nText("Plugin-LzljMap-clusterBgOpacity")), this.clusterBgOpacity} + }; + + double p = TableLayout.PREFERRED; + double[] columnSize = {TableLayout.PREFERRED, TableLayout.FILL}; + double[] rowSize = {p, p, p, p, p, p, p}; + JPanel sizePane = TableLayout4VanChartHelper.createGapTableLayoutPane(components, rowSize, columnSize); + + Component[][] comp1 = new Component[][]{ + new Component[]{sizePane} + }; + JPanel panel = TableLayout4VanChartHelper.createGapTableLayoutPane(comp1, new double[]{p, p, p}, new double[]{TableLayout.FILL}); + + return TableLayout4VanChartHelper.createExpandablePaneWithTitle(Toolkit.i18nText("Plugin-LzljMap-Cond-PointMapStyleExpand"), panel); + } + + private JPanel createConditionPane() { + condition = new UITextArea(3, 6); + + final UITextField value = new UITextField(); + final UIComboBox cond = new UIComboBox(new String[]{"==", ">", "<"}); + UILabel name = new UILabel(Toolkit.i18nText("Plugin-LzljMap-Cond-clusterCountNameLabel")); + UIButton add = new UIButton(Toolkit.i18nText("Plugin-LzljMap-Cond-addButton")); + + UIButton clear = new UIButton(Toolkit.i18nText("Plugin-LzljMap-Cond-clearButton")); + + double p = TableLayout.PREFERRED; + double f = TableLayout.FILL; + Component[][] components = new Component[][]{ + new Component[]{name, cond, value, add, clear} + }; + JPanel condPane = TableLayout4VanChartHelper.createGapTableLayoutPane(components, new double[]{p, p, p, p, p}, new double[]{p, p, f, p, p}); + + Component[][] comp1 = new Component[][]{ + new Component[]{condition} + }; + JPanel areaPane = TableLayout4VanChartHelper.createGapTableLayoutPane(comp1, new double[]{p}, new double[]{f}); + + Component[][] comp = new Component[][]{ + new Component[]{condPane}, + new Component[]{areaPane} + }; + JPanel sumPane = TableLayout4VanChartHelper.createGapTableLayoutPane(comp, new double[]{p, p}, new double[]{f}); + + condition.setEnabled(false); + add.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + String srcStr = condition.getText(); + if (null != srcStr && !"".equals(srcStr)) { + srcStr += " && "; + } + String condstr = "{聚合数量} " + cond.getSelectedItem() + " " + value.getText(); + condition.setText(srcStr + condstr); + } + }); + + clear.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + condition.setText(""); + } + }); + return TableLayout4VanChartHelper.createExpandablePaneWithTitle(Toolkit.i18nText("Plugin-LzljMap-Cond-condTaskStyleTitle"), sumPane); + } + +} diff --git a/src/com/fr/plugin/lzljgdmap/ui/LzljMapHyperLink.java b/src/com/fr/plugin/lzljgdmap/ui/LzljMapHyperLink.java new file mode 100644 index 0000000..23feba4 --- /dev/null +++ b/src/com/fr/plugin/lzljgdmap/ui/LzljMapHyperLink.java @@ -0,0 +1,55 @@ +package com.fr.plugin.lzljgdmap.ui; + +import com.fr.base.BaseFormula; +import com.fr.chart.chartattr.Plot; +import com.fr.design.beans.BasicBeanPane; +import com.fr.design.gui.controlpane.NameableCreator; +import com.fr.js.NameJavaScriptGroup; +import com.fr.plugin.lzljgdmap.LzljMapChart; +import com.fr.van.chart.custom.component.VanChartHyperLinkPane; + +import java.util.Map; + +public class LzljMapHyperLink extends VanChartHyperLinkPane { + + private LzljMapChart chart; + + public void populateBean(LzljMapChart paramAbstractECharts) { + this.chart = paramAbstractECharts; + populate(paramAbstractECharts.getPlot()); + } + + public void updateBean(LzljMapChart paramAbstractECharts) { + update(paramAbstractECharts.getPlot()); + } + + @Override + public NameableCreator[] createNameableCreators() { + return super.createNameableCreators(); + } + + @Override + public BasicBeanPane createPaneByCreators(NameableCreator nameableCreator) { + return super.createPaneByCreators(nameableCreator); + } + + @Override + protected Map getHyperLinkEditorMap() { + return this.chart.getHyperLinkEditorMap(); + } + + @Override + public void refreshNameableCreator(NameableCreator[] nameableCreators) { + super.refreshNameableCreator(nameableCreators); + } + + @Override + protected NameJavaScriptGroup populateHotHyperLink(Plot paramPlot) { + return this.chart.getLinkNameGroup(); + } + + @Override + protected void updateHotHyperLink(Plot paramPlot, NameJavaScriptGroup paramNameJavaScriptGroup) { + this.chart.setLinkNameGroup(paramNameJavaScriptGroup); + } +} diff --git a/src/com/fr/plugin/lzljgdmap/ui/LzljMapPointCondListPane.java b/src/com/fr/plugin/lzljgdmap/ui/LzljMapPointCondListPane.java new file mode 100644 index 0000000..0c319cf --- /dev/null +++ b/src/com/fr/plugin/lzljgdmap/ui/LzljMapPointCondListPane.java @@ -0,0 +1,146 @@ +package com.fr.plugin.lzljgdmap.ui; + +import com.fr.chart.chartattr.Plot; +import com.fr.design.beans.BasicBeanPane; +import com.fr.design.gui.controlpane.NameObjectCreator; +import com.fr.design.gui.controlpane.NameableCreator; +import com.fr.design.gui.imenutable.UIMenuNameableCreator; +import com.fr.design.i18n.Toolkit; +import com.fr.general.NameObject; +import com.fr.json.JSONArray; +import com.fr.json.JSONObject; +import com.fr.log.FineLoggerFactory; +import com.fr.plugin.lzljgdmap.LzljMapChart; +import com.fr.plugin.lzljgdmap.vo.ClusterPointMapStyleJson; +import com.fr.plugin.lzljgdmap.vo.CustomJsonObject; +import com.fr.plugin.lzljgdmap.vo.PointMapStyleJson; +import com.fr.stable.ListMap; +import com.fr.stable.Nameable; +import com.fr.van.chart.designer.component.VanChartUIListControlPane; + +import java.lang.reflect.Constructor; +import java.lang.reflect.InvocationTargetException; +import java.util.ArrayList; +import java.util.HashMap; + +/** + * @author fr.open + */ +public class LzljMapPointCondListPane extends VanChartUIListControlPane { + + private LzljMapChart chart; + + private HashMap paneMap; + private HashMap jsonMap; + + public LzljMapPointCondListPane() { + paneMap = new HashMap(6); + paneMap.put(CustomJsonObject.POINT_MAP_TITLE, LzljMapPointStyleCreator.class); + paneMap.put(CustomJsonObject.CLUSTER_POINT_MAP_TITLE, LzljMapClusterPointStyleCreator.class); + + jsonMap = new HashMap(6); + jsonMap.put(CustomJsonObject.POINT_MAP_TITLE, PointMapStyleJson.class); + jsonMap.put(CustomJsonObject.CLUSTER_POINT_MAP_TITLE, ClusterPointMapStyleJson.class); + } + + @Override + protected void update(Plot plot) { + } + + public void populateStyle(LzljMapChart chart) { + this.chart = chart; + + JSONArray pointStyleCond = chart.getPointStyleCond(); + ArrayList noList = new ArrayList(); + for (int i = 0; null != pointStyleCond && i < pointStyleCond.size(); i++) { + JSONObject line = pointStyleCond.getJSONObject(i); + if (null != line) { + try { + CustomJsonObject json = (CustomJsonObject)this.getJsonByTitle(line.getString("title")).newInstance(); + json.put(line); + UIMenuNameableCreator var11 = new UIMenuNameableCreator(line.getString("titleName"), json, this.getEditPaneByTitle(line.getString("title"))); + noList.add(new NameObject(var11.getName(), var11.getObj())); + } catch (InstantiationException e) { + e.printStackTrace(); + } catch (IllegalAccessException e) { + e.printStackTrace(); + } + } + } + + this.populate((Nameable[])noList.toArray(new NameObject[noList.size()])); + this.doLayout(); + + } + + public void updateStyle(LzljMapChart chart) { + Nameable[] nameables = this.update(); + + JSONArray objConf = JSONArray.create(); + for (int i = 0; i < nameables.length; i++) { + CustomJsonObject noObj = (CustomJsonObject)((NameObject)nameables[i]).getObject(); + if (null == noObj) { + noObj = new CustomJsonObject(); + noObj.put(JSONObject.create()); + } + if (null == noObj.get()) { + noObj.put(JSONObject.create()); + } + + noObj.get().put("titleName", ((NameObject)nameables[i]).getName()); + objConf.add(noObj.get()); + } + + chart.setPointStyleCond(objConf); + + } + + @Override + public NameableCreator[] createNameableCreators() { + ListMap creatorMap = new ListMap(); + + NameableCreator mon = new NameObjectCreator(Toolkit.i18nText("Plugin-LzljMap-Cond-pointStyle"), PointMapStyleJson.class, LzljMapPointStyleCreator.class); + creatorMap.put(mon.menuName(), mon); + NameableCreator cluster = new NameObjectCreator(Toolkit.i18nText("Plugin-LzljMap-Cond-clusterPointStyle"), ClusterPointMapStyleJson.class, LzljMapClusterPointStyleCreator.class); + creatorMap.put(cluster.menuName(), cluster); + + return (NameableCreator[])creatorMap.values().toArray(new NameableCreator[creatorMap.size()]); + } + + @Override + protected String title4PopupWindow() { + return Toolkit.i18nText("Plugin-LzljMap-Cond-AddCondtion"); + } + + @Override + protected String getAddItemText() { + return Toolkit.i18nText("Plugin-LzljMap-Cond-AddCondtion"); + } + + @Override + public BasicBeanPane createPaneByCreators(NameableCreator nameableCreator) { + Constructor var2 = null; + try { + var2 = nameableCreator.getUpdatePane().getConstructor(); + return (BasicBeanPane)var2.newInstance(); + } catch (InstantiationException var4) { + FineLoggerFactory.getLogger().error(var4.getMessage(), var4); + } catch (IllegalAccessException var5) { + FineLoggerFactory.getLogger().error(var5.getMessage(), var5); + } catch (NoSuchMethodException var6) { + return super.createPaneByCreators(nameableCreator); + } catch (InvocationTargetException var7) { + FineLoggerFactory.getLogger().error(var7.getMessage(), var7); + } + return null; + } + + private Class getEditPaneByTitle(String title) { + return (Class)paneMap.get(title); + } + + private Class getJsonByTitle(String title) { + return (Class)jsonMap.get(title); + } + +} diff --git a/src/com/fr/plugin/lzljgdmap/ui/LzljMapPointStyleCreator.java b/src/com/fr/plugin/lzljgdmap/ui/LzljMapPointStyleCreator.java new file mode 100644 index 0000000..8bab255 --- /dev/null +++ b/src/com/fr/plugin/lzljgdmap/ui/LzljMapPointStyleCreator.java @@ -0,0 +1,223 @@ +package com.fr.plugin.lzljgdmap.ui; + +import com.fr.design.gui.ibutton.UIButton; +import com.fr.design.gui.icombobox.UIComboBox; +import com.fr.design.gui.ilable.UILabel; +import com.fr.design.gui.ispinner.UISpinner; +import com.fr.design.gui.itextarea.UITextArea; +import com.fr.design.gui.itextfield.UITextField; +import com.fr.design.i18n.Toolkit; +import com.fr.design.layout.TableLayout; +import com.fr.design.layout.TableLayoutHelper; +import com.fr.json.JSONObject; +import com.fr.plugin.lzljgdmap.vo.CustomJsonObject; +import com.fr.plugin.lzljgdmap.vo.PointMapStyleJson; +import com.fr.van.chart.designer.AbstractVanChartScrollPane; +import com.fr.van.chart.designer.TableLayout4VanChartHelper; + +import javax.swing.*; +import java.awt.*; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; + +/** + * @author fr.open + */ +public class LzljMapPointStyleCreator extends AbstractVanChartScrollPane { + + private UITextArea condition; + + private UITextField legendName; + private UISpinner pointSize; + private ImageChooserPane pointPane; + + + @Override + protected JPanel createContentPane() { + return new ContentPane(); + } + + @Override + public void populateBean(CustomJsonObject json) { + JSONObject chartConf = null; + if (null != json) { + chartConf = json.get(); + } + if (null != chartConf) { + this.legendName.setText(chartConf.getString("legendName")); + this.pointSize.setValue(chartConf.getDouble("pointSize")); + this.condition.setText(chartConf.getString("condition")); + + ImageEntity imgEnt = new ImageEntity(); + imgEnt.setImagestr(chartConf.getString("pointimg")); + imgEnt.setImagetype(chartConf.getString("pointimgtype")); + imgEnt.setWidth(chartConf.getInt("pointimgw")); + imgEnt.setHeight(chartConf.getInt("pointimgh")); + this.pointPane.populateBean(imgEnt); + } + } + + @Override + public CustomJsonObject updateBean() { + JSONObject chartConf = JSONObject.create(); + + chartConf.put("legendName", this.legendName.getText()); + chartConf.put("pointSize", this.pointSize.getValue()); + chartConf.put("condition", this.condition.getText()); + + ImageEntity imgEnt = this.pointPane.updateBean(); + if (null != imgEnt) { + chartConf.put("pointimg", imgEnt.getImagestr()); + chartConf.put("pointimgtype", imgEnt.getImagetype()); + chartConf.put("pointimgw", imgEnt.getWidth()); + chartConf.put("pointimgh", imgEnt.getHeight()); + } + + PointMapStyleJson json = new PointMapStyleJson(); + chartConf.put("title", json.getTilte()); + json.put(chartConf); + return json; + } + + @Override + protected String title4PopupWindow() { + return Toolkit.i18nText("Plugin-LzljMap-Cond-pointMapTitle"); + } + + protected class ContentPane extends JPanel { + public ContentPane() { + initComponents(); + } + + private void initComponents() { + this.setLayout(new BorderLayout()); + + JPanel condPane = createConditionPane(); + JPanel stylePane = createStylePane(); + + double p = TableLayout.PREFERRED; + double f = TableLayout.FILL; + double[] columnSize = {f}; + double[] rowSize = {p, p, p}; + Component[][] acomponents = new Component[][]{ + new Component[]{condPane}, + new Component[]{stylePane} + }; + + JPanel panel = TableLayoutHelper.createTableLayoutPane(acomponents, rowSize, columnSize); + this.add(panel, BorderLayout.CENTER); + this.setVisible(true); + } + } + + private JPanel createStylePane() { + + this.legendName = new UITextField(); + this.pointSize = new UISpinner(0, 1000, 1, 32); + this.pointPane = new ImageChooserPane(); + + Component[][] components = new Component[][]{ + {null, null}, + //new Component[]{new UILabel(Toolkit.i18nText("Plugin-LzljMap-Cond-legendName")), this.legendName}, + new Component[]{new UILabel(Toolkit.i18nText("Plugin-LzljMap-Cond-pointSize")), this.pointSize} + }; + + double p = TableLayout.PREFERRED; + double[] columnSize = {TableLayout.PREFERRED, TableLayout.FILL}; + double[] rowSize = {p, p, p}; + JPanel sizePane = TableLayout4VanChartHelper.createGapTableLayoutPane(components, rowSize, columnSize); + + Component[][] comp1 = new Component[][]{ + new Component[]{sizePane}, + new Component[]{pointPane} + }; + JPanel panel = TableLayout4VanChartHelper.createGapTableLayoutPane(comp1, new double[]{p, p, p}, new double[]{TableLayout.FILL}); + + return TableLayout4VanChartHelper.createExpandablePaneWithTitle(Toolkit.i18nText("Plugin-LzljMap-Cond-PointMapStyleExpand"), panel); + } + + private JPanel createConditionPane() { + condition = new UITextArea(3, 6); + + final UITextField typevalue = new UITextField(); + final UIComboBox typecond = new UIComboBox(new String[]{"=="}); + UILabel type = new UILabel(Toolkit.i18nText("Plugin-LzljMap-Cond-typeNameLabel")); + UIButton addType = new UIButton(Toolkit.i18nText("Plugin-LzljMap-Cond-addButton")); + + final UITextField datavalue = new UITextField(); + final UIComboBox datacond = new UIComboBox(new String[]{"=="}); + UILabel data = new UILabel(Toolkit.i18nText("Plugin-LzljMap-Cond-dataTypeLabel")); + UIButton addData = new UIButton(Toolkit.i18nText("Plugin-LzljMap-Cond-addButton")); + + final UITextField value = new UITextField(); + final UIComboBox cond = new UIComboBox(new String[]{"==", ">", "<"}); + UILabel name = new UILabel(Toolkit.i18nText("Plugin-LzljMap-Cond-valueNameLabel")); + UIButton add = new UIButton(Toolkit.i18nText("Plugin-LzljMap-Cond-addButton")); + + UIButton clear = new UIButton(Toolkit.i18nText("Plugin-LzljMap-Cond-clearButton")); + + double p = TableLayout.PREFERRED; + double f = TableLayout.FILL; + Component[][] components = new Component[][]{ + new Component[]{type, typecond, typevalue, addType, null}, + new Component[]{data, datacond, datavalue, addData, null}, + new Component[]{name, cond, value, add, clear} + }; + JPanel condPane = TableLayout4VanChartHelper.createGapTableLayoutPane(components, new double[]{p, p, p, p, p}, new double[]{p, p, f, p, p}); + + Component[][] comp1 = new Component[][]{ + new Component[]{condition} + }; + JPanel areaPane = TableLayout4VanChartHelper.createGapTableLayoutPane(comp1, new double[]{p}, new double[]{f}); + + Component[][] comp = new Component[][]{ + new Component[]{condPane}, + new Component[]{areaPane} + }; + JPanel sumPane = TableLayout4VanChartHelper.createGapTableLayoutPane(comp, new double[]{p, p}, new double[]{f}); + + condition.setEnabled(false); + add.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + String srcStr = condition.getText(); + if (null != srcStr && !"".equals(srcStr)) { + srcStr += " && "; + } + String condstr = "{数值} " + cond.getSelectedItem() + " " + value.getText(); + condition.setText(srcStr + condstr); + } + }); + addData.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + String srcStr = condition.getText(); + if (null != srcStr && !"".equals(srcStr)) { + srcStr += " && "; + } + String condstr = "'{数据类型}' " + datacond.getSelectedItem() + " '" + datavalue.getText() + "'"; + condition.setText(srcStr + condstr); + } + }); + addType.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + String srcStr = condition.getText(); + if (null != srcStr && !"".equals(srcStr)) { + srcStr += " && "; + } + String condstr = "'{数据分类}' " + typecond.getSelectedItem() + " '" + typevalue.getText() + "'"; + condition.setText(srcStr + condstr); + } + }); + + clear.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + condition.setText(""); + } + }); + return TableLayout4VanChartHelper.createExpandablePaneWithTitle(Toolkit.i18nText("Plugin-LzljMap-Cond-condTaskStyleTitle"), sumPane); + } + +} diff --git a/src/com/fr/plugin/lzljgdmap/ui/LzljMapStyleBaseMapPane.java b/src/com/fr/plugin/lzljgdmap/ui/LzljMapStyleBaseMapPane.java new file mode 100644 index 0000000..7a1849a --- /dev/null +++ b/src/com/fr/plugin/lzljgdmap/ui/LzljMapStyleBaseMapPane.java @@ -0,0 +1,192 @@ +package com.fr.plugin.lzljgdmap.ui; + +import com.fr.design.gui.frpane.UINumberDragPane; +import com.fr.design.gui.frpane.UINumberDragPaneWithPercent; +import com.fr.design.gui.icheckbox.UICheckBox; +import com.fr.design.gui.ilable.UILabel; +import com.fr.design.gui.ispinner.UISpinner; +import com.fr.design.gui.itextfield.UITextField; +import com.fr.design.i18n.Toolkit; +import com.fr.design.layout.TableLayout; +import com.fr.design.layout.TableLayoutHelper; +import com.fr.design.style.color.ColorSelectBox; +import com.fr.extended.chart.ExtendedScrollPane; +import com.fr.json.JSONObject; +import com.fr.plugin.lzljgdmap.LzljMapChart; +import com.fr.van.chart.designer.TableLayout4VanChartHelper; + +import javax.swing.*; +import java.awt.*; + +/** + * @author fr.open + */ +public class LzljMapStyleBaseMapPane extends ExtendedScrollPane { + + private UISpinner mapzoom; + private UITextField centerx; + private UITextField centery; + + private UITextField mapStyle; + private UITextField mapKey; + + private UISpinner regionBorderWidth; + private ColorSelectBox regionBorderColor; + private ColorSelectBox areaBorderColor; + private ColorSelectBox countryBorderColor; + + private UISpinner circleBorderWidth; + private ColorSelectBox circleBorderColor; + private ColorSelectBox circleFillColor; + private UINumberDragPane circleOpacity; + private UICheckBox showCircleDetail; + + @Override + protected JPanel createContentPane() { + return new ContentPane(); + } + + @Override + public void populateBean(LzljMapChart chart) { + JSONObject regionConf = chart.getMapConf(); + this.mapzoom.setValue(regionConf.getDouble("mapzoom")); + this.centerx.setText(regionConf.getString("centerx")); + this.centery.setText(regionConf.getString("centery")); + + this.mapStyle.setText(regionConf.getString("mapStyle")); + this.mapKey.setText(regionConf.getString("mapKey")); + + this.regionBorderWidth.setValue(regionConf.getDouble("regionBorderWidth")); + this.regionBorderColor.setSelectObject(MapUtil.toColor(regionConf.getString("regionBorderColor"))); + this.areaBorderColor.setSelectObject(MapUtil.toColor(regionConf.getString("areaBorderColor"))); + this.countryBorderColor.setSelectObject(MapUtil.toColor(regionConf.getString("countryBorderColor"))); + + this.circleBorderWidth.setValue(regionConf.getDouble("circleBorderWidth")); + this.circleBorderColor.setSelectObject(MapUtil.toColor(regionConf.getString("circleBorderColor"))); + this.circleFillColor.setSelectObject(MapUtil.toColor(regionConf.getString("circleFillColor"))); + this.circleOpacity.populateBean(regionConf.getDouble("circleOpacity")); + this.showCircleDetail.setSelected(regionConf.getBoolean("showCircleDetail")); + } + + @Override + public void updateBean(LzljMapChart chart) { + JSONObject regionConf = JSONObject.create(); + regionConf.put("mapzoom", this.mapzoom.getValue()); + regionConf.put("centerx", this.centerx.getText()); + regionConf.put("centery", this.centery.getText()); + + regionConf.put("mapStyle", this.mapStyle.getText()); + regionConf.put("mapKey", this.mapKey.getText()); + + regionConf.put("regionBorderWidth", this.regionBorderWidth.getValue()); + regionConf.put("regionBorderColor", MapUtil.toHex(this.regionBorderColor.getSelectObject())); + regionConf.put("areaBorderColor", MapUtil.toHex(this.areaBorderColor.getSelectObject())); + regionConf.put("countryBorderColor", MapUtil.toHex(this.countryBorderColor.getSelectObject())); + + regionConf.put("circleBorderWidth", this.circleBorderWidth.getValue()); + regionConf.put("circleBorderColor", MapUtil.toHex(this.circleBorderColor.getSelectObject())); + regionConf.put("circleFillColor", MapUtil.toHex(this.circleFillColor.getSelectObject())); + regionConf.put("circleOpacity", this.circleOpacity.updateBean()); + regionConf.put("showCircleDetail", this.showCircleDetail.isSelected()); + + chart.setMapConf(regionConf); + } + + @Override + protected String title4PopupWindow() { + return Toolkit.i18nText("Plugin-LzljMap-maptitle"); + } + + private class ContentPane extends JPanel { + public ContentPane() { + initComponents(); + } + + private void initComponents() { + this.setLayout(new BorderLayout()); + + JPanel mapContentPane = createMapContentPane(); + JPanel regionContentPane = createRegionContentPane(); + JPanel circleContentPane = createCircleContentPane(); + + double p = TableLayout.PREFERRED; + double f = TableLayout.FILL; + double[] columnSize = {f}; + double[] rowSize = {p, p, p, p}; + Component[][] acomponents = new Component[][]{ + new Component[]{mapContentPane}, + new Component[]{regionContentPane}, + new Component[]{circleContentPane} + }; + + JPanel panel = TableLayoutHelper.createTableLayoutPane(acomponents,rowSize,columnSize); + this.add(panel,BorderLayout.CENTER); + this.setVisible(true); + } + } + + private JPanel createMapContentPane(){ + + mapzoom = new UISpinner(1, 18, 1, 1); + centerx = new UITextField(); + centery = new UITextField(); + + mapStyle = new UITextField(); + mapKey = new UITextField(); + + Component[][] components = new Component[][]{ + {null, null}, + new Component[]{new UILabel(Toolkit.i18nText("Plugin-LzljMap-mapzoom")), this.mapzoom}, + new Component[]{new UILabel(Toolkit.i18nText("Plugin-LzljMap-centerx")), this.centerx}, + new Component[]{new UILabel(Toolkit.i18nText("Plugin-LzljMap-centery")), this.centery}, + + new Component[]{new UILabel(Toolkit.i18nText("Plugin-LzljMap-mapStyle")), this.mapStyle}, + new Component[]{new UILabel(Toolkit.i18nText("Plugin-LzljMap-mapKey")), this.mapKey} + } ; + double p = TableLayout.PREFERRED; + double f = TableLayout.FILL; + JPanel pane = TableLayout4VanChartHelper.createGapTableLayoutPane(components, new double[]{p, p, p, p, p, p, p}, new double[]{p, f}); + + return TableLayout4VanChartHelper.createExpandablePaneWithTitle(Toolkit.i18nText("Plugin-LzljMap-BaseMapExpand"), pane); + } + + private JPanel createRegionContentPane(){ + regionBorderWidth = new UISpinner(0, 100, 1, 1); + regionBorderColor = new ColorSelectBox(100); + areaBorderColor = new ColorSelectBox(100); + countryBorderColor = new ColorSelectBox(100); + Component[][] components = new Component[][]{ + {null, null}, + new Component[]{new UILabel(Toolkit.i18nText("Plugin-LzljMap-regionBorderWidth")), this.regionBorderWidth}, + new Component[]{new UILabel(Toolkit.i18nText("Plugin-LzljMap-regionBorderColor")), this.regionBorderColor}, + new Component[]{new UILabel(Toolkit.i18nText("Plugin-LzljMap-areaBorderColor")), this.areaBorderColor}, + new Component[]{new UILabel(Toolkit.i18nText("Plugin-LzljMap-countryBorderColor")), this.countryBorderColor}, + } ; + double p = TableLayout.PREFERRED; + double f = TableLayout.FILL; + JPanel pane = TableLayout4VanChartHelper.createGapTableLayoutPane(components, new double[]{p, p, p, p, p, p}, new double[]{p, f}); + + return TableLayout4VanChartHelper.createExpandablePaneWithTitle(Toolkit.i18nText("Plugin-LzljMap-RegionExpand"), pane); + } + + private JPanel createCircleContentPane(){ + circleBorderWidth = new UISpinner(0, 100, 1, 1); + circleBorderColor = new ColorSelectBox(100); + circleFillColor = new ColorSelectBox(100); + circleOpacity = new UINumberDragPane(0, 100); + showCircleDetail = new UICheckBox(Toolkit.i18nText("Plugin-LzljMap-showCircleDetail")); + Component[][] components = new Component[][]{ + {null, null}, + new Component[]{new UILabel(Toolkit.i18nText("Plugin-LzljMap-circleBorderWidth")), this.circleBorderWidth}, + new Component[]{new UILabel(Toolkit.i18nText("Plugin-LzljMap-circleBorderColor")), this.circleBorderColor}, + new Component[]{new UILabel(Toolkit.i18nText("Plugin-LzljMap-circleFillColor")), this.circleFillColor}, + new Component[]{new UILabel(Toolkit.i18nText("Plugin-LzljMap-circleOpacity")), this.circleOpacity}, + new Component[]{null, this.showCircleDetail} + } ; + double p = TableLayout.PREFERRED; + double f = TableLayout.FILL; + JPanel pane = TableLayout4VanChartHelper.createGapTableLayoutPane(components, new double[]{p, p, p, p, p, p, p}, new double[]{p, f}); + + return TableLayout4VanChartHelper.createExpandablePaneWithTitle(Toolkit.i18nText("Plugin-LzljMap-CircleExpand"), pane); + } +} diff --git a/src/com/fr/plugin/lzljgdmap/ui/LzljMapStyleHeatMapPane.java b/src/com/fr/plugin/lzljgdmap/ui/LzljMapStyleHeatMapPane.java new file mode 100644 index 0000000..d573c9f --- /dev/null +++ b/src/com/fr/plugin/lzljgdmap/ui/LzljMapStyleHeatMapPane.java @@ -0,0 +1,159 @@ +package com.fr.plugin.lzljgdmap.ui; + +import com.fr.design.gui.frpane.UINumberDragPane; +import com.fr.design.gui.ilable.UILabel; +import com.fr.design.gui.ispinner.UISpinner; +import com.fr.design.i18n.Toolkit; +import com.fr.design.layout.TableLayout; +import com.fr.design.layout.TableLayoutHelper; +import com.fr.extended.chart.ExtendedScrollPane; +import com.fr.json.JSONObject; +import com.fr.plugin.chart.range.GradualIntervalConfig; +import com.fr.plugin.chart.range.glyph.GradualColorDist; +import com.fr.plugin.lzljgdmap.LzljMapChart; +import com.fr.stable.StringUtils; +import com.fr.van.chart.designer.TableLayout4VanChartHelper; +import com.fr.van.chart.range.component.LegendGradientBar; + +import javax.swing.*; +import javax.swing.event.ChangeEvent; +import javax.swing.event.ChangeListener; +import java.awt.*; +import java.util.ArrayList; + +/** + * @author fr.open + */ +public class LzljMapStyleHeatMapPane extends ExtendedScrollPane { + + private UISpinner radius; + private UISpinner maxValue; + private UINumberDragPane bgOpacity; + + private UINumberDragPane interval; + + private LegendGradientBar intervalLegend; + + + @Override + protected JPanel createContentPane() { + return new ContentPane(); + } + + @Override + public void populateBean(LzljMapChart chart) { + JSONObject heatConf = chart.getHeatConf(); + this.radius.setValue(heatConf.getDouble("radius")); + this.maxValue.setValue(heatConf.getDouble("maxValue")); + this.bgOpacity.populateBean(heatConf.getDouble("bgOpacity")); + this.interval.populateBean(heatConf.getDouble("interval")); + + GradualIntervalConfig intervalConfig = new GradualIntervalConfig(); + String intervalColors = heatConf.getString("intervalColors"); + String intervalPos = heatConf.getString("intervalPos"); + if (StringUtils.isNotEmpty(intervalColors) + && StringUtils.isNotEmpty(intervalPos)) { + String[] intervalArr = intervalColors.split("\\|"); + String[] intervalPosArr = intervalPos.split("\\|"); + ArrayList colorsList = new ArrayList(); + for (int i = 0; i < intervalArr.length; i++) { + colorsList.add(new GradualColorDist(Float.parseFloat(intervalPosArr[i]), MapUtil.toColor(intervalArr[i]))); + } + intervalConfig.setDivStage(intervalArr.length - 1); + intervalConfig.setGradualColorDistList(colorsList); + } + intervalLegend.populate(intervalConfig); + } + + @Override + public void updateBean(LzljMapChart chart) { + JSONObject heatConf = JSONObject.create(); + heatConf.put("radius", this.radius.getValue()); + heatConf.put("maxValue", this.maxValue.getValue()); + heatConf.put("bgOpacity", this.bgOpacity.updateBean()); + heatConf.put("interval", this.interval.updateBean()); + + GradualIntervalConfig intervalConfig = new GradualIntervalConfig(); + intervalLegend.update(intervalConfig); + ArrayList colorsList = intervalConfig.getGradualColorDistList(); + String intervalColors = ""; + String intervalPos = ""; + if (null != colorsList && colorsList.size() > 0) { + for (int i = 0; i < colorsList.size(); i++) { + if (i > 0) { + intervalColors += "|"; + intervalPos += "|"; + } + intervalColors += MapUtil.toHex(colorsList.get(i).getColor()); + intervalPos += colorsList.get(i).getPosition(); + } + } + heatConf.put("intervalColors", intervalColors); + heatConf.put("intervalPos", intervalPos); + + chart.setHeatConf(heatConf); + } + + @Override + protected String title4PopupWindow() { + return Toolkit.i18nText("Plugin-LzljMap-heattitle"); + } + + private class ContentPane extends JPanel { + public ContentPane() { + initComponents(); + } + + private void initComponents() { + this.setLayout(new BorderLayout()); + + JPanel regionContentPane = createHeatContentPane(); + + double p = TableLayout.PREFERRED; + double f = TableLayout.FILL; + double[] columnSize = {f}; + double[] rowSize = {p, p}; + Component[][] acomponents = new Component[][]{ + new Component[]{regionContentPane} + }; + + JPanel panel = TableLayoutHelper.createTableLayoutPane(acomponents, rowSize, columnSize); + this.add(panel, BorderLayout.CENTER); + this.setVisible(true); + } + } + + private JPanel createHeatContentPane() { + + radius = new UISpinner(1, 10000, 1, 30); + maxValue = new UISpinner(1, 10000000, 1, 1); + bgOpacity = new UINumberDragPane(0, 100); + interval = new UINumberDragPane(1, 6); + intervalLegend = new LegendGradientBar(); + + interval.addChangeListener(new ChangeListener() { + @Override + public void stateChanged(ChangeEvent e) { + Double num = interval.updateBean(); + intervalLegend.refreshColorSelectionBtnNum(num.intValue()); + } + }); + + double p = TableLayout.PREFERRED; + double f = TableLayout.FILL; + Component[][] components = new Component[][]{ + {null, null}, + new Component[]{new UILabel(Toolkit.i18nText("Plugin-LzljMap-heatradius")), this.radius}, + new Component[]{new UILabel(Toolkit.i18nText("Plugin-LzljMap-heatmaxValue")), this.maxValue}, + new Component[]{new UILabel(Toolkit.i18nText("Plugin-LzljMap-heatbgOpacity")), this.bgOpacity}, + new Component[]{new UILabel(Toolkit.i18nText("Plugin-LzljMap-heatinterval")), this.interval}, + new Component[]{null, this.intervalLegend} + }; + JPanel sizePane = TableLayout4VanChartHelper.createGapTableLayoutPane(components, new double[]{p, p, p, p, p, p, p}, new double[]{p, f}); + + return TableLayout4VanChartHelper.createExpandablePaneWithTitle(Toolkit.i18nText("Plugin-LzljMap-heatMapExpand"), sizePane); + + } + + +} diff --git a/src/com/fr/plugin/lzljgdmap/ui/LzljMapStyleLabelsPane.java b/src/com/fr/plugin/lzljgdmap/ui/LzljMapStyleLabelsPane.java new file mode 100644 index 0000000..f59bbbe --- /dev/null +++ b/src/com/fr/plugin/lzljgdmap/ui/LzljMapStyleLabelsPane.java @@ -0,0 +1,198 @@ +package com.fr.plugin.lzljgdmap.ui; + +import com.fr.chart.base.TextAttr; +import com.fr.design.gui.ibutton.UIButtonGroup; +import com.fr.design.gui.icheckbox.UICheckBox; +import com.fr.design.gui.ilable.UILabel; +import com.fr.design.gui.itextarea.UITextArea; +import com.fr.design.i18n.Toolkit; +import com.fr.design.layout.TableLayout; +import com.fr.design.layout.TableLayoutHelper; +import com.fr.design.mainframe.chart.gui.style.ChartTextAttrPane; +import com.fr.design.style.color.ColorSelectBox; +import com.fr.extended.chart.ExtendedScrollPane; +import com.fr.general.FRFont; +import com.fr.json.JSONObject; +import com.fr.plugin.lzljgdmap.LzljMapChart; +import com.fr.van.chart.designer.TableLayout4VanChartHelper; + +import javax.swing.*; +import javax.swing.event.ChangeEvent; +import javax.swing.event.ChangeListener; +import java.awt.*; + +/** + * @author fr.open + */ +public class LzljMapStyleLabelsPane extends ExtendedScrollPane { + + private UICheckBox showPointLabel; + private ColorSelectBox labelBgColor; + private UIButtonGroup labelType; + private UICheckBox showLayerType; + private UICheckBox showDataType; + private UICheckBox showName; + private UICheckBox showLng; + private UICheckBox showLat; + private UICheckBox showDesc; + private UITextArea labelJsPane; + private CardLayout cardLayout; + + private ChartTextAttrPane textAttrPane; + + @Override + protected JPanel createContentPane() { + return new ContentPane(); + } + + @Override + public void populateBean(LzljMapChart chart) { + JSONObject labelConf = chart.getLabelConf(); + this.showPointLabel.setSelected(labelConf.getBoolean("showPointLabel")); + this.labelBgColor.setSelectObject(MapUtil.toColor(labelConf.getString("labelBgColor"))); + this.labelType.setSelectedItem(labelConf.getInt("labelType")); + this.showLayerType.setSelected(labelConf.getBoolean("showLayerType")); + this.showDataType.setSelected(labelConf.getBoolean("showDataType")); + this.showName.setSelected(labelConf.getBoolean("showName")); + this.showLng.setSelected(labelConf.getBoolean("showLng")); + this.showLat.setSelected(labelConf.getBoolean("showLat")); + this.showDesc.setSelected(labelConf.getBoolean("showDesc")); + labelJsPane.setText(labelConf.getString("labelJsPane")); + FRFont labelFont = FRFont.getInstance(labelConf.getString("labelfamily"), + labelConf.getInt("labelstyle"), + labelConf.getInt("labelsize"), + MapUtil.toColor(labelConf.getString("labelcolor"))); + this.textAttrPane.populate(labelFont); + } + + @Override + public void updateBean(LzljMapChart chart) { + JSONObject labelConf = JSONObject.create(); + labelConf.put("showPointLabel", this.showPointLabel.isSelected()); + labelConf.put("labelBgColor", MapUtil.toHex(this.labelBgColor.getSelectObject())); + labelConf.put("labelType", this.labelType.getSelectedItem()); + labelConf.put("showLayerType", this.showLayerType.isSelected()); + labelConf.put("showDataType", this.showDataType.isSelected()); + labelConf.put("showName", this.showName.isSelected()); + labelConf.put("showLng", this.showLng.isSelected()); + labelConf.put("showLat", this.showLat.isSelected()); + labelConf.put("showDesc", this.showDesc.isSelected()); + labelConf.put("labelJsPane", this.labelJsPane.getText()); + + TextAttr labelAttr = this.textAttrPane.update(); + labelConf.put("labelsize", labelAttr.getFRFont().getSize()); + labelConf.put("labelstyle", labelAttr.getFRFont().getStyle()); + labelConf.put("labelfamily", labelAttr.getFRFont().getFamily()); + labelConf.put("labelcolor", MapUtil.toHex(labelAttr.getFRFont().getForeground())); + + chart.setLabelConf(labelConf); + } + + @Override + protected String title4PopupWindow() { + return Toolkit.i18nText("Plugin-LzljMap-labelstitle"); + } + + private class ContentPane extends JPanel { + public ContentPane() { + initComponents(); + } + + private void initComponents() { + this.setLayout(new BorderLayout()); + + JPanel toolContentPane = createLabelContentPane(); + JPanel textStylePane = createLabelTextStylePane(); + + double p = TableLayout.PREFERRED; + double f = TableLayout.FILL; + double[] columnSize = {f}; + double[] rowSize = {p, p, p, p}; + Component[][] acomponents = new Component[][]{ + new Component[]{showPointLabel}, + new Component[]{toolContentPane}, + new Component[]{textStylePane} + }; + + JPanel panel = TableLayoutHelper.createTableLayoutPane(acomponents, rowSize, columnSize); + this.add(panel, BorderLayout.CENTER); + this.setVisible(true); + } + } + + private JPanel createLabelContentPane() { + + showPointLabel = new UICheckBox(Toolkit.i18nText("Plugin-LzljMap-showPointLabel")); + labelBgColor = new ColorSelectBox(100); + labelType = new UIButtonGroup(new String[]{ + Toolkit.i18nText("Plugin-LzljMap-labelTypeCheck"), + Toolkit.i18nText("Plugin-LzljMap-labelTypeJS") + }, + new Integer[]{1, 2} + ); + labelType.setSelectedItem(1); + + showLayerType = new UICheckBox(Toolkit.i18nText("Plugin-LzljMap-showLayerType")); + showDataType = new UICheckBox(Toolkit.i18nText("Plugin-LzljMap-showDataType")); + showName = new UICheckBox(Toolkit.i18nText("Plugin-LzljMap-showName")); + showLng = new UICheckBox(Toolkit.i18nText("Plugin-LzljMap-showLng")); + showLat = new UICheckBox(Toolkit.i18nText("Plugin-LzljMap-showLat")); + showDesc = new UICheckBox(Toolkit.i18nText("Plugin-LzljMap-showDesc")); + + labelJsPane = new UITextArea(6, 6); + + double p = TableLayout.PREFERRED; + double f = TableLayout.FILL; + Component[][] compLabel = new Component[][]{ + {null, null}, + new Component[]{new UILabel(Toolkit.i18nText("Plugin-LzljMap-labelBgColor")), this.labelBgColor}, + new Component[]{new UILabel(Toolkit.i18nText("Plugin-LzljMap-labelType")), this.labelType} + }; + JPanel labelTypePane = TableLayout4VanChartHelper.createGapTableLayoutPane(compLabel, new double[]{p, p, p, p}, new double[]{p, f}); + + Component[][] compCheck = new Component[][]{ + new Component[]{showLayerType, showDataType}, + new Component[]{showName, showLng}, + new Component[]{showLat, showDesc} + }; + final JPanel checkPane = TableLayout4VanChartHelper.createGapTableLayoutPane(compCheck, new double[]{p, p, p, p}, new double[]{p, f}); + + final JPanel cardPane = new JPanel(this.cardLayout = new CardLayout()){ + @Override + public Dimension getPreferredSize() { + if (null != labelType.getSelectedItem() && labelType.getSelectedItem() == 2) { + return labelJsPane.getPreferredSize(); + } else { + return checkPane.getPreferredSize(); + } + } + }; + cardPane.add(checkPane, "check"); + cardPane.add(labelJsPane, "js"); + this.cardLayout.show(cardPane, "check"); + labelType.addChangeListener(new ChangeListener() { + @Override + public void stateChanged(ChangeEvent var1x) { + if (labelType.getSelectedItem() == 1) { + cardLayout.show(cardPane, "check"); + } else { + cardLayout.show(cardPane, "js"); + } + } + }); + + Component[][] comp = new Component[][]{ + new Component[]{labelTypePane}, + new Component[]{cardPane} + }; + JPanel pane = TableLayout4VanChartHelper.createGapTableLayoutPane(comp, new double[]{p, p, p}, new double[]{f}); + + return TableLayout4VanChartHelper.createExpandablePaneWithTitle(Toolkit.i18nText("Plugin-LzljMap-labelAlignExpand"), pane); + } + + private JPanel createLabelTextStylePane() { + this.textAttrPane = new ChartTextAttrPane(); + return TableLayout4VanChartHelper.createExpandablePaneWithTitle(Toolkit.i18nText("Plugin-LzljMap-LabelsTextStyle"), this.textAttrPane); + } + +} diff --git a/src/com/fr/plugin/lzljgdmap/ui/LzljMapStyleOtherPane.java b/src/com/fr/plugin/lzljgdmap/ui/LzljMapStyleOtherPane.java new file mode 100644 index 0000000..fc4883d --- /dev/null +++ b/src/com/fr/plugin/lzljgdmap/ui/LzljMapStyleOtherPane.java @@ -0,0 +1,84 @@ +package com.fr.plugin.lzljgdmap.ui; + +import com.fr.design.i18n.Toolkit; +import com.fr.design.layout.TableLayout; +import com.fr.design.layout.TableLayoutHelper; +import com.fr.extended.chart.ExtendedScrollPane; +import com.fr.plugin.lzljgdmap.LzljMapChart; +import com.fr.van.chart.designer.TableLayout4VanChartHelper; + +import javax.swing.*; +import java.awt.*; + +public class LzljMapStyleOtherPane extends ExtendedScrollPane { + + private LzljMapHyperLink hyperLink; + private LzljMapPointCondListPane pointCondListPane; + + @Override + protected JPanel createContentPane() { + return new ContentPane(); + } + + @Override + public void populateBean(LzljMapChart chart) { + hyperLink.populateBean(chart); + pointCondListPane.populateStyle(chart); + } + + @Override + public void updateBean(LzljMapChart chart) { + hyperLink.updateBean(chart); + pointCondListPane.updateStyle(chart); + } + + @Override + protected String title4PopupWindow() { + return Toolkit.i18nText("Plugin-LzljMap-otherstitle"); + } + + private class ContentPane extends JPanel { + public ContentPane() { + initComponents(); + } + + private void initComponents() { + this.setLayout(new BorderLayout()); + + JPanel linkPane = createLinkPane(); + JPanel pointCondPane = createPointStyleCondPane(); + + double p = TableLayout.PREFERRED; + double f = TableLayout.FILL; + double[] columnSize = {f}; + double[] rowSize = {p, p, p}; + Component[][] acomponents = new Component[][]{ + new Component[]{linkPane}, + new Component[]{pointCondPane} + }; + JPanel panel = TableLayoutHelper.createTableLayoutPane(acomponents,rowSize,columnSize); + + this.add(panel,BorderLayout.CENTER); + this.setVisible(true); + } + } + + private JPanel createLinkPane() { + this.hyperLink = new LzljMapHyperLink(); + + Component[][] components = new Component[][]{ + new Component[]{hyperLink} + }; + double p = TableLayout.PREFERRED; + double[] columnSize = {TableLayout.FILL}; + double[] rowSize = {p, p}; + JPanel panel = TableLayout4VanChartHelper.createGapTableLayoutPane(components, rowSize, columnSize); + return TableLayout4VanChartHelper.createExpandablePaneWithTitle(Toolkit.i18nText("Plugin-LzljMap-LinkExpand"), panel); + } + + private JPanel createPointStyleCondPane() { + this.pointCondListPane = new LzljMapPointCondListPane(); + return TableLayout4VanChartHelper.createExpandablePaneWithTitle(Toolkit.i18nText("Plugin-LzljMap-pointStyleCondExpand"), this.pointCondListPane); + } + +} diff --git a/src/com/fr/plugin/lzljgdmap/ui/LzljMapStylePane.java b/src/com/fr/plugin/lzljgdmap/ui/LzljMapStylePane.java new file mode 100644 index 0000000..0ecaf83 --- /dev/null +++ b/src/com/fr/plugin/lzljgdmap/ui/LzljMapStylePane.java @@ -0,0 +1,39 @@ +package com.fr.plugin.lzljgdmap.ui; + +import com.fr.design.gui.frpane.AttributeChangeListener; +import com.fr.extended.chart.AbstractExtendedStylePane; +import com.fr.extended.chart.ExtendedScrollPane; +import com.fr.plugin.lzljgdmap.LzljMapChart; + +import java.util.ArrayList; +import java.util.List; + +/** + * @author fr.open + * @date 2022/8/19 + */ +public class LzljMapStylePane extends AbstractExtendedStylePane { + + private AttributeChangeListener attributeChangeListener; + + public LzljMapStylePane(){ + super(); + } + public LzljMapStylePane(AttributeChangeListener attributeChangeListener){ + super(attributeChangeListener); + } + + @Override + protected List> initPaneList() { + List> list = new ArrayList>(); + list.add(new LzljMapStyleTitlePane()); + list.add(new LzljMapStyleBaseMapPane()); + list.add(new LzljMapStylePointMapPane()); + list.add(new LzljMapStyleHeatMapPane()); + list.add(new LzljMapStyleToolsPane()); + list.add(new LzljMapStyleLabelsPane()); + list.add(new LzljMapStyleTipsPane()); + list.add(new LzljMapStyleOtherPane()); + return list; + } +} diff --git a/src/com/fr/plugin/lzljgdmap/ui/LzljMapStylePointMapPane.java b/src/com/fr/plugin/lzljgdmap/ui/LzljMapStylePointMapPane.java new file mode 100644 index 0000000..a415a18 --- /dev/null +++ b/src/com/fr/plugin/lzljgdmap/ui/LzljMapStylePointMapPane.java @@ -0,0 +1,167 @@ +package com.fr.plugin.lzljgdmap.ui; + +import com.fr.design.gui.frpane.UINumberDragPane; +import com.fr.design.gui.icheckbox.UICheckBox; +import com.fr.design.gui.ilable.UILabel; +import com.fr.design.gui.ispinner.UISpinner; +import com.fr.design.i18n.Toolkit; +import com.fr.design.layout.TableLayout; +import com.fr.design.layout.TableLayoutHelper; +import com.fr.design.style.color.ColorSelectBox; +import com.fr.extended.chart.ExtendedScrollPane; +import com.fr.json.JSONObject; +import com.fr.plugin.lzljgdmap.LzljMapChart; +import com.fr.van.chart.designer.TableLayout4VanChartHelper; + +import javax.swing.*; +import java.awt.*; + +/** + * @author fr.open + */ +public class LzljMapStylePointMapPane extends ExtendedScrollPane { + + private UISpinner pointSize; + private ImageChooserPane pointPane; + + //private UICheckBox showCluster; + private UISpinner clusterMaxZoom; + private UISpinner clusterPointSize; + private ColorSelectBox clusterBorderColor; + private ColorSelectBox clusterFillColor; + private ColorSelectBox clusterTextColor; + private UINumberDragPane clusterBgOpacity; + + @Override + protected JPanel createContentPane() { + return new ContentPane(); + } + + @Override + public void populateBean(LzljMapChart chart) { + JSONObject pointConf = chart.getPointConf(); + this.pointSize.setValue(pointConf.getDouble("pointSize")); + ImageEntity imgEnt = new ImageEntity(); + imgEnt.setImagestr(pointConf.getString("pointimg")); + imgEnt.setImagetype(pointConf.getString("pointimgtype")); + imgEnt.setWidth(pointConf.getInt("pointimgw")); + imgEnt.setHeight(pointConf.getInt("pointimgh")); + this.pointPane.populateBean(imgEnt); + + this.clusterMaxZoom.setValue(pointConf.getDouble("clusterMaxZoom")); + + this.clusterPointSize.setValue(pointConf.getDouble("clusterPointSize")); + this.clusterBorderColor.setSelectObject(MapUtil.toColor(pointConf.getString("clusterBorderColor"))); + this.clusterFillColor.setSelectObject(MapUtil.toColor(pointConf.getString("clusterFillColor"))); + this.clusterTextColor.setSelectObject(MapUtil.toColor(pointConf.getString("clusterTextColor"))); + this.clusterBgOpacity.populateBean(pointConf.getDouble("clusterBgOpacity")); + } + + @Override + public void updateBean(LzljMapChart chart) { + JSONObject pointConf = JSONObject.create(); + pointConf.put("pointSize", this.pointSize.getValue()); + ImageEntity imgEnt = this.pointPane.updateBean(); + if (null != imgEnt) { + pointConf.put("pointimg", imgEnt.getImagestr()); + pointConf.put("pointimgtype", imgEnt.getImagetype()); + pointConf.put("pointimgw", imgEnt.getWidth()); + pointConf.put("pointimgh", imgEnt.getHeight()); + } + + pointConf.put("clusterMaxZoom", this.clusterMaxZoom.getValue()); + pointConf.put("clusterPointSize", this.clusterPointSize.getValue()); + pointConf.put("clusterBorderColor", MapUtil.toHex(this.clusterBorderColor.getSelectObject())); + pointConf.put("clusterFillColor", MapUtil.toHex(this.clusterFillColor.getSelectObject())); + pointConf.put("clusterTextColor", MapUtil.toHex(this.clusterTextColor.getSelectObject())); + pointConf.put("clusterBgOpacity", this.clusterBgOpacity.updateBean()); + + chart.setPointConf(pointConf); + } + + @Override + protected String title4PopupWindow() { + return Toolkit.i18nText("Plugin-LzljMap-pointtitle"); + } + + private class ContentPane extends JPanel { + public ContentPane() { + initComponents(); + } + + private void initComponents() { + this.setLayout(new BorderLayout()); + + JPanel pointContentPane = createPointContentPane(); + JPanel clusterPointPane = createClusterPointContentPane(); + + double p = TableLayout.PREFERRED; + double f = TableLayout.FILL; + double[] columnSize = {f}; + double[] rowSize = {p, p, p}; + Component[][] acomponents = new Component[][]{ + new Component[]{pointContentPane}, + new Component[]{clusterPointPane} + }; + + JPanel panel = TableLayoutHelper.createTableLayoutPane(acomponents, rowSize, columnSize); + this.add(panel, BorderLayout.CENTER); + this.setVisible(true); + } + } + + private JPanel createPointContentPane() { + + pointSize = new UISpinner(1, 200, 1, 32); + pointPane = new ImageChooserPane(); + + double p = TableLayout.PREFERRED; + double f = TableLayout.FILL; + Component[][] components = new Component[][]{ + {null, null}, + new Component[]{new UILabel(Toolkit.i18nText("Plugin-LzljMap-pointSize")), this.pointSize} + }; + JPanel sizePane = TableLayout4VanChartHelper.createGapTableLayoutPane(components, new double[]{p, p, p}, new double[]{p, f}); + + Component[][] comp1 = new Component[][]{ + new Component[]{sizePane}, + new Component[]{pointPane} + }; + JPanel pane = TableLayout4VanChartHelper.createGapTableLayoutPane(comp1, new double[]{p, p, p}, new double[]{f}); + + return TableLayout4VanChartHelper.createExpandablePaneWithTitle(Toolkit.i18nText("Plugin-LzljMap-pointMapExpand"), pane); + + } + + private JPanel createClusterPointContentPane() { + + clusterMaxZoom = new UISpinner(1, 30, 1, 18); + clusterPointSize = new UISpinner(1, 200, 1, 64); + clusterBorderColor = new ColorSelectBox(100); + clusterFillColor = new ColorSelectBox(100); + clusterTextColor = new ColorSelectBox(100); + clusterBgOpacity = new UINumberDragPane(0, 100); + + double p = TableLayout.PREFERRED; + double f = TableLayout.FILL; + Component[][] components = new Component[][]{ + {null, null}, + new Component[]{new UILabel(Toolkit.i18nText("Plugin-LzljMap-clusterMaxZoom")), this.clusterMaxZoom}, + new Component[]{new UILabel(Toolkit.i18nText("Plugin-LzljMap-pointSize")), this.clusterPointSize}, + new Component[]{new UILabel(Toolkit.i18nText("Plugin-LzljMap-clusterBorderColor")), this.clusterBorderColor}, + new Component[]{new UILabel(Toolkit.i18nText("Plugin-LzljMap-clusterFillColor")), this.clusterFillColor}, + new Component[]{new UILabel(Toolkit.i18nText("Plugin-LzljMap-clusterTextColor")), this.clusterTextColor}, + new Component[]{new UILabel(Toolkit.i18nText("Plugin-LzljMap-clusterBgOpacity")), this.clusterBgOpacity} + }; + JPanel sizePane = TableLayout4VanChartHelper.createGapTableLayoutPane(components, new double[]{p, p, p, p, p, p, p, p}, new double[]{p, f}); + + Component[][] comp1 = new Component[][]{ + new Component[]{sizePane} + }; + JPanel pane = TableLayout4VanChartHelper.createGapTableLayoutPane(comp1, new double[]{p, p, p}, new double[]{f}); + + return TableLayout4VanChartHelper.createExpandablePaneWithTitle(Toolkit.i18nText("Plugin-LzljMap-clusterPointMapExpand"), pane); + + } + +} diff --git a/src/com/fr/plugin/lzljgdmap/ui/LzljMapStyleTipsPane.java b/src/com/fr/plugin/lzljgdmap/ui/LzljMapStyleTipsPane.java new file mode 100644 index 0000000..b98a130 --- /dev/null +++ b/src/com/fr/plugin/lzljgdmap/ui/LzljMapStyleTipsPane.java @@ -0,0 +1,163 @@ +package com.fr.plugin.lzljgdmap.ui; + +import com.fr.chart.base.TextAttr; +import com.fr.design.gui.frpane.UINumberDragPane; +import com.fr.design.gui.icheckbox.UICheckBox; +import com.fr.design.gui.ilable.UILabel; +import com.fr.design.i18n.Toolkit; +import com.fr.design.layout.TableLayout; +import com.fr.design.layout.TableLayoutHelper; +import com.fr.design.mainframe.chart.gui.style.ChartTextAttrPane; +import com.fr.design.style.color.ColorSelectBox; +import com.fr.extended.chart.ExtendedScrollPane; +import com.fr.general.FRFont; +import com.fr.json.JSONObject; +import com.fr.plugin.lzljgdmap.LzljMapChart; +import com.fr.van.chart.designer.TableLayout4VanChartHelper; + +import javax.swing.*; +import java.awt.*; + +/** + * @author fr.open + */ +public class LzljMapStyleTipsPane extends ExtendedScrollPane { + + private UICheckBox showPointTips; + + private ColorSelectBox tipBgColor; + private UINumberDragPane tipBgOpacity; + + private UICheckBox showLayerType; + private UICheckBox showDataType; + private UICheckBox showName; + private UICheckBox showLng; + private UICheckBox showLat; + private UICheckBox showDesc; + + private ChartTextAttrPane textAttrPane; + + @Override + protected JPanel createContentPane() { + return new ContentPane(); + } + + @Override + public void populateBean(LzljMapChart chart) { + JSONObject tipsConf = chart.getTipsConf(); + this.showPointTips.setSelected(tipsConf.getBoolean("showPointTips")); + this.tipBgColor.setSelectObject(MapUtil.toColor(tipsConf.getString("tipBgColor"))); + this.tipBgOpacity.populateBean(tipsConf.getDouble("tipBgOpacity")); + + this.showLayerType.setSelected(tipsConf.getBoolean("showLayerType")); + this.showDataType.setSelected(tipsConf.getBoolean("showDataType")); + this.showName.setSelected(tipsConf.getBoolean("showName")); + this.showLng.setSelected(tipsConf.getBoolean("showLng")); + this.showLat.setSelected(tipsConf.getBoolean("showLat")); + this.showDesc.setSelected(tipsConf.getBoolean("showDesc")); + + FRFont tipFont = FRFont.getInstance(tipsConf.getString("tipfamily"), + tipsConf.getInt("tipstyle"), + tipsConf.getInt("tipsize"), + MapUtil.toColor(tipsConf.getString("tipcolor"))); + this.textAttrPane.populate(tipFont); + } + + @Override + public void updateBean(LzljMapChart chart) { + JSONObject tipsConf = JSONObject.create(); + tipsConf.put("showPointTips", this.showPointTips.isSelected()); + tipsConf.put("tipBgColor", MapUtil.toHex(this.tipBgColor.getSelectObject())); + tipsConf.put("tipBgOpacity", this.tipBgOpacity.updateBean()); + tipsConf.put("showLayerType", this.showLayerType.isSelected()); + tipsConf.put("showDataType", this.showDataType.isSelected()); + tipsConf.put("showName", this.showName.isSelected()); + tipsConf.put("showLng", this.showLng.isSelected()); + tipsConf.put("showLat", this.showLat.isSelected()); + tipsConf.put("showDesc", this.showDesc.isSelected()); + + TextAttr labelAttr = this.textAttrPane.update(); + tipsConf.put("tipsize", labelAttr.getFRFont().getSize()); + tipsConf.put("tipstyle", labelAttr.getFRFont().getStyle()); + tipsConf.put("tipfamily", labelAttr.getFRFont().getFamily()); + tipsConf.put("tipcolor", MapUtil.toHex(labelAttr.getFRFont().getForeground())); + + chart.setTipsConf(tipsConf); + } + + @Override + protected String title4PopupWindow() { + return Toolkit.i18nText("Plugin-LzljMap-tipstitle"); + } + + private class ContentPane extends JPanel { + public ContentPane() { + initComponents(); + } + + private void initComponents() { + this.setLayout(new BorderLayout()); + + JPanel contentPane = createTipsContentPane(); + JPanel textStylePane = createTipsTextStylePane(); + + double p = TableLayout.PREFERRED; + double f = TableLayout.FILL; + double[] columnSize = {f}; + double[] rowSize = {p, p, p, p}; + Component[][] comps = new Component[][]{ + new Component[]{showPointTips}, + new Component[]{contentPane}, + new Component[]{textStylePane} + }; + + JPanel panel = TableLayoutHelper.createTableLayoutPane(comps, rowSize, columnSize); + this.add(panel, BorderLayout.CENTER); + this.setVisible(true); + } + } + + private JPanel createTipsContentPane() { + + showPointTips = new UICheckBox(Toolkit.i18nText("Plugin-LzljMap-showPointTips")); + tipBgColor = new ColorSelectBox(100); + tipBgOpacity = new UINumberDragPane(0, 100); + + showLayerType = new UICheckBox(Toolkit.i18nText("Plugin-LzljMap-showLayerType")); + showDataType = new UICheckBox(Toolkit.i18nText("Plugin-LzljMap-showDataType")); + showName = new UICheckBox(Toolkit.i18nText("Plugin-LzljMap-showName")); + showLng = new UICheckBox(Toolkit.i18nText("Plugin-LzljMap-showLng")); + showLat = new UICheckBox(Toolkit.i18nText("Plugin-LzljMap-showLat")); + showDesc = new UICheckBox(Toolkit.i18nText("Plugin-LzljMap-showDesc")); + + double p = TableLayout.PREFERRED; + double f = TableLayout.FILL; + Component[][] compLabel = new Component[][]{ + {null, null}, + new Component[]{new UILabel(Toolkit.i18nText("Plugin-LzljMap-tipBgColor")), this.tipBgColor}, + new Component[]{new UILabel(Toolkit.i18nText("Plugin-LzljMap-tipBgOpacity")), this.tipBgOpacity} + }; + JPanel bgPane = TableLayout4VanChartHelper.createGapTableLayoutPane(compLabel, new double[]{p, p, p}, new double[]{p, f}); + + Component[][] compCheck = new Component[][]{ + new Component[]{showLayerType, showDataType}, + new Component[]{showName, showLng}, + new Component[]{showLat, showDesc} + }; + JPanel checkPane = TableLayout4VanChartHelper.createGapTableLayoutPane(compCheck, new double[]{p, p, p, p}, new double[]{p, f}); + + Component[][] comp = new Component[][]{ + new Component[]{bgPane}, + new Component[]{checkPane} + }; + JPanel pane = TableLayout4VanChartHelper.createGapTableLayoutPane(comp, new double[]{p, p, p}, new double[]{f}); + + return TableLayout4VanChartHelper.createExpandablePaneWithTitle(Toolkit.i18nText("Plugin-LzljMap-tipsAlignExpand"), pane); + } + + private JPanel createTipsTextStylePane() { + this.textAttrPane = new ChartTextAttrPane(); + return TableLayout4VanChartHelper.createExpandablePaneWithTitle(Toolkit.i18nText("Plugin-LzljMap-tipsTextStyle"), this.textAttrPane); + } + +} diff --git a/src/com/fr/plugin/lzljgdmap/ui/LzljMapStyleTitlePane.java b/src/com/fr/plugin/lzljgdmap/ui/LzljMapStyleTitlePane.java new file mode 100644 index 0000000..ec5776a --- /dev/null +++ b/src/com/fr/plugin/lzljgdmap/ui/LzljMapStyleTitlePane.java @@ -0,0 +1,142 @@ +package com.fr.plugin.lzljgdmap.ui; + +import com.fr.base.BaseUtils; +import com.fr.chart.base.TextAttr; +import com.fr.design.formula.TinyFormulaPane; +import com.fr.design.gui.frpane.UINumberDragPane; +import com.fr.design.gui.ibutton.UIButtonGroup; +import com.fr.design.gui.icheckbox.UICheckBox; +import com.fr.design.gui.ilable.UILabel; +import com.fr.design.i18n.Toolkit; +import com.fr.design.layout.TableLayout; +import com.fr.design.layout.TableLayoutHelper; +import com.fr.design.mainframe.chart.PaneTitleConstants; +import com.fr.design.mainframe.chart.gui.style.ChartTextAttrPane; +import com.fr.design.style.color.ColorSelectBox; +import com.fr.extended.chart.ExtendedScrollPane; +import com.fr.general.FRFont; +import com.fr.json.JSONObject; +import com.fr.plugin.lzljgdmap.LzljMapChart; +import com.fr.van.chart.designer.TableLayout4VanChartHelper; + +import javax.swing.*; +import java.awt.*; + +public class LzljMapStyleTitlePane extends ExtendedScrollPane { + + private UICheckBox isTitleVisable; + private ColorSelectBox titleBgColor; + private UINumberDragPane titleBgOpacity; + private TinyFormulaPane titleName; + private UIButtonGroup titleAlignment; + private ChartTextAttrPane textAttrPane; + + + @Override + protected JPanel createContentPane() { + return new ContentPane(); + } + + @Override + public void populateBean(LzljMapChart chart) { + JSONObject titleConf = chart.getTitleConf(); + this.isTitleVisable.setSelected(titleConf.getBoolean("titlevisiable")); + this.titleBgColor.setSelectObject(MapUtil.toColor(titleConf.getString("titlebgcolor"))); + this.titleBgOpacity.populateBean(titleConf.getDouble("titleBgOpacity")); + this.titleName.populateBean(titleConf.getString("titlename")); + this.titleAlignment.setSelectedItem(titleConf.getInt("titleposition")); + + FRFont titleFont = FRFont.getInstance(titleConf.getString("titlefamily"), + titleConf.getInt("titlestyle"), + titleConf.getInt("titlesize"), + MapUtil.toColor(titleConf.getString("titlecolor"))); + this.textAttrPane.populate(titleFont); + + } + + @Override + public void updateBean(LzljMapChart chart) { + JSONObject titleConf = JSONObject.create(); + titleConf.put("titlevisiable", this.isTitleVisable.isSelected()); + titleConf.put("titlebgcolor", MapUtil.toHex(this.titleBgColor.getSelectObject())); + titleConf.put("titleBgOpacity", this.titleBgOpacity.updateBean()); + titleConf.put("titlename", this.titleName.updateBean()); + titleConf.put("titleposition", titleAlignment.getSelectedItem()); + + TextAttr titleAttr = this.textAttrPane.update(); + titleConf.put("titlesize", titleAttr.getFRFont().getSize()); + titleConf.put("titlestyle", titleAttr.getFRFont().getStyle()); + titleConf.put("titlefamily", titleAttr.getFRFont().getFamily()); + titleConf.put("titlecolor", MapUtil.toHex(titleAttr.getFRFont().getForeground())); + + + chart.setTitleConf(titleConf); + } + + @Override + protected String title4PopupWindow() { + return PaneTitleConstants.CHART_STYLE_TITLE_TITLE; + } + + private class ContentPane extends JPanel { + public ContentPane() { + initComponents(); + } + + private void initComponents() { + this.setLayout(new BorderLayout()); + + // 内容 + JPanel titleContentPane = createTitleContentPane(); + // 样式 + JPanel stylePane = createTitleStylePane(); + + double p = TableLayout.PREFERRED; + double f = TableLayout.FILL; + double[] columnSize = {f}; + double[] rowSize = {p, p, p, p}; + Component[][] acomponents = new Component[][]{ + new Component[]{isTitleVisable}, + new Component[]{titleContentPane}, + new Component[]{stylePane} + } ; + + JPanel panel = TableLayoutHelper.createTableLayoutPane(acomponents,rowSize,columnSize); + + this.add(panel,BorderLayout.CENTER); + + this.setVisible(true); + + } + + } + + private JPanel createTitleContentPane(){ + // 内容 + this.isTitleVisable = new UICheckBox(Toolkit.i18nText("Plugin-LzljMap-isVisiableTitle")); + this.titleBgColor = new ColorSelectBox(100); + this.titleBgOpacity = new UINumberDragPane(0, 100); + this.titleName = new TinyFormulaPane(); + + // 位置 + Icon[] titlePositonIcons = new Icon[]{BaseUtils.readIcon("/com/fr/design/images/m_format/cellstyle/h_left_normal.png"), BaseUtils.readIcon("/com/fr/design/images/m_format/cellstyle/h_center_normal.png"), BaseUtils.readIcon("/com/fr/design/images/m_format/cellstyle/h_right_normal.png")}; + Integer[] titlePositionVal = new Integer[]{2, 0, 4}; + this.titleAlignment = new UIButtonGroup(titlePositonIcons, titlePositionVal); + + Component[][] components = new Component[][]{ + {null, null}, + new Component[]{new UILabel(Toolkit.i18nText("Plugin-LzljMap-titleBgColor")), this.titleBgColor}, + new Component[]{new UILabel(Toolkit.i18nText("Plugin-LzljMap-titleBgOpacity")), this.titleBgOpacity}, + new Component[]{new UILabel(Toolkit.i18nText("Plugin-LzljMap-TitleText")), this.titleName}, + new Component[]{new UILabel(Toolkit.i18nText("Plugin-LzljMap-TitlePosition"), 2), this.titleAlignment} + } ; + return TableLayout4VanChartHelper.createExpandablePaneWithTitle(Toolkit.i18nText("Plugin-LzljMap-TitleExpand"), components); + } + + private JPanel createTitleStylePane() { + this.textAttrPane = new ChartTextAttrPane(); + return TableLayout4VanChartHelper.createExpandablePaneWithTitle(Toolkit.i18nText("Plugin-LzljMap-TitleStyle"), this.textAttrPane); + } + + +} diff --git a/src/com/fr/plugin/lzljgdmap/ui/LzljMapStyleToolsPane.java b/src/com/fr/plugin/lzljgdmap/ui/LzljMapStyleToolsPane.java new file mode 100644 index 0000000..a4ced4c --- /dev/null +++ b/src/com/fr/plugin/lzljgdmap/ui/LzljMapStyleToolsPane.java @@ -0,0 +1,239 @@ +package com.fr.plugin.lzljgdmap.ui; + +import com.fr.base.BaseUtils; +import com.fr.chart.base.TextAttr; +import com.fr.design.gui.frpane.UINumberDragPane; +import com.fr.design.gui.frpane.UINumberDragPaneWithPercent; +import com.fr.design.gui.ibutton.UIButtonGroup; +import com.fr.design.gui.icheckbox.UICheckBox; +import com.fr.design.gui.ilable.UILabel; +import com.fr.design.i18n.Toolkit; +import com.fr.design.layout.TableLayout; +import com.fr.design.layout.TableLayoutHelper; +import com.fr.design.mainframe.chart.gui.style.ChartTextAttrPane; +import com.fr.design.style.color.ColorSelectBox; +import com.fr.extended.chart.ExtendedScrollPane; +import com.fr.general.FRFont; +import com.fr.json.JSONObject; +import com.fr.plugin.lzljgdmap.LzljMapChart; +import com.fr.van.chart.designer.TableLayout4VanChartHelper; + +import javax.swing.*; +import java.awt.*; + +/** + * @author fr.open + */ +public class LzljMapStyleToolsPane extends ExtendedScrollPane { + + private ColorSelectBox toolBgColor; + private ColorSelectBox toolBtnColor; + private UINumberDragPane toolBgOpacity; + private ChartTextAttrPane textAttrPane; + + private ColorSelectBox detailBgColor; + private ColorSelectBox detailTitleBgColor; + private UINumberDragPane detailBgOpacity; + private UICheckBox showRegion; + private UICheckBox showArea; + private UICheckBox showCounty; + private UICheckBox showName; + private UICheckBox showLayerType; + private UICheckBox showDataType; + private UICheckBox showLng; + private UICheckBox showLat; + private UICheckBox showVal; + private UICheckBox showDesc; + private ChartTextAttrPane detailTextAttrPane; + + @Override + protected JPanel createContentPane() { + return new ContentPane(); + } + + @Override + public void populateBean(LzljMapChart chart) { + JSONObject toolConf = chart.getToolConf(); + this.toolBgColor.setSelectObject(MapUtil.toColor(toolConf.getString("toolBgColor"))); + this.toolBtnColor.setSelectObject(MapUtil.toColor(toolConf.getString("toolBtnColor"))); + this.toolBgOpacity.populateBean(toolConf.getDouble("toolBgOpacity")); + FRFont toolFont = FRFont.getInstance(toolConf.getString("toolfamily"), + toolConf.getInt("toolstyle"), + toolConf.getInt("toolsize"), + MapUtil.toColor(toolConf.getString("toolcolor"))); + this.textAttrPane.populate(toolFont); + + this.detailBgColor.setSelectObject(MapUtil.toColor(toolConf.getString("detailBgColor"))); + this.detailTitleBgColor.setSelectObject(MapUtil.toColor(toolConf.getString("detailTitleBgColor"))); + this.detailBgOpacity.populateBean(toolConf.getDouble("detailBgOpacity")); + this.showRegion.setSelected(toolConf.getBoolean("showRegion")); + this.showArea.setSelected(toolConf.getBoolean("showArea")); + this.showCounty.setSelected(toolConf.getBoolean("showCounty")); + this.showName.setSelected(toolConf.getBoolean("showName")); + this.showLayerType.setSelected(toolConf.getBoolean("showLayerType")); + this.showDataType.setSelected(toolConf.getBoolean("showDataType")); + this.showLng.setSelected(toolConf.getBoolean("showLng")); + this.showLat.setSelected(toolConf.getBoolean("showLat")); + this.showVal.setSelected(toolConf.getBoolean("showVal")); + this.showDesc.setSelected(toolConf.getBoolean("showDesc")); + FRFont detailFont = FRFont.getInstance(toolConf.getString("detailfamily"), + toolConf.getInt("detailstyle"), + toolConf.getInt("detailsize"), + MapUtil.toColor(toolConf.getString("detailcolor"))); + this.detailTextAttrPane.populate(detailFont); + } + + @Override + public void updateBean(LzljMapChart chart) { + JSONObject toolConf = JSONObject.create(); + toolConf.put("toolBgColor", MapUtil.toHex(this.toolBgColor.getSelectObject())); + toolConf.put("toolBtnColor", MapUtil.toHex(this.toolBtnColor.getSelectObject())); + toolConf.put("toolBgOpacity", this.toolBgOpacity.updateBean()); + + TextAttr toolAttr = this.textAttrPane.update(); + toolConf.put("toolsize", toolAttr.getFRFont().getSize()); + toolConf.put("toolstyle", toolAttr.getFRFont().getStyle()); + toolConf.put("toolfamily", toolAttr.getFRFont().getFamily()); + toolConf.put("toolcolor", MapUtil.toHex(toolAttr.getFRFont().getForeground())); + + toolConf.put("detailBgColor", MapUtil.toHex(this.detailBgColor.getSelectObject())); + toolConf.put("detailTitleBgColor", MapUtil.toHex(this.detailTitleBgColor.getSelectObject())); + toolConf.put("detailBgOpacity", this.detailBgOpacity.updateBean()); + toolConf.put("showRegion", this.showRegion.isSelected()); + toolConf.put("showArea", this.showArea.isSelected()); + toolConf.put("showCounty", this.showCounty.isSelected()); + toolConf.put("showName", this.showName.isSelected()); + toolConf.put("showLayerType", this.showLayerType.isSelected()); + toolConf.put("showDataType", this.showDataType.isSelected()); + toolConf.put("showLng", this.showLng.isSelected()); + toolConf.put("showLat", this.showLat.isSelected()); + toolConf.put("showVal", this.showVal.isSelected()); + toolConf.put("showDesc", this.showDesc.isSelected()); + + TextAttr detailAttr = this.detailTextAttrPane.update(); + toolConf.put("detailsize", detailAttr.getFRFont().getSize()); + toolConf.put("detailstyle", detailAttr.getFRFont().getStyle()); + toolConf.put("detailfamily", detailAttr.getFRFont().getFamily()); + toolConf.put("detailcolor", MapUtil.toHex(detailAttr.getFRFont().getForeground())); + + chart.setToolConf(toolConf); + } + + @Override + protected String title4PopupWindow() { + return Toolkit.i18nText("Plugin-LzljMap-toolstitle"); + } + + private class ContentPane extends JPanel { + public ContentPane() { + initComponents(); + } + + private void initComponents() { + this.setLayout(new BorderLayout()); + + JPanel toolContentPane = createToolContentPane(); + JPanel detailContentPane = createDetailContentPane(); + JPanel columnsPane = createColumnsContentPane(); + + double p = TableLayout.PREFERRED; + double f = TableLayout.FILL; + double[] columnSize = {f}; + double[] rowSize = {p, p, p, p}; + Component[][] acomponents = new Component[][]{ + new Component[]{toolContentPane}, + new Component[]{detailContentPane}, + new Component[]{columnsPane} + }; + + JPanel panel = TableLayoutHelper.createTableLayoutPane(acomponents, rowSize, columnSize); + this.add(panel, BorderLayout.CENTER); + this.setVisible(true); + } + } + + private JPanel createToolContentPane() { + this.toolBgColor = new ColorSelectBox(100); + this.toolBgOpacity = new UINumberDragPaneWithPercent(0, 100); + this.toolBtnColor = new ColorSelectBox(100); + + this.textAttrPane = new ChartTextAttrPane(); + + double p = TableLayout.PREFERRED; + double f = TableLayout.FILL; + double[] columnSize = {p, f}; + double[] rowSize = {p, p, p, p}; + Component[][] components = new Component[][]{ + {null, null}, + new Component[]{new UILabel(Toolkit.i18nText("Plugin-LzljMap-toolBgColor")), this.toolBgColor}, + new Component[]{new UILabel(Toolkit.i18nText("Plugin-LzljMap-toolBgOpacity")), this.toolBgOpacity}, + new Component[]{new UILabel(Toolkit.i18nText("Plugin-LzljMap-toolBtnColor")), this.toolBtnColor} + }; + JPanel bgPane = TableLayoutHelper.createTableLayoutPane(components,rowSize,columnSize); + + Component[][] comps = new Component[][]{ + new Component[]{bgPane}, + new Component[]{this.textAttrPane} + }; + + JPanel pane = TableLayoutHelper.createTableLayoutPane(comps, new double[]{p, p}, new double[]{p, f}); + + return TableLayout4VanChartHelper.createExpandablePaneWithTitle(Toolkit.i18nText("Plugin-LzljMap-toolAlignExpand"), pane); + } + + private JPanel createDetailContentPane() { + + this.detailBgColor = new ColorSelectBox(100); + this.detailBgOpacity = new UINumberDragPaneWithPercent(0, 100); + this.detailTitleBgColor = new ColorSelectBox(100); + + this.detailTextAttrPane = new ChartTextAttrPane(); + + double p = TableLayout.PREFERRED; + double f = TableLayout.FILL; + double[] columnSize = {p, f}; + double[] rowSize = {p, p, p, p}; + Component[][] components = new Component[][]{ + {null, null}, + new Component[]{new UILabel(Toolkit.i18nText("Plugin-LzljMap-toolBgColor")), this.detailBgColor}, + new Component[]{new UILabel(Toolkit.i18nText("Plugin-LzljMap-toolBgOpacity")), this.detailBgOpacity}, + new Component[]{new UILabel(Toolkit.i18nText("Plugin-LzljMap-detailTitleBgColor")), this.detailTitleBgColor} + }; + JPanel bgPane = TableLayoutHelper.createTableLayoutPane(components,rowSize,columnSize); + + Component[][] comps = new Component[][]{ + new Component[]{bgPane}, + new Component[]{this.detailTextAttrPane} + }; + JPanel pane = TableLayoutHelper.createTableLayoutPane(comps, new double[]{p, p}, new double[]{p, f}); + + return TableLayout4VanChartHelper.createExpandablePaneWithTitle(Toolkit.i18nText("Plugin-LzljMap-detailAlignExpand"), pane); + } + + private JPanel createColumnsContentPane() { + showRegion = new UICheckBox(Toolkit.i18nText("Plugin_LzljMap_region")); + showArea = new UICheckBox(Toolkit.i18nText("Plugin_LzljMap_area")); + showCounty = new UICheckBox(Toolkit.i18nText("Plugin_LzljMap_county")); + showName = new UICheckBox(Toolkit.i18nText("Plugin_LzljMap_name")); + showLayerType = new UICheckBox(Toolkit.i18nText("Plugin_LzljMap_layertype")); + showDataType = new UICheckBox(Toolkit.i18nText("Plugin_LzljMap_datatype")); + showLng = new UICheckBox(Toolkit.i18nText("Plugin_LzljMap_lng")); + showLat = new UICheckBox(Toolkit.i18nText("Plugin_LzljMap_lat")); + showVal = new UICheckBox(Toolkit.i18nText("Plugin_LzljMap_val")); + showDesc = new UICheckBox(Toolkit.i18nText("Plugin_LzljMap_desc")); + + double p = TableLayout.PREFERRED; + double f = TableLayout.FILL; + Component[][] compCheck = new Component[][]{ + new Component[]{showRegion, showArea}, + new Component[]{showLayerType, showDataType}, + new Component[]{showName, showVal}, + new Component[]{showLng, showLat}, + new Component[]{showDesc, showCounty} + }; + JPanel checkPane = TableLayoutHelper.createTableLayoutPane(compCheck, new double[]{p, p, p, p, p, p}, new double[]{f, f}); + + return TableLayout4VanChartHelper.createExpandablePaneWithTitle(Toolkit.i18nText("Plugin-LzljMap-detailColumnsExpand"), checkPane); + + } +} diff --git a/src/com/fr/plugin/lzljgdmap/ui/MapUtil.java b/src/com/fr/plugin/lzljgdmap/ui/MapUtil.java new file mode 100644 index 0000000..a3ee5ef --- /dev/null +++ b/src/com/fr/plugin/lzljgdmap/ui/MapUtil.java @@ -0,0 +1,94 @@ +package com.fr.plugin.lzljgdmap.ui; + +import java.awt.*; +import java.util.Map; + +/** + * @author fr.open + */ +public class MapUtil { + public static String getString(Map map, String key) { + return getString(map, key, null); + } + + public static String getString(Map map, String key, String def) { + if (null == map) { + return def; + } + if (null != map.get(key)) { + return map.get(key).toString(); + } else { + return def; + } + } + + public static Integer getInteger(Map map, String key) { + return getInteger(map, key, null); + } + + public static Integer getInteger(Map map, String key, Integer def) { + if (null == map) { + return def; + } + if (null != map.get(key)) { + return Integer.parseInt(map.get(key).toString()); + } else { + return def; + } + } + + public static Double getDouble(Map map, String key) { + return getDouble(map, key, null); + } + + public static Double getDouble(Map map, String key, Double def) { + if (null == map) { + return def; + } + if (null != map.get(key)) { + return Double.parseDouble(map.get(key).toString()); + } else { + return def; + } + } + + public static Boolean getBoolean(Map map, String key) { + return getBoolean(map, key, null); + } + + public static Boolean getBoolean(Map map, String key, Boolean def) { + if (null == map) { + return def; + } + String s = getString(map, key); + if (null != s) { + if ("true".equals(s)) { + return true; + } else if ("false".equals(s)){ + return false; + } else { + return def; + } + } else { + return def; + } + } + + public static String toHex(Color c) { + if (null == c) { + return "transparent"; + } + String hex = Integer.toHexString(c.getRGB()); + if (hex.length() == 8) { + hex = "#" + hex.substring(2); + } + return hex; + } + public static Color toColor(String c) { + if (null != c && c.startsWith("#")) { + c = c.substring(1); + return new Color(Integer.parseInt(c, 16)); + } + return null; + } +} diff --git a/src/com/fr/plugin/lzljgdmap/vo/ClusterPointMapStyleJson.java b/src/com/fr/plugin/lzljgdmap/vo/ClusterPointMapStyleJson.java new file mode 100644 index 0000000..fa9572f --- /dev/null +++ b/src/com/fr/plugin/lzljgdmap/vo/ClusterPointMapStyleJson.java @@ -0,0 +1,14 @@ +package com.fr.plugin.lzljgdmap.vo; + +/** + * @author :fr.open + * @date :2022/8/25 18:35 + * @description: + */ +public class ClusterPointMapStyleJson extends CustomJsonObject { + private String tilte = CLUSTER_POINT_MAP_TITLE; + + public String getTilte() { + return tilte; + } +} diff --git a/src/com/fr/plugin/lzljgdmap/vo/CustomJsonObject.java b/src/com/fr/plugin/lzljgdmap/vo/CustomJsonObject.java new file mode 100644 index 0000000..f1df550 --- /dev/null +++ b/src/com/fr/plugin/lzljgdmap/vo/CustomJsonObject.java @@ -0,0 +1,23 @@ +package com.fr.plugin.lzljgdmap.vo; + +import com.fr.json.JSONObject; + +/** + * @author :fr.open + * @date :2022/8/25 18:33 + * @description: + */ +public class CustomJsonObject { + private JSONObject obj = JSONObject.create(); + + public JSONObject get() { + return obj; + } + + public void put(JSONObject obj) { + this.obj = obj; + } + + public static final String POINT_MAP_TITLE = "pointmap"; + public static final String CLUSTER_POINT_MAP_TITLE = "clusterpointmap"; +} diff --git a/src/com/fr/plugin/lzljgdmap/vo/PointMapStyleJson.java b/src/com/fr/plugin/lzljgdmap/vo/PointMapStyleJson.java new file mode 100644 index 0000000..9a9fd4f --- /dev/null +++ b/src/com/fr/plugin/lzljgdmap/vo/PointMapStyleJson.java @@ -0,0 +1,14 @@ +package com.fr.plugin.lzljgdmap.vo; + +/** + * @author :fr.open + * @date :2022/8/25 18:35 + * @description: + */ +public class PointMapStyleJson extends CustomJsonObject { + private String tilte = POINT_MAP_TITLE; + + public String getTilte() { + return tilte; + } +} diff --git a/src/com/fr/plugin/lzljgdmap/web/LzljMapChart.css b/src/com/fr/plugin/lzljgdmap/web/LzljMapChart.css new file mode 100644 index 0000000..c3fc3c8 --- /dev/null +++ b/src/com/fr/plugin/lzljgdmap/web/LzljMapChart.css @@ -0,0 +1,307 @@ +.lzlj_gd_amap_chart_title { + position: absolute; + top: 0px; + left: 0px; + width: 100%; + background: rgba(255, 255, 255, 0.7); + color: #000000; + font-size: 12px; + font-family: sans-serif; + font-weight: bold; + font-style: normal; + text-align: center; + padding: 5px 10px; +} + +.lzlj_amap_container { + position: absolute; + background: rgba(51, 51, 51, 0.7); +} + +.lzlj_amap_container_hide { + position: absolute; + background: rgba(51, 51, 51, 0.9); + padding: 3px 10px; + color: #ffffff; + font-size: 12px; + font-family: sans-serif; + border-radius: 0px 10px 10px 0px; + cursor: pointer; +} + +.lzlj_pos_left { + top: 50px; + left: 0px; + border-radius: 0px 10px 10px 0px; +} + +.lzlj_amap_container .tools { + font-weight: bold; + padding: 5px 10px; +} + +.lzlj_amap_container .row { + display: flex; + justify-content: space-between; + padding: 5px 10px; +} + +.lzlj_amap_container .row .tool_circle { + padding: 2px 10px; + border-radius: 20px; + cursor: pointer; + width: 100%; + text-align: center; +} + +.lzlj_amap_container .row .tool_circle_clear { + padding: 2px 10px; + cursor: pointer; +} + +.lzlj_amap_container .row .tool_region { + padding: 2px 10px; + border-radius: 20px; + cursor: pointer; + width: 100%; + text-align: center; +} + +.lzlj_amap_container .row .tool_region_clear { + padding: 2px 10px; + cursor: pointer; +} + +.lzlj_amap_container .active { + background-color: #FF7F50; + border: #FF7F50 solid 1px; +} + +.lzlj_amap_container .inactive { + border: #FF7F50 solid 1px; + background: transparent; +} + +.lzlj_amap_container .filter_row { + padding: 10px; +} + +.lzlj_amap_container .add_layer { + padding: 2px 10px; + border-radius: 20px; + cursor: pointer; + text-align: center; +} + +.lzlj_amap_container .layer_active { + margin-top: 5px; + background-color: #FF7F50; + padding: 2px 10px; + border-radius: 20px; +} + +.lzlj_amap_container .layer_inactive { + margin-top: 5px; + padding: 2px 10px; + border: #FF7F50 solid 1px; + border-radius: 20px; +} + +.lzlj_amap_container .chart_type { + margin-top: 5px; +} + +.lzlj_amap_container .data_type { + margin-top: 10px; +} + +.lzlj_amap_container .close { + width: 16px; + height: 16px; + position: absolute; + right: 4px; + top: 4px; + cursor: pointer; +} + +.lzlj_amap_container .legend_c { + display: flex; + flex-direction: column; + font-weight: bold; + padding: 5px 10px; +} +.lzlj_amap_container .legend_e { + display: flex; + align-items: center; +} + +.lzlj_gd_amap_region { + position: absolute; + width: 300px; + top: 50px; + left: 100px; + background: rgba(255, 255, 255, 1); + z-index: 100; +} + +.lzlj_gd_amap_region .ok { + position: absolute; + right: 10px; + top: 5px; + cursor: pointer; + padding: 2px 5px; + border-radius: 4px; +} + +.lzlj_gd_amap_region .treebar { + height: 500px; + overflow: auto; + margin-top: 25px; + padding: 5px; + font-family: sans-serif; + font-size: 12px; +} + +.lzlj_gd_amap_region .nodeBar { + clear: both; + height: 20px; + background: #ffffff; +} + +.lzlj_gd_amap_region .nodeSplitor { + clear: both; + display: block; + width: 100%; + height: 1px; + margin-top: 1px; + margin-bottom: 3px; + border-bottom-style: solid; + border-bottom-width: 1px; + border-bottom-color: #cccccc; +} + +.lzlj_gd_amap_region .nodeBarSelected { + clear: both; + height: 20px; + background: #d9d9d9; +} + +.lzlj_gd_amap_region .nodeBarOver { + clear: both; + height: 20px; +} + +.lzlj_gd_amap_region .nodeFlag { + float: left; + width: 12px; + height: 100%; +} + +.lzlj_gd_amap_region .nodePlus { + float: left; + width: 16px; + height: 16px; + background: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAXNSR0IArs4c6QAAAZFJREFUWEfll7FKA0EQhv+V3Kyk0UILRXwBQUFBbCwEtbfQRrDQFxBBLNUnsLQylZVpbLUQtRQbC30CUbS0iPhvYOTkIndnDDFs2GAWDm6XZf5v/50b5gwCDxNYHx0JMCAi26o67dMdY8wNyZ18zB8OiMgtgCmf4ulYJDOamYmILAM4UdUN51zJJ0QURevGmCNVPXDObdVi5wH2AOzmKX2BiIiq6qVzbu7fAFgA8fPWjEveHRCRMwB9JGdCAbwD6G02Z9rhgMYnDwZgrb1S1X6SE0GuoHsAROQOwHjK5sfkfRBAD4CXZD6S2vNAchLAR22t5SS01h6q6iKAGOR7GGNmVTUCcJHLgVj4muRaer1lgN8SrHtyoGMdiO80dCF6TQqRBClEIlJS1VHn3HwQgGZE2/oZegew1m7GPVuhUBiuVCrPfxVotL9YLA5Vq9UnAKckl+q2ZNbaBVU9B7BPMu4PvQ0R+eo387HrteXHAFa9KWcDlUmuZMp5PaGkPR/zDHFPspyP2ZG/Zp4P3jhccAc+AV1FhTChwafSAAAAAElFTkSuQmCC') 0px 0px no-repeat; + background-size: 100% 100%; + cursor: pointer; +} + +.lzlj_gd_amap_region .nodeSub { + float: left; + width: 16px; + height: 16px; + background: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAXNSR0IArs4c6QAAAUVJREFUWEftV7FKBDEUnMjuC2ytheIfCBYe2FlYaG+hjWChPyDCYan3BZZWWll5jbWFiKXYWOgXiOIPLDhZeLKyJ7txETwCe2BelYQwM5limBh0PKZjfkykgGkR6avqckh3jDH3JA99zB8OiMgDgF5I8joWyQZnYyMimwAuVXXPOXceUkSaprvGmDNVPXHOHYywfQHHAI58laGEiIiq6q1zbjUKiA5EB6IDf3JARB4BLNYC6aVazwCYAvBe7edrd55JLgH4GJ2NHUTW2lNVXQdQCvkeY8yKqqYAbry0LInvSO7Uz8cWEKM4OhAd+D8OWGv3y86WJMlcnudvoV5e4mRZNlsUxSuAK5IbrVFsrV1T1WsAA5JlPww2IvLVN33stlp+AWA7GHMTaEhyqxHnbURVPV8ILOKJ5NDHnMivWeCH/w7XuQOf+9M8MKmeDQ8AAAAASUVORK5CYII=') 0px 0px no-repeat; + background-size: 100% 100%; + cursor: pointer; +} + +.lzlj_gd_amap_region .nodeLevel { + float: left; + height: 100%; + width: 6px; +} + +.lzlj_gd_amap_region .nodeImg { + float: left; + width: 18px; + padding-left: 3px; + padding-top: 3px; +} + +.lzlj_gd_amap_region .nodeCheck { + float: left; + width: 16px; + height: 16px; + background: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAXNSR0IArs4c6QAAAKZJREFUWEftl8EJQjEQROeHsFUoWIrWYiFqKVby7UQPVjGEKAsqGi//kM/+w+w1YWZ47GF2QPAMwf5YXgAzOwLYA1h1pnMDcCbp+p/5IfAyP3Q2buVO3yHaAFcAm1rrrpRy6Rkk57xNKY0A7iTXb+02wMMfSM6yG2b2p68AIiACIiACIiACIiACiyMQXkq9s8fVcm/EoYdJzztgqtYs/X+quf8LD/AE20fQIQrJsZAAAAAASUVORK5CYII=') 0px 0px no-repeat; + background-size: 100% 100%; +} + +.lzlj_gd_amap_region .nodeChecked { + float: left; + width: 16px; + height: 16px; + background: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAXNSR0IArs4c6QAAAXNJREFUWEftlyFPw0AYhp9b1q+rQqGABBQJGAQhIUEwRQjBIHAofgjwUxAYxEj4A0NhCBIcAYFDova165FLumV0Y4y2W4Hs5LX3vU/fu699ayh5mJL1+X0AInIKHAPzBbvzApyrqqvfHZ8cSMRPChZOlzvrhUgDPAOLcRzXoyi6KRKkWq1uVyqVJvCqqgud2mkA6y6o6ljOhoj01Z8CTB34fw74vr9srb2w1r6HYVjvbeWxd0GtVluK47gBrAH3qro+MYAgCOba7bYT3wAegENVfZwUwKzv+w1r7dZX4g4k8xZ4ntc0xvjGmKNWq/WUekXPeJ53ZYxx+z3wyTv3ZwYQkVtgE7hT1T3gLSkaiMgVsPOdeC4HRGQFuARWrbXNMAx3gSgR3x9FPBdAsrgLAVw7AOBgVPHcAAMg3NTQPU9/zjOfgVQrdZxw032tNixDFAKQJ6RMAf6EA6WHUpfZy4vlSa+X92OSp8Wyrh1L/v8JTOkAH9paLjBtTnOxAAAAAElFTkSuQmCC') 0px 0px no-repeat; + background-size: 100% 100%; +} + +.lzlj_gd_amap_region .nodeChecked_part { + float: left; + width: 16px; + height: 16px; + background: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAXNSR0IArs4c6QAAAL5JREFUWEftl8ENwjAMRX+jyFOAxCiwSSQGATYJk8AmcGAKKwrICKoSOFRRinuwr22/X157+O2gPJ3yfswPgIj2ALYAFo3tXAEcmVny+/kw8Fq+a7y4jDsMIUqAC4BVznmTUjq3BPHer51zJwA3Zl6+s0uAu1xg5km+DSL6yp8/QIzxSV07IYT+kFUGDMAMmAEzYAbMgBlQN1DbA349V9UH/g2gXkqls+vVctGt+mPS8n2PzZqk/49dLvepAzwA9bAQMMgDzMEAAAAASUVORK5CYII=') 0px 0px no-repeat; + background-size: 100% 100%; +} + +.lzlj_gd_amap_region .nodeTxt { + float: left; + height: 22px; + color: #000000; + padding-top: 2px; +} + +.lzlj_gd_amap_data_list { + position: absolute; + right: 0px; + top: 0px; + height: 100%; + background-color: #ffffff; +} + +.lzlj_gd_amap_data_list .list_title { + display: flex; + padding: 10px 10px; + padding-right: 17px; + background-color: #d9d9d9; +} + +.lzlj_gd_amap_data_list .list_content_ul { + padding: 0px 10px; + margin: 0px; + overflow-y: scroll; + scrollbar-width: thin; +} + +.lzlj_gd_amap_data_list .list_content_li { + display: flex; + padding: 10px 0px; + border-bottom: 1px solid #d9d9d9; + word-break: break-word; +} + +.lzlj_gd_amap_data_list .close_list { + margin-left: 20px; + color: #0583f2; + cursor: pointer; +} + +::-webkit-scrollbar { + width: 7px; + height: 7px; + background-color: #f5f5f5; +} +::-webkit-scrollbar-thumb { + border-radius: 10px; + box-shadow: inset 0 0 6px rgba(0, 0, 0, 0.1); + -webkit-box-shadow: inset 0 0 6px rgba(0, 0, 0, 0.1); + background-color: #c8c8c8; +} \ No newline at end of file diff --git a/src/com/fr/plugin/lzljgdmap/web/LzljMapChartWrapper.js b/src/com/fr/plugin/lzljgdmap/web/LzljMapChartWrapper.js new file mode 100644 index 0000000..801b3b4 --- /dev/null +++ b/src/com/fr/plugin/lzljgdmap/web/LzljMapChartWrapper.js @@ -0,0 +1,1754 @@ +LzljMapChartWrapper = ExtendedChart.extend({ + + _init: function (dom, option) { + debugger; + + var self = this; + //self.chartBaseOption = option; + window.lzljgdmapChartObj = self; + + + this._dom = dom; + this.width = option.width || $(dom).width();// 补充从dom获取. + this.height = option.height || $(dom).height(); + + this.chartData = option.data; + option.data = []; + + this.titleConf = option.titleConf; + this.mapConf = option.mapConf; + this.pointConf = option.pointConf; + this.heatConf = option.heatConf; + this.toolConf = option.toolConf; + this.labelConf = option.labelConf; + this.tipsConf = option.tipsConf; + + this.pointStyleCond = option.pointStyleCond; + + this.pointLink = option.pointLink; + this.linkParam = option.linkParam; + + this.reqParams = {}; + this.chartTypeConf = {}; + this.drawCircle = null; + this.addedOverlays = []; + this.isCircleMode = false; + this.isManulOperMap = false; + + window._AMapSecurityConfig = { + securityJsCode:'6c10d1752e8f1cb4f908d87bcd84a1bc', + }; + + this.initTips(); + this.initRegion(); + this.initMaps(); + this.initChartTitle(); + + return {}; + }, + reloadChart: function() { + var newurl = window.location.href; + if (newurl.indexOf(".frm") > 0) { + newurl = newurl.substr(0, newurl.indexOf('.frm') + 4); + } else if (newurl.indexOf(".cpt") > 0) { + newurl = newurl.substr(0, newurl.indexOf('.cpt') + 4); + } + newurl += '®ions=' + this.reqParams.regions; + newurl += '&areas=' + this.reqParams.areas; + newurl += '&countys=' + this.reqParams.countys; + + newurl += '&layertype=' + this.reqParams.layertype; + newurl += '&datatype=' + this.reqParams.datatype; + window.location.href = newurl; + return; + }, + reloadMapData: function () { + //var ID = FR.cjkEncode(id); + var self = this; + + self.clearMapLayer(); + + // 检测js堆栈内存 + if (window.performance && window.performance.memory + && (window.performance.memory.usedJSHeapSize / window.performance.memory.jsHeapSizeLimit > 0.9)) { + window.location.reload(true); + return; + } + + // 正在加载数据,限制重复加载数据 + self.notLoadData = true; + + var width = self.width; + var height = self.height; + var sheetIndex = self.sheetIndex; + var ecName = self.ecName; + var reqObj = $.extend({ + cmd: 'chart_auto_refresh', + sessionID: FR.SessionMgr.getSessionID(), + chartID: self.chartID, + chartWidth: width, + chartHeight: height, + sheetIndex: sheetIndex, + ecName: ecName, + __time: new Date().getTime() + }, self.reqParams); + + var mapBounds = self.baseMap.getBounds(); + + var min = mapBounds.southWest; + var max = mapBounds.northEast; + reqObj.minx = self.reqParams.minx || min.lng; + reqObj.miny = self.reqParams.miny || min.lat; + reqObj.maxx = self.reqParams.maxx || max.lng; + reqObj.maxy = self.reqParams.maxy || max.lat; + + console.log('load remote data'); + + if (FR.servletURL) { + FR.showLoadingDialog(); + FR.ajax({ + type: 'GET', + url: FR.servletURL + '?op=chartauto', + data: reqObj, + dataType: 'json', + success: function (chartRelateJS) { + + var newData = chartRelateJS.relateChartList[0].chartAttr.data; + //var newdataStr = JSON.stringify(newData); + self.chartData = newData; + chartRelateJS.relateChartList[0].chartAttr.data = []; + if (!newData || newData.length <= 0) { + FR.hideLoadingDialog(); + } + + //self.wrapData(); + //self.loadMapLayers(); + self.renderMapData(); + + } + }); + } + }, + + initTips: function () { + var self = this; + if (self.tipsConf.showPointTips) { + $('
').css({ + 'position': 'absolute', + 'left': '0px', + 'top': '0px', + 'width': (self.tipsConf.tipbgwidth || 150) + 'px', + 'padding': '10px', + 'background-color': self.hexToRgba(self.tipsConf.tipBgColor, self.tipsConf.tipBgOpacity).rgba, + 'border-radius': '5px', + 'color': self.tipsConf.tipcolor, + 'font-size': self.tipsConf.tipsize, + 'font-family': self.tipsConf.tipfamily, + 'font-style': self.getFontStyle(self.tipsConf.tipstyle), + 'font-weight': self.getFontWeight(self.tipsConf.tipstyle) + }).addClass('LzljAMap_custom_tips').appendTo($(this._dom).parent()); + + $(this._dom).parent().find('div.LzljAMap_custom_tips').hide(); + } + }, + initLegend: function() { + var self = this; + if ($(this._dom).parent().find('div.lzlj_amap_legend_container') + && $(this._dom).parent().find('div.lzlj_amap_legend_container').length > 0) { + return; + } + + $('
').appendTo($(this._dom).parent()); + + var vHtml = ''; + for (var i = 0; i < self.pointStyleCond.length; i++) { + if (self.pointStyleCond[i].title == "pointmap") { + + } + } + }, + initTools: function () { + var self = this; + if ($(this._dom).parent().find('div.lzlj_amap_container') + && $(this._dom).parent().find('div.lzlj_amap_container').length > 0) { + return; + } + + $('
').appendTo($(this._dom).parent()); + + $(this._dom).parent().find('div.lzlj_amap_container').css({ + 'background-color': self.hexToRgba(self.toolConf.toolBgColor, self.toolConf.toolBgOpacity).rgba, + 'color': self.toolConf.toolcolor, + 'font-size': self.toolConf.toolsize, + 'font-family': self.toolConf.toolfamily, + 'font-style': self.getFontStyle(self.toolConf.toolstyle), + 'font-weight': self.getFontWeight(self.toolConf.toolstyle) + }); + + var vHtml = '
区域筛选
' + + '
圈选
' + + '
区域
' + + '
数据筛选
'; + for (var i = 0; i < self.toolsData.length; i++) { + vHtml += '
' + + '
' + self.toolsData[i].name + '
' + + '
点图热力图
' + + '
'; + for (var k = 0; k < self.toolsData[i].data.length; k++) { + + var styleItem = {layertype: self.toolsData[i].name, datatype: self.toolsData[i].data[k]}; + + + var markerCondStyle = self.findLegendCond(styleItem, "pointmap"); + var legendIcon = "data:image/png;base64," + (markerCondStyle.pointimg || self.pointConf.pointimg); + vHtml += '
'; + + vHtml += '' + self.toolsData[i].data[k] + ''; + //if (k < self.toolsData[i].data.length - 1) { + vHtml += '
'; + //} + } + vHtml += '
'; + } + //vHtml += '
图例
'; + //vHtml += '
其他
'; + + $(this._dom).parent().find('div.lzlj_amap_container').html(vHtml); + + var toolHeight = $(this._dom).parent().find('div.lzlj_amap_container').height(); + if (toolHeight > this.height - 100) { + $(this._dom).parent().find('div.lzlj_amap_container').css({ + "top": '20px', + "height": (self.height - 40) + 'px', + "overflow-y": 'auto' + }); + } + + self.activeSelectedBtn(); + + // 显示工具 + $('
工具
').appendTo($(this._dom).parent()); + $(this._dom).parent().find('div.lzlj_amap_container_hide').hide(); + + + // 事件 + // 关闭工具 + $(self._dom).parent().find('div.lzlj_amap_container img').on('click', function (e) { + $(self._dom).parent().find('div.lzlj_amap_container').hide('fast', function () { + $(self._dom).parent().find('div.lzlj_amap_container_hide').show(); + }); + }); + // 打开工具 + $(self._dom).parent().find('div.lzlj_amap_container_hide').on('click', function (e) { + $(self._dom).parent().find('div.lzlj_amap_container').show('fast'); + $(self._dom).parent().find('div.lzlj_amap_container_hide').hide(); + }); + // 区域 + $(self._dom).parent().find('div.lzlj_amap_container .tool_region').on('click', function (e) { + var isSelected = $(self._dom).parent().find('div.lzlj_amap_container .tool_region').hasClass("active"); + if (isSelected) { + // 取消 + $(self._dom).parent().find('div.lzlj_amap_container .tool_region').removeClass('active'); + $(self._dom).parent().find('div.lzlj_amap_container .tool_region').addClass('inactive'); + + self.reqParams.regions = ""; + self.reqParams.areas = ""; + self.reqParams.countys = ""; + + self.mapRegionTree.SetChildrenCheckbox({NodeId: -1, NodeChecked: 0}); + + self.disProvince && self.disProvince.setMap(null); + + self.isManulOperMap = false; + + self.reloadMapData(); + } else { + // 选中 + $(self._dom).parent().find('div.lzlj_gd_amap_region').show(); + $(self._dom).parent().find('div.lzlj_amap_container .tool_region').removeClass('inactive'); + $(self._dom).parent().find('div.lzlj_amap_container .tool_region').addClass('active'); + } + self.activeSelectedBtn(); + }); + // 清除区域 + $(self._dom).parent().find('div.lzlj_amap_container .tool_region_clear').on('click', function (e) { + $(self._dom).parent().find('div.lzlj_amap_container .tool_region').removeClass('active'); + $(self._dom).parent().find('div.lzlj_amap_container .tool_region').addClass('inactive'); + self.activeSelectedBtn(); + self.reqParams.regions = ""; + self.reqParams.areas = ""; + + self.mapRegionTree.SetChildrenCheckbox({NodeId: -1, NodeChecked: 0}); + + self.disProvince && self.disProvince.setMap(null); + + self.reloadMapData(); + }); + // 圈选 + $(self._dom).parent().find('div.lzlj_amap_container .tool_circle').on('click', function (e) { + + var isSelected = $(self._dom).parent().find('div.lzlj_amap_container .tool_circle').hasClass("active"); + if (isSelected) { + // 取消 + self.baseMap.setDefaultCursor("default"); + + self.mouseTool.close(true); + self.circleEditor.close(); + if (self.drawCircle) { + self.baseMap.remove(self.drawCircle); + } + self.drawCircle = null; + self.reqParams.minx = 72.08; + self.reqParams.miny = 0.1; + self.reqParams.maxx = 141.08; + self.reqParams.maxy = 54.28; + self.reqParams.centerx = ''; + self.reqParams.centery = ''; + self.reqParams.radius = ''; + self.isCircleMode = false; + + $(self._dom).parent().find('div.lzlj_amap_container .tool_circle').removeClass('active'); + $(self._dom).parent().find('div.lzlj_amap_container .tool_circle').addClass('inactive'); + + $(self._dom).parent().find('div.lzlj_gd_amap_data_list').remove(); + + self.reloadMapData(); + } else { + // 选中 + //用鼠标工具画圆 + self.baseMap.setDefaultCursor("crosshair"); + + self.mouseTool.circle({ + strokeColor: self.mapConf.circleBorderColor, + strokeWeight: self.mapConf.circleBorderWidth, + fillColor: self.mapConf.circleFillColor, + fillOpacity: (parseInt(self.mapConf.circleOpacity) || 0 ) / 100 + }); + $(self._dom).parent().find('div.lzlj_amap_container .tool_circle').removeClass('inactive'); + $(self._dom).parent().find('div.lzlj_amap_container .tool_circle').addClass('active'); + } + + self.activeSelectedBtn(); + }); + + // 分类 add_layer + $(self._dom).parent().find('div.lzlj_amap_container .add_layer').on('click', function (e) { + if ($(this).hasClass('active')) { + $(this).removeClass('active'); + $(this).addClass('inactive'); + + $(this).parent().find('.chart_type').hide(); + $(this).parent().find('.data_type').hide(); + $(this).parent().find('.data_type input[type=checkbox]').attr('checked', false); + } else { + $(this).removeClass('inactive'); + $(this).addClass('active'); + + $(this).parent().find('.chart_type').show(); + $(this).parent().find('.data_type').show(); + $(this).parent().find('.data_type input[type=checkbox]').attr('checked', true); + } + self.activeSelectedBtn(); + + var checkedVals = "''"; + $(self._dom).parent().find('div.lzlj_amap_container .add_layer.active').each(function (e1) { + checkedVals += ",'" + $(this).text() + "'"; + }); + if (checkedVals.length > 3) checkedVals = checkedVals.substring(3, checkedVals.length); + self.reqParams.layertype = checkedVals; + + checkedVals = "''"; + $(self._dom).parent().find('div.lzlj_amap_container .data_type input[type=checkbox]:checked').each(function (e1) { + checkedVals += ",'" + $(this).val() + "'"; + }); + if (checkedVals.length > 3) checkedVals = checkedVals.substring(3, checkedVals.length); + self.reqParams.datatype = checkedVals; + + self.reqParams.minx = 72.08; + self.reqParams.miny = 0.1; + self.reqParams.maxx = 141.08; + self.reqParams.maxy = 54.28; + + self.isManulOperMap = false; + self.reloadMapData(); + + }); + // 数据类型 data_type + $(self._dom).parent().find('div.lzlj_amap_container .data_type input').on('click', function (e) { + var checkedVals = "''"; + $(self._dom).parent().find('div.lzlj_amap_container .data_type input[type=checkbox]:checked').each(function (e1) { + checkedVals += ",'" + $(this).val() + "'"; + }); + if (checkedVals.length > 3) checkedVals = checkedVals.substring(3, checkedVals.length); + self.reqParams.datatype = checkedVals; + + self.reqParams.minx = 72.08; + self.reqParams.miny = 0.1; + self.reqParams.maxx = 141.08; + self.reqParams.maxy = 54.28; + + self.isManulOperMap = false; + self.reloadMapData(); + }); + // 图层类型 chart_type + $(self._dom).parent().find('div.lzlj_amap_container .chart_type input').on('click', function (e) { + var layertype = $(this).parent().parent().find('div.add_layer').text(); + if (layertype) { + self.chartTypeConf[layertype] = $(this).val(); + self.reloadMapData(); + } + }); + }, + initRegion: function () { + var self = this; + $('
').appendTo($(this._dom).parent()); + //$(self._dom).parent().find('div.lzlj_gd_amap_region').html('
'); + $(self._dom).parent().find('div.lzlj_gd_amap_region').html('
确定
'); + + $(self._dom).parent().find('div.lzlj_gd_amap_region').hide(); + + $(self._dom).parent().find('div.lzlj_gd_amap_region .ok').css({ + "color": self.toolConf.toolcolor, + "background-color": self.toolConf.toolBtnColor + }); + + $(self._dom).parent().find('div.lzlj_gd_amap_region .ok').on('click', function (e) { + $(self._dom).parent().find('div.lzlj_gd_amap_region').hide(); + var checkedRegion = self.mapRegionTree.GetCheckedTxtsByLevel(1); + var checkedArea = self.mapRegionTree.GetCheckedTxtsByLevel(2); + var checkedCountry = self.mapRegionTree.GetCheckedTxtsByLevel(3); + self.reqParams.regions = checkedRegion; + self.reqParams.areas = checkedArea; + self.reqParams.countys = checkedCountry; + self.reqParams.provinces = self.mapRegionTree.GetCheckedProvinceTxts(); + self.reqParams.minx = 72.08; + self.reqParams.miny = 0.1; + self.reqParams.maxx = 141.08; + self.reqParams.maxy = 54.28; + + self.isManulOperMap = false; + self.loadRegionFlag = true; + self.loadRegionBorder(self.mapRegionTree.GetCheckedValues()); + + self.reloadMapData(); + }); + + var tree = new MyTree("popRegionTreeContainer", true, -1); + self.mapRegionTree = tree; + self.initRegionData(tree); + }, + initSelectedDataList: function () { + var self = this; + + if ($(this._dom).parent().find('div.lzlj_gd_amap_data_list').length <= 0) { + $('
').appendTo($(this._dom).parent()); + $(this._dom).parent().find('div.lzlj_gd_amap_data_list').css({ + "background-color": self.hexToRgba(self.toolConf.detailBgColor, self.toolConf.detailBgOpacity).rgba, + 'color': self.toolConf.detailcolor, + 'font-size': self.toolConf.detailsize, + 'font-family': self.toolConf.detailfamily, + 'font-style': self.getFontStyle(self.toolConf.detailstyle), + 'font-weight': self.getFontWeight(self.toolConf.detailstyle) + }); + } + + $(this._dom).parent().find('div.lzlj_gd_amap_data_list').html(''); + $(this._dom).parent().find('div.lzlj_gd_amap_data_list').hide(); + + var vHtml = ''; + vHtml += '
'; + if (self.toolConf.showRegion) { + vHtml += '
省份
'; + } + if (self.toolConf.showArea) { + vHtml += '
地市
'; + } + if (self.toolConf.showCounty) { + vHtml += '
区县
'; + } + if (self.toolConf.showName) { + vHtml += '
名称
'; + } + if (self.toolConf.showLayerType) { + vHtml += '
数据分类
'; + } + if (self.toolConf.showDataType) { + vHtml += '
数据类型
'; + } + if (self.toolConf.showLng) { + vHtml += '
经度
'; + } + if (self.toolConf.showLat) { + vHtml += '
纬度
'; + } + if (self.toolConf.showVal) { + vHtml += '
数值
'; + } + if (self.toolConf.showDesc) { + vHtml += '
描述
'; + } + vHtml += '
'; + + vHtml += '
    '; + for (var i = 0; i < this.chartData.length; i++) { + vHtml += '
  • '; + if (self.toolConf.showRegion) { + vHtml += '
    ' + this.chartData[i].region + '
    '; + } + if (self.toolConf.showArea) { + vHtml += '
    ' + this.chartData[i].area + '
    '; + } + if (self.toolConf.showCounty) { + vHtml += '
    ' + this.chartData[i].county + '
    '; + } + if (self.toolConf.showName) { + vHtml += '
    ' + this.chartData[i].name + '
    '; + } + if (self.toolConf.showLayerType) { + vHtml += '
    ' + this.chartData[i].layertype + '
    '; + } + if (self.toolConf.showDataType) { + vHtml += '
    ' + this.chartData[i].datatype + '
    '; + } + if (self.toolConf.showLng) { + vHtml += '
    ' + this.chartData[i].lng + '
    '; + } + if (self.toolConf.showLat) { + vHtml += '
    ' + this.chartData[i].lat + '
    '; + } + if (self.toolConf.showVal) { + vHtml += '
    ' + this.chartData[i].val + '
    '; + } + if (self.toolConf.showDesc) { + vHtml += '
    ' + this.chartData[i].desc + '
    '; + } + vHtml += '
  • '; + } + vHtml += '
'; + vHtml += '
共 ' + this.chartData.length + ' 条记录关闭
' + + $(this._dom).parent().find('div.lzlj_gd_amap_data_list').html(vHtml); + + $(this._dom).parent().find('div.lzlj_gd_amap_data_list').show('fast', function(){ + if ($(self._dom).parent().find('div.lzlj_gd_amap_data_list .list_content_ul').height() > self.height - 100) { + $(self._dom).parent().find('div.lzlj_gd_amap_data_list .list_content_ul').height(self.height - 100); + } + }); + + $(this._dom).parent().find('div.lzlj_gd_amap_data_list .close_list').on('click', function(e){ + $(this).parent().parent().remove(); + }); + }, + + initChartTitle: function () { + if (this.titleConf.titlevisiable) { + var self = this; + if ($(this._dom).parent().find('div.lzlj_gd_amap_chart_title').length <= 0) { + $('
').appendTo($(this._dom).parent()); + } + $(this._dom).parent().find('div.lzlj_gd_amap_chart_title').html(this.titleConf.titlename || ''); + $(this._dom).parent().find('div.lzlj_gd_amap_chart_title').css({ + "background": self.hexToRgba(self.titleConf.titlebgcolor, self.titleConf.titleBgOpacity).rgba, + "color": self.titleConf.titlecolor, + "font-family": self.titleConf.titlefamily, + "text-align": self.getAlign(self.titleConf.titleposition), + "font-size": self.titleConf.titlesize + "px", + "font-style": self.getFontStyle(self.titleConf.titlestyle), + "font-weight": self.getFontWeight(self.titleConf.titlestyle) + }); + } + }, + + activeSelectedBtn: function() { + var self = this; + $(this._dom).parent().find('div.lzlj_amap_container .active').css({ + "color": self.toolConf.toolcolor, + "background-color": self.toolConf.toolBtnColor, + "border": self.toolConf.toolBtnColor + ' solid 1px' + }); + $(this._dom).parent().find('div.lzlj_amap_container .inactive').css({ + "color": self.toolConf.toolBtnColor, + "background": "transparent", + "border": self.toolConf.toolBtnColor + ' solid 1px' + }); + $(this._dom).parent().find('div.lzlj_amap_container .chart_type').css({ + "color": self.toolConf.toolBtnColor + }); + $(this._dom).parent().find('div.lzlj_amap_container .data_type').css({ + "color": self.toolConf.toolBtnColor + }); + }, + + renderMapData() { + + var self = this; + + // 数据结构调整 + self.wrapData(); + + var isLoadRegion = self.loadRegionFlag && self.reqParams.provinces && self.reqParams.provinces.length > 0; + if (isLoadRegion) { + console.log('start load region '); + // 行政区域模式,加载行政区域 + console.log('start load region data'); + if (!self.isManulOperMap) { + var pointViewPoints = self.getMapViewPoints(); + + var fitZoomAndCenter = self.baseMap.getFitZoomAndCenterByBounds(pointViewPoints, [10,10,10,10]); + + //var fitZoomAndCenter = self.baseMap.getFitZoomAndCenterByOverlays(self.disProvince, [10,10,10,10]); + + var zoom0 = self.pointConf.clusterMaxZoom || 12; + var zoom1 = fitZoomAndCenter[0] || self.reqParams.mapzoom; + + var fitCenter = fitZoomAndCenter[1] || self.getAreaCenter(pointViewPoints); + self.baseMap.setZoomAndCenter(zoom1, fitCenter, true, 0); + + if ((zoom0 > zoom1 && zoom0 < self.reqParams.mapzoom) || (zoom0 < zoom1 && zoom0 > self.reqParams.mapzoom)) { + // 重新计算是否聚合 + self.reqParams.mapzoom = zoom1; + self.wrapData(); + } + + // 添加数据图层 + self.loadMapLayers(); + + FR.hideLoadingDialog(); + setTimeout(function(){ + self.notLoadData = false; + }, 5000); + + + } else { + // 添加数据图层 + self.loadMapLayers(); + + FR.hideLoadingDialog(); + + setTimeout(function(){ + self.notLoadData = false; + }, 1000); + } + console.log('finish load region data'); + + /*var geocoder = new AMap.Geocoder(); + var provinceArr = self.reqParams.provinces.split(","); + var provicePoints = []; + var loadRegionNum = 0; + for (var i = 0; i < provinceArr.length; i++) { + geocoder.getLocation(provinceArr[i], function(status, result) { + loadRegionNum++; + if (status === 'complete' && result.geocodes.length) { + var lnglat = result.geocodes[0].location + provicePoints.push(lnglat); + } else { + console.log(result); + alert('暂无此区域边界数据!'); + } + if (loadRegionNum == provinceArr.length) { + + } + }); + }*/ + } else { + // 加载点地图 + console.log('start load point data'); + if (!self.isManulOperMap) { + + var pointViewPoints = self.getMapViewPoints(); + + var fitZoomAndCenter = self.baseMap.getFitZoomAndCenterByBounds(pointViewPoints, [10,10,10,10]); + + var zoom0 = self.pointConf.clusterMaxZoom || 12; + var zoom1 = fitZoomAndCenter[0] || self.reqParams.mapzoom; + + var fitCenter = fitZoomAndCenter[1] || self.getAreaCenter(pointViewPoints); + self.baseMap.setZoomAndCenter(zoom1, fitCenter, true, 0); + + //self.baseMap.setBounds(pointViewPoints, true, 0); + //var zoom1 = self.baseMap.getZoom(0); + //var zoom0 = self.pointConf.clusterMaxZoom || 12; + if ((zoom0 > zoom1 && zoom0 < self.reqParams.mapzoom) || (zoom0 < zoom1 && zoom0 > self.reqParams.mapzoom)) { + // 重新计算是否聚合 + self.reqParams.mapzoom = zoom1; + self.wrapData(); + } + + // 添加数据图层 + self.loadMapLayers(); + + FR.hideLoadingDialog(); + setTimeout(function(){ + self.notLoadData = false; + }, 5000); + + } else { + // 添加数据图层 + self.loadMapLayers(); + FR.hideLoadingDialog(); + setTimeout(function(){ + self.notLoadData = false; + }, 1000); + } + console.log('finish load point data'); + } + + // 圈选模式,加载详情 + self.isCircleMode && self.mapConf.showCircleDetail && self.initSelectedDataList(); + + }, + + clearMapLayer: function() { + console.log('clear map data!'); + var self = this; + // 清理图层 + //self.baseMap.clearMap(); + self.baseMap.remove(self.addedOverlays); + self.addedOverlays.map(function (e) { + if (e.setMap) { + e.setMap(null); + } + if (e.clear) { + e.clear(); + self.baseMap.removeLayer(e); + } + if (e.destroy) { + e.destroy(); + } + e = null; + }); + if (self.pointData.point && self.pointData.point.data) { + self.pointData.point.data.map(function(e){ + if (e.destroy) { + e.destroy(); + } + if (e.setMap) { + e.setMap(null); + } + e = null; + }); + self.pointData.point.data = null; + self.pointData.point = null; + } + + self.pointData = {}; + self.pointClusterData = {}; + self.heatData = {}; + + self.addedOverlays = []; + self.chartData = []; + + /* + var mapStyle = self.mapConf.mapStyle; + var mapzoom = self.baseMap.getZoom(2); + var centerx = self.baseMap.getCenter().lng; + var centery = self.baseMap.getCenter().lat; + self.baseMap.destroy(); + self.baseMap = null; + var mapcanvas = $(self._dom).find('canvas.amap-layer'); + if (mapcanvas && mapcanvas.length > 0) { + mapcanvas[0].getContext('webgl').getExtension('WEBGL_lose_context').loseContext() + } + + var map = new AMap.Map(self._dom, { + resizeEnable: true, + center: [centerx, centery], + zoom: mapzoom + }); + if (mapStyle && mapStyle.trim() && mapStyle.trim().length > 0) { + map.setMapStyle('amap://styles/' + mapStyle); + } + + self.baseMap = map; + + map.on('click', function (e) { + self.isManulOperMap = true; + }); + map.on('mousewheel', function (e) { + self.isManulOperMap = true; + //self.clearMapLayer(); + }); + map.on('dragstart', function (e) { + self.isManulOperMap = true; + //self.clearMapLayer(); + }); + + map.on('moveend', function (e) { + console.log(e); + + if (self.currLoadTime + && (new Date().getTime() - self.currLoadTime) > 1000 + && !self.notLoadData) { + setTimeout(function(){ + console.log('zoom start query!'); + self.reloadMapData(); + }, 100); + } + self.currLoadTime = new Date().getTime(); + }); + + //self.initTools(); + self.initCircleTool(); + */ + + }, + /*resetMaps: function () { + + var self = this; + + self.baseMap.remove(self.addedOverlays); + self.addedOverlays.map(function (e) { + if (e.setMap) { + e.setMap(null); + e = null; + } else if (e.clear) { + e.clear(); + self.baseMap.removeLayer(e); + } + + }); + self.addedOverlays = []; + self.wrapData(); + + var isLoadRegion = self.loadRegionFlag && self.reqParams.provinces && self.reqParams.provinces.length > 0; + + self.loadMapLayers(isLoadRegion); + + self.isCircleMode && self.mapConf.showCircleDetail && self.initSelectedDataList(); + + if (isLoadRegion) { + self.loadRegionFlag = false; + + var geocoder = new AMap.Geocoder(); + + var provinceArr = self.reqParams.provinces.split(","); + var provicePoints = []; + var loadRegionNum = 0; + for (var i = 0; i < provinceArr.length; i++) { + //provinceArr[i].replaceAll("'", "") + geocoder.getLocation(provinceArr[i], function(status, result) { + if (status === 'complete'&&result.geocodes.length) { + var lnglat = result.geocodes[0].location + var text = new AMap.Text({ + text:' ', + style:{ + 'border-width': 0, + 'background-color': 'rgba(0,0,0,0)' + }, + position: [lnglat.lng, lnglat.lat] + }); + + text.setMap(self.baseMap); + provicePoints.push(text); + loadRegionNum++; + if (!self.isManulOperMap && loadRegionNum == provinceArr.length) { + var zoom1 = self.baseMap.getZoom(0); + var zoom0 = (self.pointConf.clusterMaxZoom || 12); + self.baseMap.setFitView(provicePoints, true, [200,200,200,200], 7.5); + setTimeout(function(){ + var zoom2 = self.baseMap.getZoom(0); + if ((zoom0 < zoom1 && zoom0 > zoom2) || (zoom0 > zoom1 && zoom0 < zoom2)) { + self.resetMaps(); + } + }, 1000); + } + } + }); + } + + } + },*/ + + + initMaps: function () { + var self = this; + + var mapKey = "cdd06cfb8afcef04222b5621247106b2"; + var mapStyle = self.mapConf.mapStyle; + + self.reqParams.centerx = self.mapConf.centerx || 116.402921; + self.reqParams.centery = self.mapConf.centery || 39.907123; + self.reqParams.mapzoom = self.mapConf.mapzoom || 10; + + if (self.mapConf.mapKey && self.mapConf.mapKey.trim() && self.mapConf.mapKey.trim().length > 0) { + mapKey = self.mapConf.mapKey; + } + + var mapUrl = "https://webapi.amap.com/maps?v=2.0&key=" + mapKey + "&plugin=AMap.MarkerCluster,AMap.HeatMap,AMap.DistrictLayer,AMap.MouseTool,AMap.CircleEditor,AMap.Geocoder"; + + $.getScript(mapUrl, function () { + var map = new AMap.Map(self._dom, { + resizeEnable: true, + animateEnable: false, + jogEnable: false, + center: [self.reqParams.centerx, self.reqParams.centery], + zoom: self.reqParams.mapzoom + }); + if (mapStyle && mapStyle.trim() && mapStyle.trim().length > 0) { + map.setMapStyle('amap://styles/' + mapStyle); + } + + self.baseMap = map; + + map.on('click', function (e) { + self.isManulOperMap = true; + }); + map.on('mousewheel', function (e) { + self.isManulOperMap = true; + if (self.currLoadTime + && (new Date().getTime() - self.currLoadTime) > 1000 + && !self.notLoadData) { + self.clearMapLayer(); + } + }); + map.on('dragstart', function (e) { + self.isManulOperMap = true; + if (self.currLoadTime + && (new Date().getTime() - self.currLoadTime) > 1000 + && !self.notLoadData) { + self.clearMapLayer(); + } + }); + + /*self.mapMoveFunc = function(e){ + console.log(e); + if (self.currLoadTime + && (new Date().getTime() - self.currLoadTime) > 1000) { + self.reloadMapData(); + console.log(new Date().getTime() - self.currLoadTime); + } + self.currLoadTime = new Date().getTime(); + }; + map.on('moveend', self.mapMoveFunc);*/ + map.on('moveend', function (e) { + if (self.currLoadTime + && (new Date().getTime() - self.currLoadTime) > 1000 + && !self.notLoadData) { + console.log('moveend'); + setTimeout(function(){ + self.reqParams.mapzoom = self.baseMap.getZoom(0); + self.reloadMapData(); + }, 100); + + } + self.currLoadTime = new Date().getTime(); + }); + + + self.renderMapData(); + + self.initTools(); + self.initCircleTool(); + + }); + + + }, + + initCircleTool: function () { + var self = this; + //在地图中添加MouseTool插件 + self.mouseTool = new AMap.MouseTool(self.baseMap); + //添加事件 + AMap.Event.addListener(self.mouseTool, 'draw', function (e) { + if (e && e.obj) { + self.baseMap.setDefaultCursor("default"); + self.isManulOperMap = true; + self.drawCircle = e.obj; + self.mouseTool.close(); + self.circleEditor = new AMap.CircleEditor(self.baseMap, e.obj, { + editOptions: { + strokeColor: self.mapConf.circleBorderColor, + strokeWeight: self.mapConf.circleBorderWidth, + fillColor: self.mapConf.circleFillColor, + fillOpacity: (parseInt(self.mapConf.circleOpacity) || 0 ) / 100 + } + }); + self.circleEditor.open(); + + var min = e.obj.getBounds().southWest; + var max = e.obj.getBounds().northEast; + + self.reqParams.minx = min.lng; + self.reqParams.miny = min.lat; + self.reqParams.maxx = max.lng; + self.reqParams.maxy = max.lat; + + self.reqParams.centerx = e.obj.getCenter().lng; + self.reqParams.centery = e.obj.getCenter().lat; + self.reqParams.radius = e.obj.getRadius(); + + self.isCircleMode = true; + + self.reloadMapData(); + + self.circleEditor.on('adjust', function (e2) { + var min = e2.target.getBounds().southWest; + var max = e2.target.getBounds().northEast; + + self.reqParams.minx = min.lng; + self.reqParams.miny = min.lat; + self.reqParams.maxx = max.lng; + self.reqParams.maxy = max.lat; + + self.reqParams.centerx = e2.target.getCenter().lng; + self.reqParams.centery = e2.target.getCenter().lat; + self.reqParams.radius = e2.target.getRadius(); + + self.isCircleMode = true; + self.isManulOperMap = true; + + self.reloadMapData(); + }); + self.circleEditor.on('move', function (e2) { + var min = e2.target.getBounds().southWest; + var max = e2.target.getBounds().northEast; + + self.reqParams.minx = min.lng; + self.reqParams.miny = min.lat; + self.reqParams.maxx = max.lng; + self.reqParams.maxy = max.lat; + + self.reqParams.centerx = e2.target.getCenter().lng; + self.reqParams.centery = e2.target.getCenter().lat; + self.reqParams.radius = e2.target.getRadius(); + + self.isCircleMode = true; + self.isManulOperMap = true; + + self.reloadMapData(); + }); + } + + }); + + if (self.drawCircle) { + self.baseMap.add(self.drawCircle); + self.mouseTool.close(); + self.circleEditor = new AMap.CircleEditor(self.baseMap, self.drawCircle, { + editOptions: { + strokeColor: '#ff0000', + strokeWeight: 2, + fillColor: '#ff0000', + fillOpacity: 0.3 + } + }); + self.circleEditor.open(); + self.isManulOperMap = false; + self.isCircleMode = true; + + self.circleEditor.on('adjust', function (e2) { + var min = e2.target.getBounds().southWest; + var max = e2.target.getBounds().northEast; + self.reqParams.minx = min.lng; + self.reqParams.miny = min.lat; + self.reqParams.maxx = max.lng; + self.reqParams.maxy = max.lat; + + self.reqParams.centerx = e2.target.getCenter().lng; + self.reqParams.centery = e2.target.getCenter().lat; + self.reqParams.radius = e2.target.getRadius(); + + self.isManulOperMap = false; + self.isCircleMode = true; + self.reloadMapData(); + }); + self.circleEditor.on('move', function (e2) { + var min = e2.target.getBounds().southWest; + var max = e2.target.getBounds().northEast; + self.reqParamsOld = self.reqParams; + self.reqParams.minx = min.lng; + self.reqParams.miny = min.lat; + self.reqParams.maxx = max.lng; + self.reqParams.maxy = max.lat; + + self.reqParams.centerx = e2.target.getCenter().lng; + self.reqParams.centery = e2.target.getCenter().lat; + self.reqParams.radius = e2.target.getRadius(); + + self.isManulOperMap = false; + self.isCircleMode = true; + self.reloadMapData(); + }); + } + }, + + loadRegionBorder: function (adcodes) { + if (!adcodes || adcodes.length <= 0) { + return; + } + var self = this; + + self.disProvince && self.disProvince.setMap(null); + + //var regionStyle = self.getGovRegionStyle(); + self.disProvince = new AMap.DistrictLayer.Province({ + zIndex: 10, + adcode: adcodes.split(","), + depth: 2, + styles: { + 'stroke-width': self.mapConf.regionBorderWidth, + 'fill': function (properties) { + var styleAttr = { + lineWidth: 2, + lineColor: 'rgba(0,0,0,1)', + fillColor: 'rgba(255,255,255)', + fillOpacity: 0, + }; + return self.hexToRgba(styleAttr.fillColor, styleAttr.fillOpacity).rgba; + }, + 'province-stroke': function (properties) { + //return self.getGovRegionStyle(properties.NAME_CHN).lineColor; + return self.mapConf.regionBorderColor; //'rgba(0,0,0,1)'; + }, + 'city-stroke': function (properties) { + //return self.getGovRegionStyle(properties.NAME_CHN).lineColor; + return self.mapConf.areaBorderColor; //'rgba(0,0,0,1)'; + }, // 中国地级市边界 + 'county-stroke': function (properties) { + //'rgba(255,255,255,0.5)' // 中国区县边界 + //return self.getGovRegionStyle(properties.NAME_CHN).lineColor; + return self.mapConf.countryBorderColor; //'rgba(0,0,0,1)'; + } + } + }); + + self.disProvince.setMap(self.baseMap); + + }, + + getGovRegionStyle: function (region) { + var self = this; + var iconAttr = {}; + var isSetStyle = false; + for (var i = 0; i < self.iconConf.length; i++) { + if (region == self.iconConf[i].titleName) { + iconAttr = self.iconConf[i]; + isSetStyle = true; + break; + } + } + if (isSetStyle) { + return iconAttr; + } else { + var gb = Math.random() * 155 + 50; + var randomColor = 'rgba(' + gb + ',' + gb + ',255,0.8)'; + return { + lineWidth: 0, + lineColor: 'rgba(255,255,255,0)', + fillColor: randomColor, + fillOpacity: 0, + }; + } + + }, + + calImgSize: function (imgw, imgh, size) { + if (size && size > 0) { + if (imgw > imgh) { + imgh = size * imgh / imgw; + imgw = size; + } else { + imgw = size * imgw / imgh; + imgh = size; + } + } + return { + imgw: imgw, + imgh: imgh + }; + }, + _customDoLink: function (params) { + params.linkKey = params.linkKey || 'pointLink'; + var hyperLink = this.pointLink; + if (params && hyperLink && hyperLink.parasMap) { + params.chartIndex = this.chartIndex || 0; + this._doLinkWithFilter(params, hyperLink); + } + }, + + + loadMapLayers: function () { + var self = this; + + if (!self.chartData || self.chartData.length <= 0) { + return; + } + + // 热力样式 + var heatColors = self.heatConf.intervalColors || '#0000ff|#75d3f8|#00ff00|#ffea00|#ff0000'; + var heatPos = self.heatConf.intervalPos || '0.5|0.65|0.7|0.9|1.0'; + var heatColorArr = heatColors.split("|"); + var heatPosArr = heatPos.split("|"); + var gradientStyle = {}; + for (var i = 0; i < heatPosArr.length; i++) { + gradientStyle[heatPosArr[i]] = heatColorArr[i]; + } + + var _renderClusterMarker = function (context) { + + var pItem = { + layertype: '', + datatype: '', + val: context.count + }; + var clusterCondStyle = self.findMarkerCond(pItem, "clusterpointmap"); + var fillColor = clusterCondStyle.clusterFillColor || self.pointConf.clusterFillColor; + var bgOpacity = clusterCondStyle.clusterBgOpacity || self.pointConf.clusterBgOpacity; + var pointSize = clusterCondStyle.clusterPointSize || self.pointConf.clusterPointSize; + var borderColor = clusterCondStyle.clusterBorderColor || self.pointConf.clusterBorderColor; + var textColor = clusterCondStyle.clusterTextColor || self.pointConf.clusterTextColor; + var div = document.createElement('div'); + div.style.backgroundColor = self.hexToRgba(fillColor, bgOpacity).rgba; + var size = pointSize || 64; + div.style.width = div.style.height = size + 'px'; + div.style.border = 'solid 1px ' + borderColor; + div.style.borderRadius = size / 2 + 'px'; + div.innerHTML = context.count; + div.style.lineHeight = size + 'px'; + div.style.color = textColor; + div.style.fontSize = '14px'; + div.style.textAlign = 'center'; + context.marker.setOffset(new AMap.Pixel(-size / 2, -size / 2)); + context.marker.setContent(div); + }; + + // 加载点聚合插件 + //self.baseMap.plugin(["AMap.MarkerCluster", "AMap.HeatMap"], function () { + + // 加载地图数据 + for (var k in self.pointData) { + var markerLayer = new AMap.LabelsLayer({ + visible: true, + zooms: [2, 20], + zIndex: 1000, + collision: false + }); + + self.baseMap.add(markerLayer); + self.addedOverlays.push(markerLayer); + + markerLayer.add(self.pointData[k].data); + + } + // 加载点聚合地图 + for (var k in self.pointClusterData) { + var cluster = new AMap.MarkerCluster(self.baseMap, self.pointClusterData[k].data, { + gridSize: 80, + maxZoom: self.pointConf.clusterMaxZoom || 13, + //styles: clusterMarkerStyles, + renderClusterMarker: _renderClusterMarker, + renderMarker: _renderClusterMarker + }); + self.addedOverlays.push(cluster); + } + + // 加载热力图 + for (var k in self.heatData) { + var heatmap = new AMap.HeatMap(self.baseMap, { + radius: self.heatConf.radius || 30, //给定半径 + opacity: [0.1, self.heatConf.bgOpacity == 0 ? 0 : (self.heatConf.bgOpacity || 100) / 100], + gradient: gradientStyle + }); + //设置数据集:该数据为北京部分“公园”数据 + heatmap.setDataSet({ + data: self.heatData[k].data, + max: self.heatConf.maxValue || 100 + }); + + self.addedOverlays.push(heatmap); + } + + /*if (!noFit) { + self.fitPointsView(); + }*/ + + //self.baseMap.setFitView(self.addedOverlays, true, [200,200,200,200], 12); + //}); + + }, + + getMapViewPoints: function() { + var self = this; + var roundLngLats = [ + {lng: this.maxDataRounds.minx, lat: this.maxDataRounds.maxy}, + {lng: this.maxDataRounds.minx, lat: this.maxDataRounds.miny}, + {lng: this.maxDataRounds.maxx, lat: this.maxDataRounds.maxy}, + {lng: this.maxDataRounds.maxx, lat: this.maxDataRounds.miny} + ]; + return new AMap.Bounds(new AMap.LngLat(this.maxDataRounds.minx, this.maxDataRounds.miny), + new AMap.LngLat(this.maxDataRounds.maxx, this.maxDataRounds.maxy)); + //return self.getAreaCenter(roundLngLats); + + /*var roundPoints = []; + for (var i = 0; i < 4; i++) { + var text = new AMap.Text({ + text:' ', + style:{ + 'border-width': 0, + 'background-color': 'rgba(0,0,0,0)' + }, + position: roundLngLats[i] + }); + text.setMap(this.baseMap); + roundPoints.push(text); + self.addedOverlays.push(text); + } + return roundPoints;*/ + }, + + /*fitPointsView: function() { + var self = this; + var roundLngLats = [ + [this.maxDataRounds.minx, this.maxDataRounds.maxy], + [this.maxDataRounds.minx, this.maxDataRounds.miny], + [this.maxDataRounds.maxx, this.maxDataRounds.maxy], + [this.maxDataRounds.maxx, this.maxDataRounds.miny] + ]; + var roundPoints = []; + for (var i = 0; i < 4; i++) { + var text = new AMap.Text({ + text:' ', + style:{ + 'border-width': 0, + 'background-color': 'rgba(0,0,0,0)' + }, + position: roundLngLats[i] + }); + text.setMap(this.baseMap); + roundPoints.push(text); + } + + if (!this.isManulOperMap) { + self.baseMap.on('moveend', function (e){}); + self.baseMap.setFitView(roundPoints, true, [100,100,100,100], 15); + setTimeout(function(){ + self.baseMap.on('moveend', self.initZoomFunc()); + }, 2000); + } + },*/ + + wrapData: function () { + console.log('start wrap data!'); + var self = this; + this.pointClusterData = {}; + this.heatData = {}; + this.pointData = {}; + if (!this.chartData || this.chartData.length <= 0) { + return; + } + this.maxDataRounds = { + minx: this.chartData[0].lng, + maxx: this.chartData[0].lng, + miny: this.chartData[0].lat, + maxy: this.chartData[0].lat + }; + var isFirst = false; + if (!this.toolsData) { + this.toolsData = []; + isFirst = true; + } + var currZoom = self.reqParams.mapzoom; + console.log('zoom:' + currZoom); + + this.chartData.map(function (item) { + if (isFirst) { + var tmpLayerObj = self.toolsData.find(function (e1) { + return e1.name == item.layertype; + }); + if (!tmpLayerObj) { + tmpLayerObj = { + name: item.layertype, + data: [item.datatype] + } + self.toolsData.push(tmpLayerObj); + } else { + var tmpDataObj = tmpLayerObj.data.find(function (e2) { + return e2 == item.datatype; + }); + if (!tmpDataObj) { + tmpLayerObj.data.push(item.datatype); + } + } + } + if (parseFloat(item.lng) < parseFloat(self.maxDataRounds.minx)) { + self.maxDataRounds.minx = item.lng; + } + if (parseFloat(item.lng) > parseFloat(self.maxDataRounds.maxx)) { + self.maxDataRounds.maxx = item.lng; + } + if (parseFloat(item.lat) < parseFloat(self.maxDataRounds.miny)) { + self.maxDataRounds.miny = item.lat; + } + if (parseFloat(item.lat) > parseFloat(self.maxDataRounds.maxy)) { + self.maxDataRounds.maxy = item.lat; + } + + if (self.chartTypeConf[item.layertype] == "热力") { + //if (!self.heatData[item.layertype] || !self.heatData[item.layertype].data) { + if (!self.heatData.heat || !self.heatData.heat.data) { + self.heatData.heat = { + name: item.layertype, + data: [] + }; + } + self.heatData.heat.data.push({ + lng: item.lng, + lat: item.lat, + count: parseInt(item.val) || 1 + }); + } else { + // 点地图数据 + if (currZoom >= (self.pointConf.clusterMaxZoom || 12) || self.isCircleMode) { + //if (!self.pointData[item.layertype] || !self.pointData[item.layertype].data) { + if (!self.pointData.point || !self.pointData.point.data) { + self.pointData.point = { + name: item.layertype, + data: [] + }; + } + self.pointData.point.data.push(self.getOneMarker(item)); + } else { + //if (!self.pointClusterData[item.layertype] || !self.pointClusterData[item.layertype].data) { + if (!self.pointClusterData.pointcluster || !self.pointClusterData.pointcluster.data) { + self.pointClusterData.pointcluster = { + name: item.layertype, + data: [] + }; + } + self.pointClusterData.pointcluster.data.push({ + weight: parseInt(item.val) || 1, + lnglat: [item.lng, item.lat] + }); + } + + } + + }); + + console.log('finish wrap data ' + this.chartData.length); + }, + + getOneMarker: function (item) { + var self = this; + var defIcon = 'iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAD60lEQVR4nO1YMWgUQRTd4mb2orYiJpnZw84gaGEhImIhCJJC0gixEQVJmiAowcJCECSdSRrRoGIhGAVNYWEhpEiCAdOI3u1tjhAbG1OoIMTu/D+5O3f3Ljszyc3MBefBh2V3/p/3/v75M7ue5+Dg4ODg4GAKqwUvX+G0b5n7/WAjNevHe/jMNj8tiHjuVMTprTL358ucVrPNn8ex6GOb946xHNABELUgFr2lLWAM2zqUEfWQoyGjz3cgPGEYC2Pa1iWFckAvlRn53i7xDcOYENu2vkxEgX+j7cJThnPY1tkSEaMXdYtvJAHmsq03AezYpsQ3ktApu0SJ0SOwba2YTwBdwblt6/e22e3XoYw/wJ7/AG3zmq6rxsG5rYqv7fMKpMn7MMidbHXiw3v4DMeoxLR6TigrHXLIhHxcMqGQhAWdGrfEMs+flSW5cijPVeOjj3QVABcdGjMBE4/JkCux3Om0b8jJNXi2BPYLmtmXkNO3rbY29JVMwpgZ1THUBIjKfjzuA+v1MNx/l+HzEb8Kk/OQcYkELBkVjw1LgtTvz91drO4DJ7jzcO+nyA8rIp4EjIGxRH5GP6WRoFBIQBfjPiDsqUJje5HwhVgin3TlaAX+wBCKYPRxfXxYyBcUxKP9KfZ5tO6PsUQ+yMlkAkbECSDDjQT05s4oJqCKPv8SQIYlEjBiLAFAaEgoIPZGdpqAUKriyJCxBGye2ASEAnq7Pl6mZ2RWAMQSjgdOxhJQ3O/tkxDxKu6D3V0hAd/ivhhL5IOcjCVggxQjs1mEQHAlKYLcl377nN6J+2IsQfnPGhWPKHH/ungZkCtxH7j3UmLpPEn4QAyRD3Ixqx5QLJBjqqWMiLj/cIuxP+DN30uPxxjC8gcuZlQ3k5sRkcMDUNrva7DnIJZ53UqMXvh0wNubHid5eJoxo7YFQuafk1nTpYBcVY2NPlL9Ajjo0CYNIDEt1dygUclsVRtbrKDBxmzahMZswqqHnIC+gaPt3TCgA1FvVw8aXuO9jWcKseJnBauAtfpMKQltMJzTtu4GKgVywnQCcE7buhOA8/ojU+JxLtt6m1D75F01kIBVnMu23pYIGbms/e3DHLZ1ZkLxz49q42s6VHUcNC6Fzi39NHQshY4v/TTauRR2RemngeUq/I6XE1/ZNaWfhtS/PFHpm/zbqwNh4N/ctnjwtc2/LYi4P6Ve+v6Ubd5tw+ZPVH9OPgH+nPGfnLoB3/jHQdiahPg1HGubrxbAd/+geN3TQds8tQJEjmYkYNQ2PyOIOJlsbnpk0jYvo4gYfd0QD9e2+RhH1fNyIaOLaHhtm48VFLvzHM02DwcHBwcHh/8UfwE/2Xk+00CsAAAAAABJRU5ErkJggg=='; + var size = self.pointConf.pointSize || 32; + + var tipContent = ''; + if (!self.labelConf.showPointLabel) { + tipContent = ''; + } else if (self.labelConf.labelType == "1") { + if (self.labelConf.showLayerType) tipContent += ' | ' + item.layertype; + if (self.labelConf.showDataType) tipContent += ' | ' + item.datatype; + if (self.labelConf.showName) tipContent += ' | ' + item.name; + if (self.labelConf.showLng) tipContent += ' | ' + item.lng; + if (self.labelConf.showLat) tipContent += ' | ' + item.lat; + if (self.labelConf.showDesc) tipContent += ' | ' + item.desc; + if (tipContent.length > 3) tipContent = tipContent.substring(2, tipContent.length); + } else if (self.labelConf.labelType == "2") { + var tipFunc = new Function(self.labelConf.labelJsPane); + tipContent = tipFunc.call(item) || ''; + } + + var textStyle = { + fontSize: self.labelConf.labelsize, + fontWeight: self.getFontWeight(self.labelConf.labelstyle), + fontStyle: self.getFontStyle(self.labelConf.labelstyle), + fillColor: self.labelConf.labelcolor, + //borderColor: '#ff0000', + //borderWidth: 1, + fold: false, + padding: [2,5,2,5], + backgroundColor: self.labelConf.labelBgColor || '#fff' + }; + var markerCondStyle = self.findMarkerCond(item, "pointmap"); + size = markerCondStyle.pointSize || size; + var labelConf = { + //name: '自提点1', + //position: [113.675, 34.563], + zooms: [2, 20], + opacity: 1, + zIndex: 100, + fold: true, + offset: [-size / 2, -size], + icon: { + image: "data:image/png;base64," + (markerCondStyle.pointimg || self.pointConf.pointimg || defIcon), + size: [size, size] + } + , + text: { + content: tipContent, + direction: 'right', + offset: [0, 0], + style: textStyle + } + }; + + var markerConf = $.extend({}, labelConf, {position: [item.lng, item.lat]}); + + var marker = new AMap.LabelMarker(markerConf); + + if (self.tipsConf.showPointTips) { + marker.on('mouseover', function(ev){ + var tmpDom = $(self._dom).parent().find('div.LzljAMap_custom_tips'); + var tipHtmls = '
'; + if (self.tipsConf.showLayerType) { + tipHtmls += '分类:' + item.layertype + '
'; + } + if (self.tipsConf.showDataType) { + tipHtmls += '类型:' + item.datatype + '
'; + } + if (self.tipsConf.showName) { + tipHtmls += '名称:' + item.name + '
'; + } + if (self.tipsConf.showLng) { + tipHtmls += '经度:' + item.lng + '
'; + } + if (self.tipsConf.showLat) { + tipHtmls += '纬度:' + item.lat + '
'; + } + if (self.tipsConf.showDesc) { + tipHtmls += '描述:' + item.desc + '
'; + } + tipHtmls += '
'; + tmpDom.html(tipHtmls); + tmpDom.css({ + "left": (ev.pixel.x + 10) + "px", + "top": (ev.pixel.y + 10) + "px" + }); + tmpDom.show(); + + }); + marker.on('mouseout', function(ev){ + var tmpDom = $(self._dom).parent().find('div.LzljAMap_custom_tips'); + tmpDom.hide(); + }); + marker.on('click', function(ev){ + item.event = {clientX: ev.pixel.x, clientY: ev.pixel.y}; + self._customDoLink(item); + }); + } + + return marker; + }, + + findMarkerCond: function(item, title) { + if (!item || !title) { + return {}; + } + if (this.pointStyleCond && this.pointStyleCond.length > 0) { + try { + for (var i = 0; i < this.pointStyleCond.length; i++) { + if (this.pointStyleCond[i].title == title) { + var cond = this.pointStyleCond[i].condition; + cond = cond.replace(/\{数据分类\}/g, item.layertype); + cond = cond.replace(/\{数据类型\}/g, item.datatype); + cond = cond.replace(/\{数值\}/g, (item.val||0)); + cond = cond.replace(/\{聚合数量\}/g, item.val); + if (eval(cond)) { + return this.pointStyleCond[i]; + } + } + } + } catch (e) { + console.log('条件属性配置错误!请检查条件'); + return {}; + } + } + return {}; + }, + findLegendCond: function(item, title) { + if (!item || !title) { + return {}; + } + if (this.pointStyleCond && this.pointStyleCond.length > 0) { + try { + for (var i = 0; i < this.pointStyleCond.length; i++) { + if (this.pointStyleCond[i].title == title) { + var cond = this.pointStyleCond[i].condition; + + var valIdx = cond.indexOf("数值"); + if (valIdx > 0) { + var start = 0; + var end = cond.length; + if (cond.substr(valIdx - 4, 2) == '&&') { + start = valIdx - 4; + } + if (cond.indexOf("&&", valIdx) > 0) { + end = cond.indexOf("&&", valIdx); + } + cond = cond.substr(0, start) + cond.substr(end, cond.length); + } + cond = cond.replace(/\{数据分类\}/g, item.layertype); + cond = cond.replace(/\{数据类型\}/g, item.datatype); + if (eval(cond)) { + return this.pointStyleCond[i]; + } + } + } + } catch (e) { + console.log('条件属性配置错误!请检查条件'); + return {}; + } + } + return {}; + }, + + initRegionData: function (tree) { + tree.InitChinaRegions(); + tree.Show(); + tree.FullCollapse(); + }, + + coordsConvert: function (LngLatArray, item) { + var self = this; + var LngLatArray2 = []; + var size = 40; + var pageNum = parseInt((LngLatArray.length + size - 1) / size); + var convertNum = 0; + + var convert = function (LngLatArraySlice, n) { + AMap.convertFrom(LngLatArraySlice, 'gps', function (status, result) { + if (result.info === 'ok') { + LngLatArray2[n] = (result.locations); + convertNum++; + if (convertNum >= pageNum) { + self.loadIcon(item, [].concat.apply([], LngLatArray2)); + } + } + }); + }; + for (var i = 0; i < pageNum; i++) { + var LngLatArraySlice = LngLatArray.slice(i * size, (i + 1) * size); + convert(LngLatArraySlice, i); + } + }, + + lnglatToArr: function (fromStr) { + var retArr = []; + if (fromStr) { + var lnglatArr = fromStr.split(","); + for (var i = 0; i < lnglatArr.length; i++) { + retArr.push(lnglatArr[i].trim().split(" ")); + } + } + return retArr; + }, + getAreaCenter: function (coords) { + var total = coords.length; + var X = 0, Y = 0, Z = 0; + for (var i = 0; i < coords.length; i++) { + var lnglat = coords[i]; + var lng = (lnglat.lng * Math.PI) / 180; + var lat = (lnglat.lat * Math.PI) / 180; + var x, y, z; + x = Math.cos(lat) * Math.cos(lng); + y = Math.cos(lat) * Math.sin(lng); + z = Math.sin(lat); + X += x; + Y += y; + Z += z; + } + + X = X / total; + Y = Y / total; + Z = Z / total; + + var Lng = Math.atan2(Y, X); + var Hyp = Math.sqrt(X * X + Y * Y); + var Lat = Math.atan2(Z, Hyp); + return [ + parseFloat((Lng * 180) / Math.PI), + parseFloat((Lat * 180) / Math.PI) + ]; + }, + calTextWidth: function (str, fontSize) { + var fontSize = fontSize || 12; + var strHtml = $('') + .attr("id", "temp_cal_text_font_size") + .css({ + "display": "none", + "font-size": fontSize + "px", + "font-family": "Microsoft YaHei" + }).html(str); + $(document.body).append(strHtml); + var width = $('#temp_cal_text_font_size').width(); + var height = $('#temp_cal_text_font_size').height(); + $('#temp_cal_text_font_size').remove(); + return [width, height]; + }, + hexToRgba: function (hex, al) { + var hexColor = /^#/.test(hex) ? hex.slice(1) : hex, + alp = hex === 'transparent' ? 0 : Math.ceil(al), + r, g, b; + hexColor = /^[0-9a-f]{3}|[0-9a-f]{6}$/i.test(hexColor) ? hexColor : 'fffff'; + if (hexColor.length === 3) { + hexColor = hexColor.replace(/(\w)(\w)(\w)/gi, '$1$1$2$2$3$3'); + } + r = hexColor.slice(0, 2); + g = hexColor.slice(2, 4); + b = hexColor.slice(4, 6); + r = parseInt(r, 16); + g = parseInt(g, 16); + b = parseInt(b, 16); + return { + hex: '#' + hexColor, + alpha: alp, + rgba: 'rgba(' + r + ', ' + g + ', ' + b + ', ' + (alp / 100).toFixed(2) + ')' + }; + }, + isNullStr: function (val, def) { + if (typeof(val) == undefined || "" == val || null == val || val.length <= 0) { + if (typeof(def) == undefined || "" == def || null == def || def.length <= 0) { + return ""; + } + return def; + } + if (val.trim) { + return val.trim(); + } + return val; + }, + isNullInt: function (val, def) { + if (typeof(val) == undefined || "" == val || null == val || val.length <= 0) { + if (typeof(def) == undefined || "" == def || null == def || def.length <= 0) { + return 0; + } + return parseInt(def); + } + return parseInt(val); + }, + isNullBoolean: function (val, def) { + if (typeof(val) == undefined || "" == val || null == val) { + if (typeof(def) == undefined || "" == def || null == def) { + return false; + } + return def; + } + return val; + }, + getAlign: function (align) { + if ("2" == align) { + return "left"; + } else if ("0" == align) { + return "center"; + } else if ("4" == align) { + return "right"; + } + }, + getFontStyle: function (style) { + if ("2" == style || "3" == style) { + return "italic"; + } else { + return "normal"; + } + }, + getFontWeight: function (style) { + if ("1" == style || "3" == style) { + return "bold"; + } else { + return "normal"; + } + } + +}); \ No newline at end of file diff --git a/src/com/fr/plugin/lzljgdmap/web/jstree.js b/src/com/fr/plugin/lzljgdmap/web/jstree.js new file mode 100644 index 0000000..a9e38a5 --- /dev/null +++ b/src/com/fr/plugin/lzljgdmap/web/jstree.js @@ -0,0 +1,3689 @@ +var TREENODE_LEVEL_WIDTH = 20; + +function MyTreeNode(nodeId, nodePId, nodeTxt, nodeUrl, nodeTarget, nodeImg) { + this.NodeType = 1; + this.NodeId = nodeId; + this.NodePId = nodePId; + this.NodeTxt = nodeTxt; + this.NodeUrl = nodeUrl; + this.NodeTarget = nodeTarget; + this.NodeImg = null; //(nodeImg.length > 0) ? (WEBURL+ nodeImg) : ""; + + this.NodeLevel = 0; + this.HasChildren = false; + this.NodeExpanded = false; + this.NodeChecked = 0; //0=false,1=true,2=part + + //HTML + this.DIV_NodeBar = document.createElement("DIV"); + this.DIV_NodeBar.className = "nodeBar"; + + this.DIV_NodeLevel = document.createElement("DIV"); + this.DIV_NodeLevel.className = "nodeLevel"; + + this.DIV_NodeFlag = document.createElement("DIV"); + this.DIV_NodeFlag.className = "nodeFlag"; + this.DIV_NodeFlag.id = "nf" + this.NodeId; + + this.DIV_NodeImg = document.createElement("DIV"); + this.DIV_NodeImg.className = "nodeImg"; + if ((this.NodeImg != null) && (this.NodeImg.length > 0)) { + var img = document.createElement("IMG"); + img.src = this.NodeImg; + img.style.width = "16px"; + img.style.height = "16px"; + this.DIV_NodeImg.appendChild(img); + } + + //checkbox + this.DIV_Checkbox = document.createElement("DIV"); + + //text + this.DIV_NodeTxT = document.createElement("DIV"); + this.DIV_NodeTxT.className = "nodeTxt"; + if ((this.NodeUrl == null) || (this.NodeUrl.length < 1)) { + this.DIV_NodeTxT.appendChild(document.createTextNode(this.NodeTxt)); + } else { + var A = document.createElement("A"); + A.target = this.NodeTarget; + A.href = this.NodeUrl; + A.onfocus = function () { + this.blur(); + } + A.appendChild(document.createTextNode(this.NodeTxt)); + this.DIV_NodeTxT.appendChild(A); + } + + //-------------------- + this.DIV_NodeBar.appendChild(this.DIV_NodeLevel); + this.DIV_NodeBar.appendChild(this.DIV_NodeFlag); + //this.DIV_NodeBar.appendChild(this.DIV_NodeImg); + this.DIV_NodeBar.appendChild(this.DIV_Checkbox); + this.DIV_NodeBar.appendChild(this.DIV_NodeTxT); +} + +function MyTree(treeId) { + this.TreeBar = document.getElementById(treeId); + if (this.TreeBar == null) { + this.TreeBar = document.createElement("DIV"); + document.documentElement.appendChild(this.TreeBar); + } + + this.TreeBar.className = "treebar"; + + this.IsCheckbox = (arguments.length > 1) ? arguments[1] : false; + this.NodePId = (arguments.length > 2) ? arguments[2] : 0; + this.Nodes = new Array(); + this.Created = false; + this.SelectedNode = null; + + return this; +} + +MyTree.prototype.Add = function (nodeId, nodePId, nodeTxt, nodeUrl, nodeTarget, nodeImg) { + var node = new MyTreeNode(nodeId, nodePId, nodeTxt, nodeUrl, nodeTarget, nodeImg); + this.Nodes.push(node); + + var tree = this; + node.DIV_NodeBar.onmouseover = function () { + if (tree.SelectedNode == this) return false; + this.className = "nodeBarOver"; + } + node.DIV_NodeBar.onmouseout = function () { + if (tree.SelectedNode == this) return false; + this.className = "nodeBar"; + } + node.DIV_NodeBar.onclick = function () { + if (tree.SelectedNode == this) return true; + this.className = "nodeBarSelected"; + if (tree.SelectedNode != null) tree.SelectedNode.className = "nodeBar"; + tree.SelectedNode = this; + } + + this.Created = false; +} + +MyTree.prototype.AddSplitor = function (nodeId, nodePId) { + var node = new Object(); + this.Nodes.push(node); + + node.NodeId = nodeId; + node.NodePId = nodePId; + node.NodeLevel = 0; + node.NodeType = 2; + + //HTML + node.DIV_NodeBar = document.createElement("DIV"); + node.DIV_NodeBar.className = "nodeSplitor"; + + this.Created = false; +} + + +MyTree.prototype.ShowChildren = function (prtNode) { + var node = null; + for (var i = 0; i < this.Nodes.length; i++) { + node = this.Nodes[i]; + if (node.NodePId == prtNode.NodeId) { + node.DIV_NodeBar.style.display = "block"; + node.NodeExpanded = false; + if (node.HasChildren) this.SetNodeFlagStyle(node); + //this.ShowChildren(node); // + } + } +} + +MyTree.prototype.HideChildren = function (prtNode) { + var node = null; + for (var i = 0; i < this.Nodes.length; i++) { + node = this.Nodes[i]; + if (node.NodePId == prtNode.NodeId) { + node.DIV_NodeBar.style.display = "none"; + node.NodeExpanded = false; + if (node.HasChildren) { + this.SetNodeFlagStyle(node); + this.HideChildren(node); // + } + } + } +} + +MyTree.prototype.SetNodeFlagStyle = function (node) { + //MyDebug_WriteLn(node.NodeTxt + " " + node.NodeExpanded); + if (node.NodeExpanded == true) { + node.DIV_NodeFlag.className = "nodeSub"; + } + else { + node.DIV_NodeFlag.className = "nodePlus"; + } +} + +MyTree.prototype.SetCheckbox = function (node) { + switch (node.NodeChecked) { + case 0: + node.DIV_Checkbox.className = "nodeCheck"; + break; + case 1: + node.DIV_Checkbox.className = "nodeChecked"; + break; + case 2: + node.DIV_Checkbox.className = "nodeChecked_part"; + break; + } +} + +MyTree.prototype.ChildrenIsChecked = function (prtNode, nd) { + var node = null; + for (var i = 0; i < this.Nodes.length; i++) { + node = this.Nodes[i]; + if ((node.NodeId != nd.NodeId) && (node.NodePId == prtNode.NodeId)) { + //MyDebug_WriteLn("Node="+ node.NodeTxt + ", Checked=" + node.NodeChecked); + if (node.NodeChecked != 1) return false; + this.ChildrenIsChecked(node, prtNode); + } + } + return true; +} + +MyTree.prototype.SetChildrenCheckbox = function (prtNode) { + var node = null; + for (var i = 0; i < this.Nodes.length; i++) { + node = this.Nodes[i]; + if (node.NodePId == prtNode.NodeId) { + node.NodeChecked = prtNode.NodeChecked; + this.SetCheckbox(node); + this.SetChildrenCheckbox(node); + } + } +} + +MyTree.prototype.SetParentCheckbox = function (node) { + var prtNode = null; + var nodeChecked = false; + + //MyDebug_WriteLn("NodeChecked = " + node.NodeChecked); + + for (var i = 0; i < this.Nodes.length; i++) { + prtNode = this.Nodes[i]; + if (prtNode.NodeId == node.NodePId) { + nodeChecked = this.ChildrenIsChecked(prtNode, node); + + //MyDebug_WriteLn("ChildrenIsChecked = " + nodeChecked + " ParentChecked = " + prtNode.NodeChecked); + if (nodeChecked) { + prtNode.NodeChecked = (node.NodeChecked == 1) ? 1 : 2; + } else { + prtNode.NodeChecked = (node.NodeChecked == 1) ? 2 : node.NodeChecked; + } + this.SetCheckbox(prtNode); + this.SetParentCheckbox(prtNode); + } + } +} + +MyTree.prototype.SetNodeStyle = function (node) { + //MyDebug_WriteLn(node.NodeTxt + " = " + node.HasChildren); + + if (node.NodeType != 1) return; + + node.DIV_NodeBar.className = "nodeBar"; + node.DIV_NodeBar.style.display = "block"; + node.DIV_NodeFlag.className = "nodeSub"; + node.NodeExpanded = true; + + var tree = this; + if (node.HasChildren == true) { + node.DIV_NodeFlag.onclick = function () { + node.NodeExpanded = !node.NodeExpanded; + tree.SetNodeFlagStyle(node); + if (node.NodeExpanded) { + tree.ShowChildren(node); + } else { + tree.HideChildren(node); + } + } + } + else { + node.DIV_NodeFlag.className = "nodeFlag"; + } + + //是CHECKBOX + if (this.IsCheckbox) { + node.DIV_Checkbox.className = "nodeCheck"; + node.DIV_Checkbox.style.display = "block"; + node.DIV_Checkbox.onclick = function () { + node.NodeChecked = (node.NodeChecked == 0) ? 1 : 0; + tree.CheckedValues = ""; + tree.SetCheckbox(node); + tree.SetChildrenCheckbox(node); + tree.SetParentCheckbox(node); + } + } else { + node.DIV_Checkbox.style.display = "none"; + } +} + +MyTree.prototype.AddChildren = function (nodePId, nPrtLevel) { + var node = null; + var nChildNum = 0; + for (var i = 0; i < this.Nodes.length; i++) { + node = this.Nodes[i]; + if (node.NodePId == nodePId) { + if (node.NodeType == 1) { + node.NodeLevel = nPrtLevel + 1; + node.DIV_NodeLevel.style.width = (node.NodeLevel * TREENODE_LEVEL_WIDTH) + "px"; + } + this.TreeBar.appendChild(node.DIV_NodeBar); + + nChildNum++; + node.HasChildren = this.AddChildren(node.NodeId, node.NodeLevel) > 0; + this.SetNodeStyle(node); + } + } + return nChildNum; +} + +MyTree.prototype.Create = function () { + //MyClearChildren(this.TreeBar); + + + this.TreeBar.style.display = "block"; + + this.AddChildren(this.NodePId, -1); +} + +MyTree.prototype.Show = function () { + if (this.TreeBar == null) return false; + if (this.Created == false) this.Create(); +} + +MyTree.prototype.ShowAll = function (prtNode) { + var node = null; + this.SetNodeFlagStyle(prtNode); + for (var i = 0; i < this.Nodes.length; i++) { + node = this.Nodes[i]; + if (node.NodePId == prtNode.NodeId) { + node.NodeExpanded = prtNode.NodeExpanded; + node.DIV_NodeBar.style.display = node.NodeExpanded ? "block" : "none"; + //alert(node.NodeTxt); + if (node.HasChildren) { + this.SetNodeFlagStyle(node); + this.ShowAll(node); + } + } + } +} + +MyTree.prototype.FullExpand = function () { + for (var i = 0; i < this.Nodes.length; i++) { + node = this.Nodes[i]; + if (node.NodePId == this.NodePId) { + node.NodeExpanded = true; + if (node.HasChildren) this.ShowAll(node); + } + } +} + +MyTree.prototype.FullCollapse = function () { + for (var i = 0; i < this.Nodes.length; i++) { + node = this.Nodes[i]; + if (node.NodePId == this.NodePId) { + node.NodeExpanded = false; + if (node.HasChildren) this.ShowAll(node); + } + } +} + +MyTree.prototype.GetCheckedProvinceTxts = function () { + if (this.IsCheckbox == false) return ""; + var node = null; + var str = ""; + for (var i = 0; i < this.Nodes.length; i++) { + node = this.Nodes[i]; + if (node.NodeChecked != 0 && node.NodeLevel == 1) { + str += ("," + node.NodeTxt + ""); + } + } + + if (str.length > 0) str = str.substring(1, str.length); + if (str == "") str = ""; + return str; +} + +MyTree.prototype.GetCheckedTxtsByLevel = function (level) { + if (this.IsCheckbox == false) return ""; + var node = null; + var str = ""; + for (var i = 0; i < this.Nodes.length; i++) { + node = this.Nodes[i]; + if (node.NodeChecked != 0 && node.NodeLevel == level) { + if (this.GetParentNodeChecked(node.NodePId) != 1) { + str += (",'" + node.NodeTxt + "'"); + } + } + /*if ((node.NodeChecked == 1 && node.NodeLevel == level && level == 1) + || (node.NodeChecked != 0 && node.NodeLevel == level && level == 2)) { + str += (",'" + node.NodeTxt + "'"); + }*/ + } + + if (str.length > 0) str = str.substring(1, str.length); + if (str == "") str = ""; + return str; +} + +MyTree.prototype.GetCheckedValues = function () { + if (this.IsCheckbox == false) return ""; + var node = null; + var str = ""; + for (var i = 0; i < this.Nodes.length; i++) { + node = this.Nodes[i]; + if (node.NodeChecked == 1) { + str += ("," + node.NodeId); + } + } + + if (str.length > 0) str = str.substring(1, str.length); + return str; +} + +MyTree.prototype.GetParentNodeChecked = function (pId) { + if (!pId) return ""; + for (var i = 0; i < this.Nodes.length; i++) { + node = this.Nodes[i]; + if (node.NodeId == pId) { + return node.NodeChecked; + } + } + return ""; +} + +MyTree.prototype.CheckedAll = function (chked) { + if (this.IsCheckbox == false) return false; + var node = null; + + for (var i = 0; i < this.Nodes.length; i++) { + node = this.Nodes[i]; + node.NodeChecked = chked ? 1 : 0; + this.SetCheckbox(node); + } + + return true; +} + +MyTree.prototype.GetNode = function (nodeId) { + var node = null; + for (var i = 0; i < this.Nodes.length; i++) { + node = this.Nodes[i]; + if (node.NodeId == nodeId) return node; + } + return null; +} + +MyTree.prototype.SetCheckedNodes = function (nodeIds) { + + this.CheckedAll(false); + + if ((nodeIds == null) && (nodeIds.length < 1)) return false; + var ndIds = nodeIds.split(","); + if (ndIds == null) return false; + + var node = null; + for (var i = 0; i < ndIds.length; i++) { + node = this.GetNode(ndIds[i]); + if (node != null) { + node.NodeChecked = 1; + this.SetCheckbox(node); + } + } +} + +MyTree.prototype.InitChinaRegions = function () { + this.Add(100000, -1, "中国"); + + this.Add(110000, 100000, "北京市"); + this.Add(120000, 100000, "天津市"); + this.Add(130000, 100000, "河北省"); + this.Add(140000, 100000, "山西省"); + this.Add(150000, 100000, "内蒙古自治区"); + this.Add(210000, 100000, "辽宁省"); + this.Add(220000, 100000, "吉林省"); + this.Add(230000, 100000, "黑龙江省"); + this.Add(310000, 100000, "上海市"); + this.Add(320000, 100000, "江苏省"); + this.Add(330000, 100000, "浙江省"); + this.Add(340000, 100000, "安徽省"); + this.Add(350000, 100000, "福建省"); + this.Add(360000, 100000, "江西省"); + this.Add(370000, 100000, "山东省"); + this.Add(410000, 100000, "河南省"); + this.Add(420000, 100000, "湖北省"); + this.Add(430000, 100000, "湖南省"); + this.Add(440000, 100000, "广东省"); + this.Add(442101, 100000, "东沙群岛"); + this.Add(450000, 100000, "广西壮族自治区"); + this.Add(460000, 100000, "海南省"); + this.Add(500000, 100000, "重庆市"); + this.Add(510000, 100000, "四川省"); + this.Add(520000, 100000, "贵州省"); + this.Add(530000, 100000, "云南省"); + this.Add(540000, 100000, "西藏自治区"); + this.Add(610000, 100000, "陕西省"); + this.Add(620000, 100000, "甘肃省"); + this.Add(630000, 100000, "青海省"); + this.Add(640000, 100000, "宁夏回族自治区"); + this.Add(650000, 100000, "新疆维吾尔自治区"); + this.Add(710000, 100000, "台湾省"); + this.Add(810000, 100000, "香港特别行政区"); + this.Add(820000, 100000, "澳门特别行政区"); + this.Add(110101, 110000, "东城区"); + this.Add(110102, 110000, "西城区"); + this.Add(110105, 110000, "朝阳区"); + this.Add(110106, 110000, "丰台区"); + this.Add(110107, 110000, "石景山区"); + this.Add(110108, 110000, "海淀区"); + this.Add(110109, 110000, "门头沟区"); + this.Add(110111, 110000, "房山区"); + this.Add(110112, 110000, "通州区"); + this.Add(110113, 110000, "顺义区"); + this.Add(110114, 110000, "昌平区"); + this.Add(110115, 110000, "大兴区"); + this.Add(110116, 110000, "怀柔区"); + this.Add(110117, 110000, "平谷区"); + this.Add(110118, 110000, "密云区"); + this.Add(110119, 110000, "延庆区"); + this.Add(120101, 120000, "和平区"); + this.Add(120102, 120000, "河东区"); + this.Add(120103, 120000, "河西区"); + this.Add(120104, 120000, "南开区"); + this.Add(120105, 120000, "河北区"); + this.Add(120106, 120000, "红桥区"); + this.Add(120110, 120000, "东丽区"); + this.Add(120111, 120000, "西青区"); + this.Add(120112, 120000, "津南区"); + this.Add(120113, 120000, "北辰区"); + this.Add(120114, 120000, "武清区"); + this.Add(120115, 120000, "宝坻区"); + this.Add(120116, 120000, "滨海新区"); + this.Add(120117, 120000, "宁河区"); + this.Add(120118, 120000, "静海区"); + this.Add(120119, 120000, "蓟州区"); + this.Add(130100, 130000, "石家庄市"); + this.Add(130200, 130000, "唐山市"); + this.Add(130300, 130000, "秦皇岛市"); + this.Add(130400, 130000, "邯郸市"); + this.Add(130500, 130000, "邢台市"); + this.Add(130600, 130000, "保定市"); + this.Add(130700, 130000, "张家口市"); + this.Add(130800, 130000, "承德市"); + this.Add(130900, 130000, "沧州市"); + this.Add(131000, 130000, "廊坊市"); + this.Add(131100, 130000, "衡水市"); + this.Add(130102, 130100, "长安区"); + this.Add(130104, 130100, "桥西区"); + this.Add(130105, 130100, "新华区"); + this.Add(130107, 130100, "井陉矿区"); + this.Add(130108, 130100, "裕华区"); + this.Add(130109, 130100, "藁城区"); + this.Add(130110, 130100, "鹿泉区"); + this.Add(130111, 130100, "栾城区"); + this.Add(130121, 130100, "井陉县"); + this.Add(130123, 130100, "正定县"); + this.Add(130125, 130100, "行唐县"); + this.Add(130126, 130100, "灵寿县"); + this.Add(130127, 130100, "高邑县"); + this.Add(130128, 130100, "深泽县"); + this.Add(130129, 130100, "赞皇县"); + this.Add(130130, 130100, "无极县"); + this.Add(130131, 130100, "平山县"); + this.Add(130132, 130100, "元氏县"); + this.Add(130133, 130100, "赵县"); + this.Add(130181, 130100, "辛集市"); + this.Add(130183, 130100, "晋州市"); + this.Add(130184, 130100, "新乐市"); + this.Add(130202, 130200, "路南区"); + this.Add(130203, 130200, "路北区"); + this.Add(130204, 130200, "古冶区"); + this.Add(130205, 130200, "开平区"); + this.Add(130207, 130200, "丰南区"); + this.Add(130208, 130200, "丰润区"); + this.Add(130209, 130200, "曹妃甸区"); + this.Add(130224, 130200, "滦南县"); + this.Add(130225, 130200, "乐亭县"); + this.Add(130227, 130200, "迁西县"); + this.Add(130229, 130200, "玉田县"); + this.Add(130281, 130200, "遵化市"); + this.Add(130283, 130200, "迁安市"); + this.Add(130284, 130200, "滦州市"); + this.Add(130302, 130300, "海港区"); + this.Add(130303, 130300, "山海关区"); + this.Add(130304, 130300, "北戴河区"); + this.Add(130306, 130300, "抚宁区"); + this.Add(130321, 130300, "青龙满族自治县"); + this.Add(130322, 130300, "昌黎县"); + this.Add(130324, 130300, "卢龙县"); + this.Add(130402, 130400, "邯山区"); + this.Add(130403, 130400, "丛台区"); + this.Add(130404, 130400, "复兴区"); + this.Add(130406, 130400, "峰峰矿区"); + this.Add(130407, 130400, "肥乡区"); + this.Add(130408, 130400, "永年区"); + this.Add(130423, 130400, "临漳县"); + this.Add(130424, 130400, "成安县"); + this.Add(130425, 130400, "大名县"); + this.Add(130426, 130400, "涉县"); + this.Add(130427, 130400, "磁县"); + this.Add(130430, 130400, "邱县"); + this.Add(130431, 130400, "鸡泽县"); + this.Add(130432, 130400, "广平县"); + this.Add(130433, 130400, "馆陶县"); + this.Add(130434, 130400, "魏县"); + this.Add(130435, 130400, "曲周县"); + this.Add(130481, 130400, "武安市"); + this.Add(130502, 130500, "襄都区"); + this.Add(130503, 130500, "信都区"); + this.Add(130505, 130500, "任泽区"); + this.Add(130506, 130500, "南和区"); + this.Add(130522, 130500, "临城县"); + this.Add(130523, 130500, "内丘县"); + this.Add(130524, 130500, "柏乡县"); + this.Add(130525, 130500, "隆尧县"); + this.Add(130528, 130500, "宁晋县"); + this.Add(130529, 130500, "巨鹿县"); + this.Add(130530, 130500, "新河县"); + this.Add(130531, 130500, "广宗县"); + this.Add(130532, 130500, "平乡县"); + this.Add(130533, 130500, "威县"); + this.Add(130534, 130500, "清河县"); + this.Add(130535, 130500, "临西县"); + this.Add(130581, 130500, "南宫市"); + this.Add(130582, 130500, "沙河市"); + this.Add(130602, 130600, "竞秀区"); + this.Add(130606, 130600, "莲池区"); + this.Add(130607, 130600, "满城区"); + this.Add(130608, 130600, "清苑区"); + this.Add(130609, 130600, "徐水区"); + this.Add(130623, 130600, "涞水县"); + this.Add(130624, 130600, "阜平县"); + this.Add(130626, 130600, "定兴县"); + this.Add(130627, 130600, "唐县"); + this.Add(130628, 130600, "高阳县"); + this.Add(130629, 130600, "容城县"); + this.Add(130630, 130600, "涞源县"); + this.Add(130631, 130600, "望都县"); + this.Add(130632, 130600, "安新县"); + this.Add(130633, 130600, "易县"); + this.Add(130634, 130600, "曲阳县"); + this.Add(130635, 130600, "蠡县"); + this.Add(130636, 130600, "顺平县"); + this.Add(130637, 130600, "博野县"); + this.Add(130638, 130600, "雄县"); + this.Add(130681, 130600, "涿州市"); + this.Add(130682, 130600, "定州市"); + this.Add(130683, 130600, "安国市"); + this.Add(130684, 130600, "高碑店市"); + this.Add(130702, 130700, "桥东区"); + this.Add(130703, 130700, "桥西区"); + this.Add(130705, 130700, "宣化区"); + this.Add(130706, 130700, "下花园区"); + this.Add(130708, 130700, "万全区"); + this.Add(130709, 130700, "崇礼区"); + this.Add(130722, 130700, "张北县"); + this.Add(130723, 130700, "康保县"); + this.Add(130724, 130700, "沽源县"); + this.Add(130725, 130700, "尚义县"); + this.Add(130726, 130700, "蔚县"); + this.Add(130727, 130700, "阳原县"); + this.Add(130728, 130700, "怀安县"); + this.Add(130730, 130700, "怀来县"); + this.Add(130731, 130700, "涿鹿县"); + this.Add(130732, 130700, "赤城县"); + this.Add(130802, 130800, "双桥区"); + this.Add(130803, 130800, "双滦区"); + this.Add(130804, 130800, "鹰手营子矿区"); + this.Add(130821, 130800, "承德县"); + this.Add(130822, 130800, "兴隆县"); + this.Add(130824, 130800, "滦平县"); + this.Add(130825, 130800, "隆化县"); + this.Add(130826, 130800, "丰宁满族自治县"); + this.Add(130827, 130800, "宽城满族自治县"); + this.Add(130828, 130800, "围场满族蒙古族自治县"); + this.Add(130881, 130800, "平泉市"); + this.Add(130902, 130900, "新华区"); + this.Add(130903, 130900, "运河区"); + this.Add(130921, 130900, "沧县"); + this.Add(130922, 130900, "青县"); + this.Add(130923, 130900, "东光县"); + this.Add(130924, 130900, "海兴县"); + this.Add(130925, 130900, "盐山县"); + this.Add(130926, 130900, "肃宁县"); + this.Add(130927, 130900, "南皮县"); + this.Add(130928, 130900, "吴桥县"); + this.Add(130929, 130900, "献县"); + this.Add(130930, 130900, "孟村回族自治县"); + this.Add(130981, 130900, "泊头市"); + this.Add(130982, 130900, "任丘市"); + this.Add(130983, 130900, "黄骅市"); + this.Add(130984, 130900, "河间市"); + this.Add(131002, 131000, "安次区"); + this.Add(131003, 131000, "广阳区"); + this.Add(131022, 131000, "固安县"); + this.Add(131023, 131000, "永清县"); + this.Add(131024, 131000, "香河县"); + this.Add(131025, 131000, "大城县"); + this.Add(131026, 131000, "文安县"); + this.Add(131028, 131000, "大厂回族自治县"); + this.Add(131081, 131000, "霸州市"); + this.Add(131082, 131000, "三河市"); + this.Add(131102, 131100, "桃城区"); + this.Add(131103, 131100, "冀州区"); + this.Add(131121, 131100, "枣强县"); + this.Add(131122, 131100, "武邑县"); + this.Add(131123, 131100, "武强县"); + this.Add(131124, 131100, "饶阳县"); + this.Add(131125, 131100, "安平县"); + this.Add(131126, 131100, "故城县"); + this.Add(131127, 131100, "景县"); + this.Add(131128, 131100, "阜城县"); + this.Add(131182, 131100, "深州市"); + this.Add(140100, 140000, "太原市"); + this.Add(140200, 140000, "大同市"); + this.Add(140300, 140000, "阳泉市"); + this.Add(140400, 140000, "长治市"); + this.Add(140500, 140000, "晋城市"); + this.Add(140600, 140000, "朔州市"); + this.Add(140700, 140000, "晋中市"); + this.Add(140800, 140000, "运城市"); + this.Add(140900, 140000, "忻州市"); + this.Add(141000, 140000, "临汾市"); + this.Add(141100, 140000, "吕梁市"); + this.Add(140105, 140100, "小店区"); + this.Add(140106, 140100, "迎泽区"); + this.Add(140107, 140100, "杏花岭区"); + this.Add(140108, 140100, "尖草坪区"); + this.Add(140109, 140100, "万柏林区"); + this.Add(140110, 140100, "晋源区"); + this.Add(140121, 140100, "清徐县"); + this.Add(140122, 140100, "阳曲县"); + this.Add(140123, 140100, "娄烦县"); + this.Add(140181, 140100, "古交市"); + this.Add(140212, 140200, "新荣区"); + this.Add(140213, 140200, "平城区"); + this.Add(140214, 140200, "云冈区"); + this.Add(140215, 140200, "云州区"); + this.Add(140221, 140200, "阳高县"); + this.Add(140222, 140200, "天镇县"); + this.Add(140223, 140200, "广灵县"); + this.Add(140224, 140200, "灵丘县"); + this.Add(140225, 140200, "浑源县"); + this.Add(140226, 140200, "左云县"); + this.Add(140302, 140300, "城区"); + this.Add(140303, 140300, "矿区"); + this.Add(140311, 140300, "郊区"); + this.Add(140321, 140300, "平定县"); + this.Add(140322, 140300, "盂县"); + this.Add(140403, 140400, "潞州区"); + this.Add(140404, 140400, "上党区"); + this.Add(140405, 140400, "屯留区"); + this.Add(140406, 140400, "潞城区"); + this.Add(140423, 140400, "襄垣县"); + this.Add(140425, 140400, "平顺县"); + this.Add(140426, 140400, "黎城县"); + this.Add(140427, 140400, "壶关县"); + this.Add(140428, 140400, "长子县"); + this.Add(140429, 140400, "武乡县"); + this.Add(140430, 140400, "沁县"); + this.Add(140431, 140400, "沁源县"); + this.Add(140502, 140500, "城区"); + this.Add(140521, 140500, "沁水县"); + this.Add(140522, 140500, "阳城县"); + this.Add(140524, 140500, "陵川县"); + this.Add(140525, 140500, "泽州县"); + this.Add(140581, 140500, "高平市"); + this.Add(140602, 140600, "朔城区"); + this.Add(140603, 140600, "平鲁区"); + this.Add(140621, 140600, "山阴县"); + this.Add(140622, 140600, "应县"); + this.Add(140623, 140600, "右玉县"); + this.Add(140681, 140600, "怀仁市"); + this.Add(140702, 140700, "榆次区"); + this.Add(140703, 140700, "太谷区"); + this.Add(140721, 140700, "榆社县"); + this.Add(140722, 140700, "左权县"); + this.Add(140723, 140700, "和顺县"); + this.Add(140724, 140700, "昔阳县"); + this.Add(140725, 140700, "寿阳县"); + this.Add(140727, 140700, "祁县"); + this.Add(140728, 140700, "平遥县"); + this.Add(140729, 140700, "灵石县"); + this.Add(140781, 140700, "介休市"); + this.Add(140802, 140800, "盐湖区"); + this.Add(140821, 140800, "临猗县"); + this.Add(140822, 140800, "万荣县"); + this.Add(140823, 140800, "闻喜县"); + this.Add(140824, 140800, "稷山县"); + this.Add(140825, 140800, "新绛县"); + this.Add(140826, 140800, "绛县"); + this.Add(140827, 140800, "垣曲县"); + this.Add(140828, 140800, "夏县"); + this.Add(140829, 140800, "平陆县"); + this.Add(140830, 140800, "芮城县"); + this.Add(140881, 140800, "永济市"); + this.Add(140882, 140800, "河津市"); + this.Add(140902, 140900, "忻府区"); + this.Add(140921, 140900, "定襄县"); + this.Add(140922, 140900, "五台县"); + this.Add(140923, 140900, "代县"); + this.Add(140924, 140900, "繁峙县"); + this.Add(140925, 140900, "宁武县"); + this.Add(140926, 140900, "静乐县"); + this.Add(140927, 140900, "神池县"); + this.Add(140928, 140900, "五寨县"); + this.Add(140929, 140900, "岢岚县"); + this.Add(140930, 140900, "河曲县"); + this.Add(140931, 140900, "保德县"); + this.Add(140932, 140900, "偏关县"); + this.Add(140981, 140900, "原平市"); + this.Add(141002, 141000, "尧都区"); + this.Add(141021, 141000, "曲沃县"); + this.Add(141022, 141000, "翼城县"); + this.Add(141023, 141000, "襄汾县"); + this.Add(141024, 141000, "洪洞县"); + this.Add(141025, 141000, "古县"); + this.Add(141026, 141000, "安泽县"); + this.Add(141027, 141000, "浮山县"); + this.Add(141028, 141000, "吉县"); + this.Add(141029, 141000, "乡宁县"); + this.Add(141030, 141000, "大宁县"); + this.Add(141031, 141000, "隰县"); + this.Add(141032, 141000, "永和县"); + this.Add(141033, 141000, "蒲县"); + this.Add(141034, 141000, "汾西县"); + this.Add(141081, 141000, "侯马市"); + this.Add(141082, 141000, "霍州市"); + this.Add(141102, 141100, "离石区"); + this.Add(141121, 141100, "文水县"); + this.Add(141122, 141100, "交城县"); + this.Add(141123, 141100, "兴县"); + this.Add(141124, 141100, "临县"); + this.Add(141125, 141100, "柳林县"); + this.Add(141126, 141100, "石楼县"); + this.Add(141127, 141100, "岚县"); + this.Add(141128, 141100, "方山县"); + this.Add(141129, 141100, "中阳县"); + this.Add(141130, 141100, "交口县"); + this.Add(141181, 141100, "孝义市"); + this.Add(141182, 141100, "汾阳市"); + this.Add(150100, 150000, "呼和浩特市"); + this.Add(150200, 150000, "包头市"); + this.Add(150300, 150000, "乌海市"); + this.Add(150400, 150000, "赤峰市"); + this.Add(150500, 150000, "通辽市"); + this.Add(150600, 150000, "鄂尔多斯市"); + this.Add(150700, 150000, "呼伦贝尔市"); + this.Add(150800, 150000, "巴彦淖尔市"); + this.Add(150900, 150000, "乌兰察布市"); + this.Add(152200, 150000, "兴安盟"); + this.Add(152500, 150000, "锡林郭勒盟"); + this.Add(152900, 150000, "阿拉善盟"); + this.Add(150102, 150100, "新城区"); + this.Add(150103, 150100, "回民区"); + this.Add(150104, 150100, "玉泉区"); + this.Add(150105, 150100, "赛罕区"); + this.Add(150121, 150100, "土默特左旗"); + this.Add(150122, 150100, "托克托县"); + this.Add(150123, 150100, "和林格尔县"); + this.Add(150124, 150100, "清水河县"); + this.Add(150125, 150100, "武川县"); + this.Add(150202, 150200, "东河区"); + this.Add(150203, 150200, "昆都仑区"); + this.Add(150204, 150200, "青山区"); + this.Add(150205, 150200, "石拐区"); + this.Add(150206, 150200, "白云鄂博矿区"); + this.Add(150207, 150200, "九原区"); + this.Add(150221, 150200, "土默特右旗"); + this.Add(150222, 150200, "固阳县"); + this.Add(150223, 150200, "达尔罕茂明安联合旗"); + this.Add(150302, 150300, "海勃湾区"); + this.Add(150303, 150300, "海南区"); + this.Add(150304, 150300, "乌达区"); + this.Add(150402, 150400, "红山区"); + this.Add(150403, 150400, "元宝山区"); + this.Add(150404, 150400, "松山区"); + this.Add(150421, 150400, "阿鲁科尔沁旗"); + this.Add(150422, 150400, "巴林左旗"); + this.Add(150423, 150400, "巴林右旗"); + this.Add(150424, 150400, "林西县"); + this.Add(150425, 150400, "克什克腾旗"); + this.Add(150426, 150400, "翁牛特旗"); + this.Add(150428, 150400, "喀喇沁旗"); + this.Add(150429, 150400, "宁城县"); + this.Add(150430, 150400, "敖汉旗"); + this.Add(150502, 150500, "科尔沁区"); + this.Add(150521, 150500, "科尔沁左翼中旗"); + this.Add(150522, 150500, "科尔沁左翼后旗"); + this.Add(150523, 150500, "开鲁县"); + this.Add(150524, 150500, "库伦旗"); + this.Add(150525, 150500, "奈曼旗"); + this.Add(150526, 150500, "扎鲁特旗"); + this.Add(150581, 150500, "霍林郭勒市"); + this.Add(150602, 150600, "东胜区"); + this.Add(150603, 150600, "康巴什区"); + this.Add(150621, 150600, "达拉特旗"); + this.Add(150622, 150600, "准格尔旗"); + this.Add(150623, 150600, "鄂托克前旗"); + this.Add(150624, 150600, "鄂托克旗"); + this.Add(150625, 150600, "杭锦旗"); + this.Add(150626, 150600, "乌审旗"); + this.Add(150627, 150600, "伊金霍洛旗"); + this.Add(150702, 150700, "海拉尔区"); + this.Add(150703, 150700, "扎赉诺尔区"); + this.Add(150721, 150700, "阿荣旗"); + this.Add(150722, 150700, "莫力达瓦达斡尔族自治旗"); + this.Add(150723, 150700, "鄂伦春自治旗"); + this.Add(150724, 150700, "鄂温克族自治旗"); + this.Add(150725, 150700, "陈巴尔虎旗"); + this.Add(150726, 150700, "新巴尔虎左旗"); + this.Add(150727, 150700, "新巴尔虎右旗"); + this.Add(150781, 150700, "满洲里市"); + this.Add(150782, 150700, "牙克石市"); + this.Add(150783, 150700, "扎兰屯市"); + this.Add(150784, 150700, "额尔古纳市"); + this.Add(150785, 150700, "根河市"); + this.Add(150802, 150800, "临河区"); + this.Add(150821, 150800, "五原县"); + this.Add(150822, 150800, "磴口县"); + this.Add(150823, 150800, "乌拉特前旗"); + this.Add(150824, 150800, "乌拉特中旗"); + this.Add(150825, 150800, "乌拉特后旗"); + this.Add(150826, 150800, "杭锦后旗"); + this.Add(150902, 150900, "集宁区"); + this.Add(150921, 150900, "卓资县"); + this.Add(150922, 150900, "化德县"); + this.Add(150923, 150900, "商都县"); + this.Add(150924, 150900, "兴和县"); + this.Add(150925, 150900, "凉城县"); + this.Add(150926, 150900, "察哈尔右翼前旗"); + this.Add(150927, 150900, "察哈尔右翼中旗"); + this.Add(150928, 150900, "察哈尔右翼后旗"); + this.Add(150929, 150900, "四子王旗"); + this.Add(150981, 150900, "丰镇市"); + this.Add(152201, 152200, "乌兰浩特市"); + this.Add(152202, 152200, "阿尔山市"); + this.Add(152221, 152200, "科尔沁右翼前旗"); + this.Add(152222, 152200, "科尔沁右翼中旗"); + this.Add(152223, 152200, "扎赉特旗"); + this.Add(152224, 152200, "突泉县"); + this.Add(152501, 152500, "二连浩特市"); + this.Add(152502, 152500, "锡林浩特市"); + this.Add(152522, 152500, "阿巴嘎旗"); + this.Add(152523, 152500, "苏尼特左旗"); + this.Add(152524, 152500, "苏尼特右旗"); + this.Add(152525, 152500, "东乌珠穆沁旗"); + this.Add(152526, 152500, "西乌珠穆沁旗"); + this.Add(152527, 152500, "太仆寺旗"); + this.Add(152528, 152500, "镶黄旗"); + this.Add(152529, 152500, "正镶白旗"); + this.Add(152530, 152500, "正蓝旗"); + this.Add(152531, 152500, "多伦县"); + this.Add(152921, 152900, "阿拉善左旗"); + this.Add(152922, 152900, "阿拉善右旗"); + this.Add(152923, 152900, "额济纳旗"); + this.Add(210100, 210000, "沈阳市"); + this.Add(210200, 210000, "大连市"); + this.Add(210300, 210000, "鞍山市"); + this.Add(210400, 210000, "抚顺市"); + this.Add(210500, 210000, "本溪市"); + this.Add(210600, 210000, "丹东市"); + this.Add(210700, 210000, "锦州市"); + this.Add(210800, 210000, "营口市"); + this.Add(210900, 210000, "阜新市"); + this.Add(211000, 210000, "辽阳市"); + this.Add(211100, 210000, "盘锦市"); + this.Add(211200, 210000, "铁岭市"); + this.Add(211300, 210000, "朝阳市"); + this.Add(211400, 210000, "葫芦岛市"); + this.Add(210102, 210100, "和平区"); + this.Add(210103, 210100, "沈河区"); + this.Add(210104, 210100, "大东区"); + this.Add(210105, 210100, "皇姑区"); + this.Add(210106, 210100, "铁西区"); + this.Add(210111, 210100, "苏家屯区"); + this.Add(210112, 210100, "浑南区"); + this.Add(210113, 210100, "沈北新区"); + this.Add(210114, 210100, "于洪区"); + this.Add(210115, 210100, "辽中区"); + this.Add(210123, 210100, "康平县"); + this.Add(210124, 210100, "法库县"); + this.Add(210181, 210100, "新民市"); + this.Add(210202, 210200, "中山区"); + this.Add(210203, 210200, "西岗区"); + this.Add(210204, 210200, "沙河口区"); + this.Add(210211, 210200, "甘井子区"); + this.Add(210212, 210200, "旅顺口区"); + this.Add(210213, 210200, "金州区"); + this.Add(210214, 210200, "普兰店区"); + this.Add(210224, 210200, "长海县"); + this.Add(210281, 210200, "瓦房店市"); + this.Add(210283, 210200, "庄河市"); + this.Add(210302, 210300, "铁东区"); + this.Add(210303, 210300, "铁西区"); + this.Add(210304, 210300, "立山区"); + this.Add(210311, 210300, "千山区"); + this.Add(210321, 210300, "台安县"); + this.Add(210323, 210300, "岫岩满族自治县"); + this.Add(210381, 210300, "海城市"); + this.Add(210402, 210400, "新抚区"); + this.Add(210403, 210400, "东洲区"); + this.Add(210404, 210400, "望花区"); + this.Add(210411, 210400, "顺城区"); + this.Add(210421, 210400, "抚顺县"); + this.Add(210422, 210400, "新宾满族自治县"); + this.Add(210423, 210400, "清原满族自治县"); + this.Add(210502, 210500, "平山区"); + this.Add(210503, 210500, "溪湖区"); + this.Add(210504, 210500, "明山区"); + this.Add(210505, 210500, "南芬区"); + this.Add(210521, 210500, "本溪满族自治县"); + this.Add(210522, 210500, "桓仁满族自治县"); + this.Add(210602, 210600, "元宝区"); + this.Add(210603, 210600, "振兴区"); + this.Add(210604, 210600, "振安区"); + this.Add(210624, 210600, "宽甸满族自治县"); + this.Add(210681, 210600, "东港市"); + this.Add(210682, 210600, "凤城市"); + this.Add(210702, 210700, "古塔区"); + this.Add(210703, 210700, "凌河区"); + this.Add(210711, 210700, "太和区"); + this.Add(210726, 210700, "黑山县"); + this.Add(210727, 210700, "义县"); + this.Add(210781, 210700, "凌海市"); + this.Add(210782, 210700, "北镇市"); + this.Add(210802, 210800, "站前区"); + this.Add(210803, 210800, "西市区"); + this.Add(210804, 210800, "鲅鱼圈区"); + this.Add(210811, 210800, "老边区"); + this.Add(210881, 210800, "盖州市"); + this.Add(210882, 210800, "大石桥市"); + this.Add(210902, 210900, "海州区"); + this.Add(210903, 210900, "新邱区"); + this.Add(210904, 210900, "太平区"); + this.Add(210905, 210900, "清河门区"); + this.Add(210911, 210900, "细河区"); + this.Add(210921, 210900, "阜新蒙古族自治县"); + this.Add(210922, 210900, "彰武县"); + this.Add(211002, 211000, "白塔区"); + this.Add(211003, 211000, "文圣区"); + this.Add(211004, 211000, "宏伟区"); + this.Add(211005, 211000, "弓长岭区"); + this.Add(211011, 211000, "太子河区"); + this.Add(211021, 211000, "辽阳县"); + this.Add(211081, 211000, "灯塔市"); + this.Add(211102, 211100, "双台子区"); + this.Add(211103, 211100, "兴隆台区"); + this.Add(211104, 211100, "大洼区"); + this.Add(211122, 211100, "盘山县"); + this.Add(211202, 211200, "银州区"); + this.Add(211204, 211200, "清河区"); + this.Add(211221, 211200, "铁岭县"); + this.Add(211223, 211200, "西丰县"); + this.Add(211224, 211200, "昌图县"); + this.Add(211281, 211200, "调兵山市"); + this.Add(211282, 211200, "开原市"); + this.Add(211302, 211300, "双塔区"); + this.Add(211303, 211300, "龙城区"); + this.Add(211321, 211300, "朝阳县"); + this.Add(211322, 211300, "建平县"); + this.Add(211324, 211300, "喀喇沁左翼蒙古族自治县"); + this.Add(211381, 211300, "北票市"); + this.Add(211382, 211300, "凌源市"); + this.Add(211402, 211400, "连山区"); + this.Add(211403, 211400, "龙港区"); + this.Add(211404, 211400, "南票区"); + this.Add(211421, 211400, "绥中县"); + this.Add(211422, 211400, "建昌县"); + this.Add(211481, 211400, "兴城市"); + this.Add(220100, 220000, "长春市"); + this.Add(220184, 220000, "公主岭市"); + this.Add(220200, 220000, "吉林市"); + this.Add(220400, 220000, "辽源市"); + this.Add(220500, 220000, "通化市"); + this.Add(220600, 220000, "白山市"); + this.Add(220700, 220000, "松原市"); + this.Add(220800, 220000, "白城市"); + this.Add(222400, 220000, "延边朝鲜族自治州"); + this.Add(220102, 220100, "南关区"); + this.Add(220103, 220100, "宽城区"); + this.Add(220104, 220100, "朝阳区"); + this.Add(220105, 220100, "二道区"); + this.Add(220106, 220100, "绿园区"); + this.Add(220112, 220100, "双阳区"); + this.Add(220113, 220100, "九台区"); + this.Add(220122, 220100, "农安县"); + this.Add(220182, 220100, "榆树市"); + this.Add(220183, 220100, "德惠市"); + this.Add(220300, 220184, "四平市"); + this.Add(220302, 220184, "铁西区"); + this.Add(220303, 220184, "铁东区"); + this.Add(220322, 220184, "梨树县"); + this.Add(220323, 220184, "伊通满族自治县"); + this.Add(220382, 220184, "双辽市"); + this.Add(220202, 220200, "昌邑区"); + this.Add(220203, 220200, "龙潭区"); + this.Add(220204, 220200, "船营区"); + this.Add(220211, 220200, "丰满区"); + this.Add(220221, 220200, "永吉县"); + this.Add(220281, 220200, "蛟河市"); + this.Add(220282, 220200, "桦甸市"); + this.Add(220283, 220200, "舒兰市"); + this.Add(220284, 220200, "磐石市"); + this.Add(220402, 220400, "龙山区"); + this.Add(220403, 220400, "西安区"); + this.Add(220421, 220400, "东丰县"); + this.Add(220422, 220400, "东辽县"); + this.Add(220502, 220500, "东昌区"); + this.Add(220503, 220500, "二道江区"); + this.Add(220521, 220500, "通化县"); + this.Add(220523, 220500, "辉南县"); + this.Add(220524, 220500, "柳河县"); + this.Add(220581, 220500, "梅河口市"); + this.Add(220582, 220500, "集安市"); + this.Add(220602, 220600, "浑江区"); + this.Add(220605, 220600, "江源区"); + this.Add(220621, 220600, "抚松县"); + this.Add(220622, 220600, "靖宇县"); + this.Add(220623, 220600, "长白朝鲜族自治县"); + this.Add(220681, 220600, "临江市"); + this.Add(220702, 220700, "宁江区"); + this.Add(220721, 220700, "前郭尔罗斯蒙古族自治县"); + this.Add(220722, 220700, "长岭县"); + this.Add(220723, 220700, "乾安县"); + this.Add(220781, 220700, "扶余市"); + this.Add(220802, 220800, "洮北区"); + this.Add(220821, 220800, "镇赉县"); + this.Add(220822, 220800, "通榆县"); + this.Add(220881, 220800, "洮南市"); + this.Add(220882, 220800, "大安市"); + this.Add(222401, 222400, "延吉市"); + this.Add(222402, 222400, "图们市"); + this.Add(222403, 222400, "敦化市"); + this.Add(222404, 222400, "珲春市"); + this.Add(222405, 222400, "龙井市"); + this.Add(222406, 222400, "和龙市"); + this.Add(222424, 222400, "汪清县"); + this.Add(222426, 222400, "安图县"); + this.Add(230100, 230000, "哈尔滨市"); + this.Add(230200, 230000, "齐齐哈尔市"); + this.Add(230300, 230000, "鸡西市"); + this.Add(230400, 230000, "鹤岗市"); + this.Add(230500, 230000, "双鸭山市"); + this.Add(230600, 230000, "大庆市"); + this.Add(230700, 230000, "伊春市"); + this.Add(230800, 230000, "佳木斯市"); + this.Add(230900, 230000, "七台河市"); + this.Add(231000, 230000, "牡丹江市"); + this.Add(231100, 230000, "黑河市"); + this.Add(231200, 230000, "绥化市"); + this.Add(232700, 230000, "大兴安岭地区"); + this.Add(230102, 230100, "道里区"); + this.Add(230103, 230100, "南岗区"); + this.Add(230104, 230100, "道外区"); + this.Add(230108, 230100, "平房区"); + this.Add(230109, 230100, "松北区"); + this.Add(230110, 230100, "香坊区"); + this.Add(230111, 230100, "呼兰区"); + this.Add(230112, 230100, "阿城区"); + this.Add(230113, 230100, "双城区"); + this.Add(230123, 230100, "依兰县"); + this.Add(230124, 230100, "方正县"); + this.Add(230125, 230100, "宾县"); + this.Add(230126, 230100, "巴彦县"); + this.Add(230127, 230100, "木兰县"); + this.Add(230128, 230100, "通河县"); + this.Add(230129, 230100, "延寿县"); + this.Add(230183, 230100, "尚志市"); + this.Add(230184, 230100, "五常市"); + this.Add(230202, 230200, "龙沙区"); + this.Add(230203, 230200, "建华区"); + this.Add(230204, 230200, "铁锋区"); + this.Add(230205, 230200, "昂昂溪区"); + this.Add(230206, 230200, "富拉尔基区"); + this.Add(230207, 230200, "碾子山区"); + this.Add(230208, 230200, "梅里斯达斡尔族区"); + this.Add(230221, 230200, "龙江县"); + this.Add(230223, 230200, "依安县"); + this.Add(230224, 230200, "泰来县"); + this.Add(230225, 230200, "甘南县"); + this.Add(230227, 230200, "富裕县"); + this.Add(230229, 230200, "克山县"); + this.Add(230230, 230200, "克东县"); + this.Add(230231, 230200, "拜泉县"); + this.Add(230281, 230200, "讷河市"); + this.Add(230302, 230300, "鸡冠区"); + this.Add(230303, 230300, "恒山区"); + this.Add(230304, 230300, "滴道区"); + this.Add(230305, 230300, "梨树区"); + this.Add(230306, 230300, "城子河区"); + this.Add(230307, 230300, "麻山区"); + this.Add(230321, 230300, "鸡东县"); + this.Add(230381, 230300, "虎林市"); + this.Add(230382, 230300, "密山市"); + this.Add(230402, 230400, "向阳区"); + this.Add(230403, 230400, "工农区"); + this.Add(230404, 230400, "南山区"); + this.Add(230405, 230400, "兴安区"); + this.Add(230406, 230400, "东山区"); + this.Add(230407, 230400, "兴山区"); + this.Add(230421, 230400, "萝北县"); + this.Add(230422, 230400, "绥滨县"); + this.Add(230502, 230500, "尖山区"); + this.Add(230503, 230500, "岭东区"); + this.Add(230505, 230500, "四方台区"); + this.Add(230506, 230500, "宝山区"); + this.Add(230521, 230500, "集贤县"); + this.Add(230522, 230500, "友谊县"); + this.Add(230523, 230500, "宝清县"); + this.Add(230524, 230500, "饶河县"); + this.Add(230602, 230600, "萨尔图区"); + this.Add(230603, 230600, "龙凤区"); + this.Add(230604, 230600, "让胡路区"); + this.Add(230605, 230600, "红岗区"); + this.Add(230606, 230600, "大同区"); + this.Add(230621, 230600, "肇州县"); + this.Add(230622, 230600, "肇源县"); + this.Add(230623, 230600, "林甸县"); + this.Add(230624, 230600, "杜尔伯特蒙古族自治县"); + this.Add(230712, 230700, "汤旺河区"); + this.Add(230717, 230700, "伊美区"); + this.Add(230718, 230700, "乌翠区"); + this.Add(230719, 230700, "友好区"); + this.Add(230722, 230700, "嘉荫县"); + this.Add(230723, 230700, "汤旺县"); + this.Add(230724, 230700, "丰林县"); + this.Add(230725, 230700, "大箐山县"); + this.Add(230726, 230700, "南岔县"); + this.Add(230751, 230700, "金林区"); + this.Add(230781, 230700, "铁力市"); + this.Add(230803, 230800, "向阳区"); + this.Add(230804, 230800, "前进区"); + this.Add(230805, 230800, "东风区"); + this.Add(230811, 230800, "郊区"); + this.Add(230822, 230800, "桦南县"); + this.Add(230826, 230800, "桦川县"); + this.Add(230828, 230800, "汤原县"); + this.Add(230881, 230800, "同江市"); + this.Add(230882, 230800, "富锦市"); + this.Add(230883, 230800, "抚远市"); + this.Add(230902, 230900, "新兴区"); + this.Add(230903, 230900, "桃山区"); + this.Add(230904, 230900, "茄子河区"); + this.Add(230921, 230900, "勃利县"); + this.Add(231002, 231000, "东安区"); + this.Add(231003, 231000, "阳明区"); + this.Add(231004, 231000, "爱民区"); + this.Add(231005, 231000, "西安区"); + this.Add(231025, 231000, "林口县"); + this.Add(231081, 231000, "绥芬河市"); + this.Add(231083, 231000, "海林市"); + this.Add(231084, 231000, "宁安市"); + this.Add(231085, 231000, "穆棱市"); + this.Add(231086, 231000, "东宁市"); + this.Add(231102, 231100, "爱辉区"); + this.Add(231123, 231100, "逊克县"); + this.Add(231124, 231100, "孙吴县"); + this.Add(231181, 231100, "北安市"); + this.Add(231182, 231100, "五大连池市"); + this.Add(231183, 231100, "嫩江市"); + this.Add(231202, 231200, "北林区"); + this.Add(231221, 231200, "望奎县"); + this.Add(231222, 231200, "兰西县"); + this.Add(231223, 231200, "青冈县"); + this.Add(231224, 231200, "庆安县"); + this.Add(231225, 231200, "明水县"); + this.Add(231226, 231200, "绥棱县"); + this.Add(231281, 231200, "安达市"); + this.Add(231282, 231200, "肇东市"); + this.Add(231283, 231200, "海伦市"); + this.Add(232701, 232700, "漠河市"); + this.Add(232718, 232700, "加格达奇区"); + this.Add(232721, 232700, "呼玛县"); + this.Add(232722, 232700, "塔河县"); + this.Add(310101, 310000, "黄浦区"); + this.Add(310104, 310000, "徐汇区"); + this.Add(310105, 310000, "长宁区"); + this.Add(310106, 310000, "静安区"); + this.Add(310107, 310000, "普陀区"); + this.Add(310109, 310000, "虹口区"); + this.Add(310110, 310000, "杨浦区"); + this.Add(310112, 310000, "闵行区"); + this.Add(310113, 310000, "宝山区"); + this.Add(310114, 310000, "嘉定区"); + this.Add(310115, 310000, "浦东新区"); + this.Add(310116, 310000, "金山区"); + this.Add(310117, 310000, "松江区"); + this.Add(310118, 310000, "青浦区"); + this.Add(310120, 310000, "奉贤区"); + this.Add(310151, 310000, "崇明区"); + this.Add(320100, 320000, "南京市"); + this.Add(320200, 320000, "无锡市"); + this.Add(320300, 320000, "徐州市"); + this.Add(320400, 320000, "常州市"); + this.Add(320500, 320000, "苏州市"); + this.Add(320600, 320000, "南通市"); + this.Add(320700, 320000, "连云港市"); + this.Add(320800, 320000, "淮安市"); + this.Add(320900, 320000, "盐城市"); + this.Add(321000, 320000, "扬州市"); + this.Add(321100, 320000, "镇江市"); + this.Add(321200, 320000, "泰州市"); + this.Add(321300, 320000, "宿迁市"); + this.Add(320102, 320100, "玄武区"); + this.Add(320104, 320100, "秦淮区"); + this.Add(320105, 320100, "建邺区"); + this.Add(320106, 320100, "鼓楼区"); + this.Add(320111, 320100, "浦口区"); + this.Add(320113, 320100, "栖霞区"); + this.Add(320114, 320100, "雨花台区"); + this.Add(320115, 320100, "江宁区"); + this.Add(320116, 320100, "六合区"); + this.Add(320117, 320100, "溧水区"); + this.Add(320118, 320100, "高淳区"); + this.Add(320205, 320200, "锡山区"); + this.Add(320206, 320200, "惠山区"); + this.Add(320211, 320200, "滨湖区"); + this.Add(320213, 320200, "梁溪区"); + this.Add(320214, 320200, "新吴区"); + this.Add(320281, 320200, "江阴市"); + this.Add(320282, 320200, "宜兴市"); + this.Add(320302, 320300, "鼓楼区"); + this.Add(320303, 320300, "云龙区"); + this.Add(320305, 320300, "贾汪区"); + this.Add(320311, 320300, "泉山区"); + this.Add(320312, 320300, "铜山区"); + this.Add(320321, 320300, "丰县"); + this.Add(320322, 320300, "沛县"); + this.Add(320324, 320300, "睢宁县"); + this.Add(320381, 320300, "新沂市"); + this.Add(320382, 320300, "邳州市"); + this.Add(320402, 320400, "天宁区"); + this.Add(320404, 320400, "钟楼区"); + this.Add(320411, 320400, "新北区"); + this.Add(320412, 320400, "武进区"); + this.Add(320413, 320400, "金坛区"); + this.Add(320481, 320400, "溧阳市"); + this.Add(320505, 320500, "虎丘区"); + this.Add(320506, 320500, "吴中区"); + this.Add(320507, 320500, "相城区"); + this.Add(320508, 320500, "姑苏区"); + this.Add(320509, 320500, "吴江区"); + this.Add(320571, 320500, "苏州工业园区"); + this.Add(320581, 320500, "常熟市"); + this.Add(320582, 320500, "张家港市"); + this.Add(320583, 320500, "昆山市"); + this.Add(320585, 320500, "太仓市"); + this.Add(320602, 320600, "崇川区"); + this.Add(320612, 320600, "通州区"); + this.Add(320623, 320600, "如东县"); + this.Add(320681, 320600, "启东市"); + this.Add(320682, 320600, "如皋市"); + this.Add(320684, 320600, "海门区"); + this.Add(320685, 320600, "海安市"); + this.Add(320703, 320700, "连云区"); + this.Add(320706, 320700, "海州区"); + this.Add(320707, 320700, "赣榆区"); + this.Add(320722, 320700, "东海县"); + this.Add(320723, 320700, "灌云县"); + this.Add(320724, 320700, "灌南县"); + this.Add(320803, 320800, "淮安区"); + this.Add(320804, 320800, "淮阴区"); + this.Add(320812, 320800, "清江浦区"); + this.Add(320813, 320800, "洪泽区"); + this.Add(320826, 320800, "涟水县"); + this.Add(320830, 320800, "盱眙县"); + this.Add(320831, 320800, "金湖县"); + this.Add(320902, 320900, "亭湖区"); + this.Add(320903, 320900, "盐都区"); + this.Add(320904, 320900, "大丰区"); + this.Add(320921, 320900, "响水县"); + this.Add(320922, 320900, "滨海县"); + this.Add(320923, 320900, "阜宁县"); + this.Add(320924, 320900, "射阳县"); + this.Add(320925, 320900, "建湖县"); + this.Add(320981, 320900, "东台市"); + this.Add(321002, 321000, "广陵区"); + this.Add(321003, 321000, "邗江区"); + this.Add(321012, 321000, "江都区"); + this.Add(321023, 321000, "宝应县"); + this.Add(321081, 321000, "仪征市"); + this.Add(321084, 321000, "高邮市"); + this.Add(321102, 321100, "京口区"); + this.Add(321111, 321100, "润州区"); + this.Add(321112, 321100, "丹徒区"); + this.Add(321181, 321100, "丹阳市"); + this.Add(321182, 321100, "扬中市"); + this.Add(321183, 321100, "句容市"); + this.Add(321202, 321200, "海陵区"); + this.Add(321203, 321200, "高港区"); + this.Add(321204, 321200, "姜堰区"); + this.Add(321281, 321200, "兴化市"); + this.Add(321282, 321200, "靖江市"); + this.Add(321283, 321200, "泰兴市"); + this.Add(321302, 321300, "宿城区"); + this.Add(321311, 321300, "宿豫区"); + this.Add(321322, 321300, "沭阳县"); + this.Add(321323, 321300, "泗阳县"); + this.Add(321324, 321300, "泗洪县"); + this.Add(330100, 330000, "杭州市"); + this.Add(330200, 330000, "宁波市"); + this.Add(330300, 330000, "温州市"); + this.Add(330400, 330000, "嘉兴市"); + this.Add(330500, 330000, "湖州市"); + this.Add(330600, 330000, "绍兴市"); + this.Add(330700, 330000, "金华市"); + this.Add(330800, 330000, "衢州市"); + this.Add(330900, 330000, "舟山市"); + this.Add(331000, 330000, "台州市"); + this.Add(331100, 330000, "丽水市"); + this.Add(330102, 330100, "上城区"); + this.Add(330103, 330100, "下城区"); + this.Add(330104, 330100, "江干区"); + this.Add(330105, 330100, "拱墅区"); + this.Add(330106, 330100, "西湖区"); + this.Add(330108, 330100, "滨江区"); + this.Add(330109, 330100, "萧山区"); + this.Add(330110, 330100, "余杭区"); + this.Add(330111, 330100, "富阳区"); + this.Add(330112, 330100, "临安区"); + this.Add(330122, 330100, "桐庐县"); + this.Add(330127, 330100, "淳安县"); + this.Add(330182, 330100, "建德市"); + this.Add(330203, 330200, "海曙区"); + this.Add(330205, 330200, "江北区"); + this.Add(330206, 330200, "北仑区"); + this.Add(330211, 330200, "镇海区"); + this.Add(330212, 330200, "鄞州区"); + this.Add(330213, 330200, "奉化区"); + this.Add(330225, 330200, "象山县"); + this.Add(330226, 330200, "宁海县"); + this.Add(330281, 330200, "余姚市"); + this.Add(330282, 330200, "慈溪市"); + this.Add(330302, 330300, "鹿城区"); + this.Add(330303, 330300, "龙湾区"); + this.Add(330304, 330300, "瓯海区"); + this.Add(330305, 330300, "洞头区"); + this.Add(330324, 330300, "永嘉县"); + this.Add(330326, 330300, "平阳县"); + this.Add(330327, 330300, "苍南县"); + this.Add(330328, 330300, "文成县"); + this.Add(330329, 330300, "泰顺县"); + this.Add(330381, 330300, "瑞安市"); + this.Add(330382, 330300, "乐清市"); + this.Add(330383, 330300, "龙港市"); + this.Add(330402, 330400, "南湖区"); + this.Add(330411, 330400, "秀洲区"); + this.Add(330421, 330400, "嘉善县"); + this.Add(330424, 330400, "海盐县"); + this.Add(330481, 330400, "海宁市"); + this.Add(330482, 330400, "平湖市"); + this.Add(330483, 330400, "桐乡市"); + this.Add(330502, 330500, "吴兴区"); + this.Add(330503, 330500, "南浔区"); + this.Add(330521, 330500, "德清县"); + this.Add(330522, 330500, "长兴县"); + this.Add(330523, 330500, "安吉县"); + this.Add(330602, 330600, "越城区"); + this.Add(330603, 330600, "柯桥区"); + this.Add(330604, 330600, "上虞区"); + this.Add(330624, 330600, "新昌县"); + this.Add(330681, 330600, "诸暨市"); + this.Add(330683, 330600, "嵊州市"); + this.Add(330702, 330700, "婺城区"); + this.Add(330703, 330700, "金东区"); + this.Add(330723, 330700, "武义县"); + this.Add(330726, 330700, "浦江县"); + + this.Add(330727, 330700, "磐安县"); + this.Add(330781, 330700, "兰溪市"); + this.Add(330782, 330700, "义乌市"); + this.Add(330783, 330700, "东阳市"); + this.Add(330784, 330700, "永康市"); + this.Add(330802, 330800, "柯城区"); + this.Add(330803, 330800, "衢江区"); + this.Add(330822, 330800, "常山县"); + this.Add(330824, 330800, "开化县"); + this.Add(330825, 330800, "龙游县"); + this.Add(330881, 330800, "江山市"); + this.Add(330902, 330900, "定海区"); + this.Add(330903, 330900, "普陀区"); + this.Add(330921, 330900, "岱山县"); + this.Add(330922, 330900, "嵊泗县"); + this.Add(331002, 331000, "椒江区"); + this.Add(331003, 331000, "黄岩区"); + this.Add(331004, 331000, "路桥区"); + this.Add(331022, 331000, "三门县"); + this.Add(331023, 331000, "天台县"); + this.Add(331024, 331000, "仙居县"); + this.Add(331081, 331000, "温岭市"); + this.Add(331082, 331000, "临海市"); + this.Add(331083, 331000, "玉环市"); + this.Add(331102, 331100, "莲都区"); + this.Add(331121, 331100, "青田县"); + this.Add(331122, 331100, "缙云县"); + this.Add(331123, 331100, "遂昌县"); + this.Add(331124, 331100, "松阳县"); + this.Add(331125, 331100, "云和县"); + this.Add(331126, 331100, "庆元县"); + this.Add(331127, 331100, "景宁畲族自治县"); + this.Add(331181, 331100, "龙泉市"); + this.Add(340100, 340000, "合肥市"); + this.Add(340200, 340000, "芜湖市"); + this.Add(340300, 340000, "蚌埠市"); + this.Add(340400, 340000, "淮南市"); + this.Add(340500, 340000, "马鞍山市"); + this.Add(340600, 340000, "淮北市"); + this.Add(340700, 340000, "铜陵市"); + this.Add(340800, 340000, "安庆市"); + this.Add(341000, 340000, "黄山市"); + this.Add(341100, 340000, "滁州市"); + this.Add(341200, 340000, "阜阳市"); + this.Add(341300, 340000, "宿州市"); + this.Add(341500, 340000, "六安市"); + this.Add(341600, 340000, "亳州市"); + this.Add(341700, 340000, "池州市"); + this.Add(341800, 340000, "宣城市"); + this.Add(340102, 340100, "瑶海区"); + this.Add(340103, 340100, "庐阳区"); + this.Add(340104, 340100, "蜀山区"); + this.Add(340111, 340100, "包河区"); + this.Add(340121, 340100, "长丰县"); + this.Add(340122, 340100, "肥东县"); + this.Add(340123, 340100, "肥西县"); + this.Add(340124, 340100, "庐江县"); + this.Add(340181, 340100, "巢湖市"); + this.Add(340202, 340200, "镜湖区"); + this.Add(340203, 340200, "弋江区"); + this.Add(340207, 340200, "鸠江区"); + this.Add(340221, 340200, "湾沚区"); + this.Add(340222, 340200, "繁昌区"); + this.Add(340223, 340200, "南陵县"); + this.Add(340281, 340200, "无为市"); + this.Add(340302, 340300, "龙子湖区"); + this.Add(340303, 340300, "蚌山区"); + this.Add(340304, 340300, "禹会区"); + this.Add(340311, 340300, "淮上区"); + this.Add(340321, 340300, "怀远县"); + this.Add(340322, 340300, "五河县"); + this.Add(340323, 340300, "固镇县"); + this.Add(340402, 340400, "大通区"); + this.Add(340403, 340400, "田家庵区"); + this.Add(340404, 340400, "谢家集区"); + this.Add(340405, 340400, "八公山区"); + this.Add(340406, 340400, "潘集区"); + this.Add(340421, 340400, "凤台县"); + this.Add(340422, 340400, "寿县"); + this.Add(340503, 340500, "花山区"); + this.Add(340504, 340500, "雨山区"); + this.Add(340506, 340500, "博望区"); + this.Add(340521, 340500, "当涂县"); + this.Add(340522, 340500, "含山县"); + this.Add(340523, 340500, "和县"); + this.Add(340602, 340600, "杜集区"); + this.Add(340603, 340600, "相山区"); + this.Add(340604, 340600, "烈山区"); + this.Add(340621, 340600, "濉溪县"); + this.Add(340705, 340700, "铜官区"); + this.Add(340706, 340700, "义安区"); + this.Add(340711, 340700, "郊区"); + this.Add(340722, 340700, "枞阳县"); + this.Add(340802, 340800, "迎江区"); + this.Add(340803, 340800, "大观区"); + this.Add(340811, 340800, "宜秀区"); + this.Add(340822, 340800, "怀宁县"); + this.Add(340825, 340800, "太湖县"); + this.Add(340826, 340800, "宿松县"); + this.Add(340827, 340800, "望江县"); + this.Add(340828, 340800, "岳西县"); + this.Add(340881, 340800, "桐城市"); + this.Add(340882, 340800, "潜山市"); + this.Add(341002, 341000, "屯溪区"); + this.Add(341003, 341000, "黄山区"); + this.Add(341004, 341000, "徽州区"); + this.Add(341021, 341000, "歙县"); + this.Add(341022, 341000, "休宁县"); + this.Add(341023, 341000, "黟县"); + this.Add(341024, 341000, "祁门县"); + this.Add(341102, 341100, "琅琊区"); + this.Add(341103, 341100, "南谯区"); + this.Add(341122, 341100, "来安县"); + this.Add(341124, 341100, "全椒县"); + this.Add(341125, 341100, "定远县"); + this.Add(341126, 341100, "凤阳县"); + this.Add(341181, 341100, "天长市"); + this.Add(341182, 341100, "明光市"); + this.Add(341202, 341200, "颍州区"); + this.Add(341203, 341200, "颍东区"); + this.Add(341204, 341200, "颍泉区"); + this.Add(341221, 341200, "临泉县"); + this.Add(341222, 341200, "太和县"); + this.Add(341225, 341200, "阜南县"); + this.Add(341226, 341200, "颍上县"); + this.Add(341282, 341200, "界首市"); + this.Add(341302, 341300, "埇桥区"); + this.Add(341321, 341300, "砀山县"); + this.Add(341322, 341300, "萧县"); + this.Add(341323, 341300, "灵璧县"); + this.Add(341324, 341300, "泗县"); + this.Add(341502, 341500, "金安区"); + this.Add(341503, 341500, "裕安区"); + this.Add(341504, 341500, "叶集区"); + this.Add(341522, 341500, "霍邱县"); + this.Add(341523, 341500, "舒城县"); + this.Add(341524, 341500, "金寨县"); + this.Add(341525, 341500, "霍山县"); + this.Add(341602, 341600, "谯城区"); + this.Add(341621, 341600, "涡阳县"); + this.Add(341622, 341600, "蒙城县"); + this.Add(341623, 341600, "利辛县"); + this.Add(341702, 341700, "贵池区"); + this.Add(341721, 341700, "东至县"); + this.Add(341722, 341700, "石台县"); + this.Add(341723, 341700, "青阳县"); + this.Add(341802, 341800, "宣州区"); + this.Add(341821, 341800, "郎溪县"); + this.Add(341823, 341800, "泾县"); + this.Add(341824, 341800, "绩溪县"); + this.Add(341825, 341800, "旌德县"); + this.Add(341881, 341800, "宁国市"); + this.Add(341882, 341800, "广德市"); + this.Add(350100, 350000, "福州市"); + this.Add(350200, 350000, "厦门市"); + this.Add(350300, 350000, "莆田市"); + this.Add(350400, 350000, "三明市"); + this.Add(350500, 350000, "泉州市"); + this.Add(350600, 350000, "漳州市"); + this.Add(350700, 350000, "南平市"); + this.Add(350800, 350000, "龙岩市"); + this.Add(350900, 350000, "宁德市"); + this.Add(350102, 350100, "鼓楼区"); + this.Add(350103, 350100, "台江区"); + this.Add(350104, 350100, "仓山区"); + this.Add(350105, 350100, "马尾区"); + this.Add(350111, 350100, "晋安区"); + this.Add(350112, 350100, "长乐区"); + this.Add(350121, 350100, "闽侯县"); + this.Add(350122, 350100, "连江县"); + this.Add(350123, 350100, "罗源县"); + this.Add(350124, 350100, "闽清县"); + this.Add(350125, 350100, "永泰县"); + this.Add(350128, 350100, "平潭县"); + this.Add(350181, 350100, "福清市"); + this.Add(350203, 350200, "思明区"); + this.Add(350205, 350200, "海沧区"); + this.Add(350206, 350200, "湖里区"); + this.Add(350211, 350200, "集美区"); + this.Add(350212, 350200, "同安区"); + this.Add(350213, 350200, "翔安区"); + this.Add(350302, 350300, "城厢区"); + this.Add(350303, 350300, "涵江区"); + this.Add(350304, 350300, "荔城区"); + this.Add(350305, 350300, "秀屿区"); + this.Add(350322, 350300, "仙游县"); + this.Add(350402, 350400, "梅列区"); + this.Add(350403, 350400, "三元区"); + this.Add(350421, 350400, "明溪县"); + this.Add(350423, 350400, "清流县"); + this.Add(350424, 350400, "宁化县"); + this.Add(350425, 350400, "大田县"); + this.Add(350426, 350400, "尤溪县"); + this.Add(350427, 350400, "沙县"); + this.Add(350428, 350400, "将乐县"); + this.Add(350429, 350400, "泰宁县"); + this.Add(350430, 350400, "建宁县"); + this.Add(350481, 350400, "永安市"); + this.Add(350502, 350500, "鲤城区"); + this.Add(350503, 350500, "丰泽区"); + this.Add(350504, 350500, "洛江区"); + this.Add(350505, 350500, "泉港区"); + this.Add(350521, 350500, "惠安县"); + this.Add(350524, 350500, "安溪县"); + this.Add(350525, 350500, "永春县"); + this.Add(350526, 350500, "德化县"); + this.Add(350527, 350500, "金门县"); + this.Add(350581, 350500, "石狮市"); + this.Add(350582, 350500, "晋江市"); + this.Add(350583, 350500, "南安市"); + this.Add(350602, 350600, "芗城区"); + this.Add(350603, 350600, "龙文区"); + this.Add(350622, 350600, "云霄县"); + this.Add(350623, 350600, "漳浦县"); + this.Add(350624, 350600, "诏安县"); + this.Add(350625, 350600, "长泰县"); + this.Add(350626, 350600, "东山县"); + this.Add(350627, 350600, "南靖县"); + this.Add(350628, 350600, "平和县"); + this.Add(350629, 350600, "华安县"); + this.Add(350681, 350600, "龙海市"); + this.Add(350702, 350700, "延平区"); + this.Add(350703, 350700, "建阳区"); + this.Add(350721, 350700, "顺昌县"); + this.Add(350722, 350700, "浦城县"); + this.Add(350723, 350700, "光泽县"); + this.Add(350724, 350700, "松溪县"); + this.Add(350725, 350700, "政和县"); + this.Add(350781, 350700, "邵武市"); + this.Add(350782, 350700, "武夷山市"); + this.Add(350783, 350700, "建瓯市"); + this.Add(350802, 350800, "新罗区"); + this.Add(350803, 350800, "永定区"); + this.Add(350821, 350800, "长汀县"); + this.Add(350823, 350800, "上杭县"); + this.Add(350824, 350800, "武平县"); + this.Add(350825, 350800, "连城县"); + this.Add(350881, 350800, "漳平市"); + this.Add(350902, 350900, "蕉城区"); + this.Add(350921, 350900, "霞浦县"); + this.Add(350922, 350900, "古田县"); + this.Add(350923, 350900, "屏南县"); + this.Add(350924, 350900, "寿宁县"); + this.Add(350925, 350900, "周宁县"); + this.Add(350926, 350900, "柘荣县"); + this.Add(350981, 350900, "福安市"); + this.Add(350982, 350900, "福鼎市"); + this.Add(360100, 360000, "南昌市"); + this.Add(360200, 360000, "景德镇市"); + this.Add(360300, 360000, "萍乡市"); + this.Add(360400, 360000, "九江市"); + this.Add(360500, 360000, "新余市"); + this.Add(360600, 360000, "鹰潭市"); + this.Add(360700, 360000, "赣州市"); + this.Add(360800, 360000, "吉安市"); + this.Add(360900, 360000, "宜春市"); + this.Add(361000, 360000, "抚州市"); + this.Add(361100, 360000, "上饶市"); + this.Add(360102, 360100, "东湖区"); + this.Add(360103, 360100, "西湖区"); + this.Add(360104, 360100, "青云谱区"); + this.Add(360111, 360100, "青山湖区"); + this.Add(360112, 360100, "新建区"); + this.Add(360113, 360100, "红谷滩区"); + this.Add(360121, 360100, "南昌县"); + this.Add(360123, 360100, "安义县"); + this.Add(360124, 360100, "进贤县"); + this.Add(360202, 360200, "昌江区"); + this.Add(360203, 360200, "珠山区"); + this.Add(360222, 360200, "浮梁县"); + this.Add(360281, 360200, "乐平市"); + this.Add(360302, 360300, "安源区"); + this.Add(360313, 360300, "湘东区"); + this.Add(360321, 360300, "莲花县"); + this.Add(360322, 360300, "上栗县"); + this.Add(360323, 360300, "芦溪县"); + this.Add(360402, 360400, "濂溪区"); + this.Add(360403, 360400, "浔阳区"); + this.Add(360404, 360400, "柴桑区"); + this.Add(360423, 360400, "武宁县"); + this.Add(360424, 360400, "修水县"); + this.Add(360425, 360400, "永修县"); + this.Add(360426, 360400, "德安县"); + this.Add(360428, 360400, "都昌县"); + this.Add(360429, 360400, "湖口县"); + this.Add(360430, 360400, "彭泽县"); + this.Add(360481, 360400, "瑞昌市"); + this.Add(360482, 360400, "共青城市"); + this.Add(360483, 360400, "庐山市"); + this.Add(360502, 360500, "渝水区"); + this.Add(360521, 360500, "分宜县"); + this.Add(360602, 360600, "月湖区"); + this.Add(360603, 360600, "余江区"); + this.Add(360681, 360600, "贵溪市"); + this.Add(360702, 360700, "章贡区"); + this.Add(360703, 360700, "南康区"); + this.Add(360704, 360700, "赣县区"); + this.Add(360722, 360700, "信丰县"); + this.Add(360723, 360700, "大余县"); + this.Add(360724, 360700, "上犹县"); + this.Add(360725, 360700, "崇义县"); + this.Add(360726, 360700, "安远县"); + this.Add(360728, 360700, "定南县"); + this.Add(360729, 360700, "全南县"); + this.Add(360730, 360700, "宁都县"); + this.Add(360731, 360700, "于都县"); + this.Add(360732, 360700, "兴国县"); + this.Add(360733, 360700, "会昌县"); + this.Add(360734, 360700, "寻乌县"); + this.Add(360735, 360700, "石城县"); + this.Add(360781, 360700, "瑞金市"); + this.Add(360783, 360700, "龙南市"); + this.Add(360802, 360800, "吉州区"); + this.Add(360803, 360800, "青原区"); + this.Add(360821, 360800, "吉安县"); + this.Add(360822, 360800, "吉水县"); + this.Add(360823, 360800, "峡江县"); + this.Add(360824, 360800, "新干县"); + this.Add(360825, 360800, "永丰县"); + this.Add(360826, 360800, "泰和县"); + this.Add(360827, 360800, "遂川县"); + this.Add(360828, 360800, "万安县"); + this.Add(360829, 360800, "安福县"); + this.Add(360830, 360800, "永新县"); + this.Add(360881, 360800, "井冈山市"); + this.Add(360902, 360900, "袁州区"); + this.Add(360921, 360900, "奉新县"); + this.Add(360922, 360900, "万载县"); + this.Add(360923, 360900, "上高县"); + this.Add(360924, 360900, "宜丰县"); + this.Add(360925, 360900, "靖安县"); + this.Add(360926, 360900, "铜鼓县"); + this.Add(360981, 360900, "丰城市"); + this.Add(360982, 360900, "樟树市"); + this.Add(360983, 360900, "高安市"); + this.Add(361002, 361000, "临川区"); + this.Add(361003, 361000, "东乡区"); + this.Add(361021, 361000, "南城县"); + this.Add(361022, 361000, "黎川县"); + this.Add(361023, 361000, "南丰县"); + this.Add(361024, 361000, "崇仁县"); + this.Add(361025, 361000, "乐安县"); + this.Add(361026, 361000, "宜黄县"); + this.Add(361027, 361000, "金溪县"); + this.Add(361028, 361000, "资溪县"); + this.Add(361030, 361000, "广昌县"); + this.Add(361102, 361100, "信州区"); + this.Add(361103, 361100, "广丰区"); + this.Add(361104, 361100, "广信区"); + this.Add(361123, 361100, "玉山县"); + this.Add(361124, 361100, "铅山县"); + this.Add(361125, 361100, "横峰县"); + this.Add(361126, 361100, "弋阳县"); + this.Add(361127, 361100, "余干县"); + this.Add(361128, 361100, "鄱阳县"); + this.Add(361129, 361100, "万年县"); + this.Add(361130, 361100, "婺源县"); + this.Add(361181, 361100, "德兴市"); + this.Add(370100, 370000, "济南市"); + this.Add(370200, 370000, "青岛市"); + this.Add(370300, 370000, "淄博市"); + this.Add(370400, 370000, "枣庄市"); + this.Add(370500, 370000, "东营市"); + this.Add(370600, 370000, "烟台市"); + this.Add(370700, 370000, "潍坊市"); + this.Add(370800, 370000, "济宁市"); + this.Add(370900, 370000, "泰安市"); + this.Add(371000, 370000, "威海市"); + this.Add(371100, 370000, "日照市"); + this.Add(371300, 370000, "临沂市"); + this.Add(371400, 370000, "德州市"); + this.Add(371500, 370000, "聊城市"); + this.Add(371600, 370000, "滨州市"); + this.Add(371700, 370000, "菏泽市"); + this.Add(370102, 370100, "历下区"); + this.Add(370103, 370100, "市中区"); + this.Add(370104, 370100, "槐荫区"); + this.Add(370105, 370100, "天桥区"); + this.Add(370112, 370100, "历城区"); + this.Add(370113, 370100, "长清区"); + this.Add(370114, 370100, "章丘区"); + this.Add(370115, 370100, "济阳区"); + this.Add(370116, 370100, "莱芜区"); + this.Add(370117, 370100, "钢城区"); + this.Add(370124, 370100, "平阴县"); + this.Add(370126, 370100, "商河县"); + this.Add(370202, 370200, "市南区"); + this.Add(370203, 370200, "市北区"); + this.Add(370211, 370200, "黄岛区"); + this.Add(370212, 370200, "崂山区"); + this.Add(370213, 370200, "李沧区"); + this.Add(370214, 370200, "城阳区"); + this.Add(370215, 370200, "即墨区"); + this.Add(370281, 370200, "胶州市"); + this.Add(370283, 370200, "平度市"); + this.Add(370285, 370200, "莱西市"); + this.Add(370302, 370300, "淄川区"); + this.Add(370303, 370300, "张店区"); + this.Add(370304, 370300, "博山区"); + this.Add(370305, 370300, "临淄区"); + this.Add(370306, 370300, "周村区"); + this.Add(370321, 370300, "桓台县"); + this.Add(370322, 370300, "高青县"); + this.Add(370323, 370300, "沂源县"); + this.Add(370402, 370400, "市中区"); + this.Add(370403, 370400, "薛城区"); + this.Add(370404, 370400, "峄城区"); + this.Add(370405, 370400, "台儿庄区"); + this.Add(370406, 370400, "山亭区"); + this.Add(370481, 370400, "滕州市"); + this.Add(370502, 370500, "东营区"); + this.Add(370503, 370500, "河口区"); + this.Add(370505, 370500, "垦利区"); + this.Add(370522, 370500, "利津县"); + this.Add(370523, 370500, "广饶县"); + this.Add(370602, 370600, "芝罘区"); + this.Add(370611, 370600, "福山区"); + this.Add(370612, 370600, "牟平区"); + this.Add(370613, 370600, "莱山区"); + this.Add(370614, 370600, "蓬莱区"); + this.Add(370681, 370600, "龙口市"); + this.Add(370682, 370600, "莱阳市"); + this.Add(370683, 370600, "莱州市"); + this.Add(370685, 370600, "招远市"); + this.Add(370686, 370600, "栖霞市"); + this.Add(370687, 370600, "海阳市"); + this.Add(370702, 370700, "潍城区"); + this.Add(370703, 370700, "寒亭区"); + this.Add(370704, 370700, "坊子区"); + this.Add(370705, 370700, "奎文区"); + this.Add(370724, 370700, "临朐县"); + this.Add(370725, 370700, "昌乐县"); + this.Add(370781, 370700, "青州市"); + this.Add(370782, 370700, "诸城市"); + this.Add(370783, 370700, "寿光市"); + this.Add(370784, 370700, "安丘市"); + this.Add(370785, 370700, "高密市"); + this.Add(370786, 370700, "昌邑市"); + this.Add(370811, 370800, "任城区"); + this.Add(370812, 370800, "兖州区"); + this.Add(370826, 370800, "微山县"); + this.Add(370827, 370800, "鱼台县"); + this.Add(370828, 370800, "金乡县"); + this.Add(370829, 370800, "嘉祥县"); + this.Add(370830, 370800, "汶上县"); + this.Add(370831, 370800, "泗水县"); + this.Add(370832, 370800, "梁山县"); + this.Add(370881, 370800, "曲阜市"); + this.Add(370883, 370800, "邹城市"); + this.Add(370902, 370900, "泰山区"); + this.Add(370911, 370900, "岱岳区"); + this.Add(370921, 370900, "宁阳县"); + this.Add(370923, 370900, "东平县"); + this.Add(370982, 370900, "新泰市"); + this.Add(370983, 370900, "肥城市"); + this.Add(371002, 371000, "环翠区"); + this.Add(371003, 371000, "文登区"); + this.Add(371082, 371000, "荣成市"); + this.Add(371083, 371000, "乳山市"); + this.Add(371102, 371100, "东港区"); + this.Add(371103, 371100, "岚山区"); + this.Add(371121, 371100, "五莲县"); + this.Add(371122, 371100, "莒县"); + this.Add(371302, 371300, "兰山区"); + this.Add(371311, 371300, "罗庄区"); + this.Add(371312, 371300, "河东区"); + this.Add(371321, 371300, "沂南县"); + this.Add(371322, 371300, "郯城县"); + this.Add(371323, 371300, "沂水县"); + this.Add(371324, 371300, "兰陵县"); + this.Add(371325, 371300, "费县"); + this.Add(371326, 371300, "平邑县"); + this.Add(371327, 371300, "莒南县"); + this.Add(371328, 371300, "蒙阴县"); + this.Add(371329, 371300, "临沭县"); + this.Add(371402, 371400, "德城区"); + this.Add(371403, 371400, "陵城区"); + this.Add(371422, 371400, "宁津县"); + this.Add(371423, 371400, "庆云县"); + this.Add(371424, 371400, "临邑县"); + this.Add(371425, 371400, "齐河县"); + this.Add(371426, 371400, "平原县"); + this.Add(371427, 371400, "夏津县"); + this.Add(371428, 371400, "武城县"); + this.Add(371481, 371400, "乐陵市"); + this.Add(371482, 371400, "禹城市"); + this.Add(371502, 371500, "东昌府区"); + this.Add(371503, 371500, "茌平区"); + this.Add(371521, 371500, "阳谷县"); + this.Add(371522, 371500, "莘县"); + this.Add(371524, 371500, "东阿县"); + this.Add(371525, 371500, "冠县"); + this.Add(371526, 371500, "高唐县"); + this.Add(371581, 371500, "临清市"); + this.Add(371602, 371600, "滨城区"); + this.Add(371603, 371600, "沾化区"); + this.Add(371621, 371600, "惠民县"); + this.Add(371622, 371600, "阳信县"); + this.Add(371623, 371600, "无棣县"); + this.Add(371625, 371600, "博兴县"); + this.Add(371681, 371600, "邹平市"); + this.Add(371702, 371700, "牡丹区"); + this.Add(371703, 371700, "定陶区"); + this.Add(371721, 371700, "曹县"); + this.Add(371722, 371700, "单县"); + this.Add(371723, 371700, "成武县"); + this.Add(371724, 371700, "巨野县"); + this.Add(371725, 371700, "郓城县"); + this.Add(371726, 371700, "鄄城县"); + this.Add(371728, 371700, "东明县"); + this.Add(410100, 410000, "郑州市"); + this.Add(410200, 410000, "开封市"); + this.Add(410300, 410000, "洛阳市"); + this.Add(410400, 410000, "平顶山市"); + this.Add(410500, 410000, "安阳市"); + this.Add(410600, 410000, "鹤壁市"); + this.Add(410700, 410000, "新乡市"); + this.Add(410800, 410000, "焦作市"); + this.Add(410900, 410000, "濮阳市"); + this.Add(411000, 410000, "许昌市"); + this.Add(411100, 410000, "漯河市"); + this.Add(411200, 410000, "三门峡市"); + this.Add(411300, 410000, "南阳市"); + this.Add(411400, 410000, "商丘市"); + this.Add(411500, 410000, "信阳市"); + this.Add(411600, 410000, "周口市"); + this.Add(411700, 410000, "驻马店市"); + this.Add(419001, 410000, "济源市"); + this.Add(410102, 410100, "中原区"); + this.Add(410103, 410100, "二七区"); + this.Add(410104, 410100, "管城回族区"); + this.Add(410105, 410100, "金水区"); + this.Add(410106, 410100, "上街区"); + this.Add(410108, 410100, "惠济区"); + this.Add(410122, 410100, "中牟县"); + this.Add(410181, 410100, "巩义市"); + this.Add(410182, 410100, "荥阳市"); + this.Add(410183, 410100, "新密市"); + this.Add(410184, 410100, "新郑市"); + this.Add(410185, 410100, "登封市"); + this.Add(410202, 410200, "龙亭区"); + this.Add(410203, 410200, "顺河回族区"); + this.Add(410204, 410200, "鼓楼区"); + this.Add(410205, 410200, "禹王台区"); + this.Add(410212, 410200, "祥符区"); + this.Add(410221, 410200, "杞县"); + this.Add(410222, 410200, "通许县"); + this.Add(410223, 410200, "尉氏县"); + this.Add(410225, 410200, "兰考县"); + this.Add(410302, 410300, "老城区"); + this.Add(410303, 410300, "西工区"); + this.Add(410304, 410300, "瀍河回族区"); + this.Add(410305, 410300, "涧西区"); + this.Add(410306, 410300, "吉利区"); + this.Add(410311, 410300, "洛龙区"); + this.Add(410322, 410300, "孟津县"); + this.Add(410323, 410300, "新安县"); + this.Add(410324, 410300, "栾川县"); + this.Add(410325, 410300, "嵩县"); + this.Add(410326, 410300, "汝阳县"); + this.Add(410327, 410300, "宜阳县"); + this.Add(410328, 410300, "洛宁县"); + this.Add(410329, 410300, "伊川县"); + this.Add(410381, 410300, "偃师市"); + this.Add(410402, 410400, "新华区"); + this.Add(410403, 410400, "卫东区"); + this.Add(410404, 410400, "石龙区"); + this.Add(410411, 410400, "湛河区"); + this.Add(410421, 410400, "宝丰县"); + this.Add(410422, 410400, "叶县"); + this.Add(410423, 410400, "鲁山县"); + this.Add(410425, 410400, "郏县"); + this.Add(410481, 410400, "舞钢市"); + this.Add(410482, 410400, "汝州市"); + this.Add(410502, 410500, "文峰区"); + this.Add(410503, 410500, "北关区"); + this.Add(410505, 410500, "殷都区"); + this.Add(410506, 410500, "龙安区"); + this.Add(410522, 410500, "安阳县"); + this.Add(410523, 410500, "汤阴县"); + this.Add(410526, 410500, "滑县"); + this.Add(410527, 410500, "内黄县"); + this.Add(410581, 410500, "林州市"); + this.Add(410602, 410600, "鹤山区"); + this.Add(410603, 410600, "山城区"); + this.Add(410611, 410600, "淇滨区"); + this.Add(410621, 410600, "浚县"); + this.Add(410622, 410600, "淇县"); + this.Add(410702, 410700, "红旗区"); + this.Add(410703, 410700, "卫滨区"); + this.Add(410704, 410700, "凤泉区"); + this.Add(410711, 410700, "牧野区"); + this.Add(410721, 410700, "新乡县"); + this.Add(410724, 410700, "获嘉县"); + this.Add(410725, 410700, "原阳县"); + this.Add(410726, 410700, "延津县"); + this.Add(410727, 410700, "封丘县"); + this.Add(410781, 410700, "卫辉市"); + this.Add(410782, 410700, "辉县市"); + this.Add(410783, 410700, "长垣市"); + this.Add(410802, 410800, "解放区"); + this.Add(410803, 410800, "中站区"); + this.Add(410804, 410800, "马村区"); + this.Add(410811, 410800, "山阳区"); + this.Add(410821, 410800, "修武县"); + this.Add(410822, 410800, "博爱县"); + this.Add(410823, 410800, "武陟县"); + this.Add(410825, 410800, "温县"); + this.Add(410882, 410800, "沁阳市"); + this.Add(410883, 410800, "孟州市"); + this.Add(410902, 410900, "华龙区"); + this.Add(410922, 410900, "清丰县"); + this.Add(410923, 410900, "南乐县"); + this.Add(410926, 410900, "范县"); + this.Add(410927, 410900, "台前县"); + this.Add(410928, 410900, "濮阳县"); + this.Add(411002, 411000, "魏都区"); + this.Add(411003, 411000, "建安区"); + this.Add(411024, 411000, "鄢陵县"); + this.Add(411025, 411000, "襄城县"); + this.Add(411081, 411000, "禹州市"); + this.Add(411082, 411000, "长葛市"); + this.Add(411102, 411100, "源汇区"); + this.Add(411103, 411100, "郾城区"); + this.Add(411104, 411100, "召陵区"); + this.Add(411121, 411100, "舞阳县"); + this.Add(411122, 411100, "临颍县"); + this.Add(411202, 411200, "湖滨区"); + this.Add(411203, 411200, "陕州区"); + this.Add(411221, 411200, "渑池县"); + this.Add(411224, 411200, "卢氏县"); + this.Add(411281, 411200, "义马市"); + this.Add(411282, 411200, "灵宝市"); + this.Add(411302, 411300, "宛城区"); + this.Add(411303, 411300, "卧龙区"); + this.Add(411321, 411300, "南召县"); + this.Add(411322, 411300, "方城县"); + this.Add(411323, 411300, "西峡县"); + this.Add(411324, 411300, "镇平县"); + this.Add(411325, 411300, "内乡县"); + this.Add(411326, 411300, "淅川县"); + this.Add(411327, 411300, "社旗县"); + this.Add(411328, 411300, "唐河县"); + this.Add(411329, 411300, "新野县"); + this.Add(411330, 411300, "桐柏县"); + this.Add(411381, 411300, "邓州市"); + this.Add(411402, 411400, "梁园区"); + this.Add(411403, 411400, "睢阳区"); + this.Add(411421, 411400, "民权县"); + this.Add(411422, 411400, "睢县"); + this.Add(411423, 411400, "宁陵县"); + this.Add(411424, 411400, "柘城县"); + this.Add(411425, 411400, "虞城县"); + this.Add(411426, 411400, "夏邑县"); + this.Add(411481, 411400, "永城市"); + this.Add(411502, 411500, "浉河区"); + this.Add(411503, 411500, "平桥区"); + this.Add(411521, 411500, "罗山县"); + this.Add(411522, 411500, "光山县"); + this.Add(411523, 411500, "新县"); + this.Add(411524, 411500, "商城县"); + this.Add(411525, 411500, "固始县"); + this.Add(411526, 411500, "潢川县"); + this.Add(411527, 411500, "淮滨县"); + this.Add(411528, 411500, "息县"); + this.Add(411602, 411600, "川汇区"); + this.Add(411603, 411600, "淮阳区"); + this.Add(411621, 411600, "扶沟县"); + this.Add(411622, 411600, "西华县"); + this.Add(411623, 411600, "商水县"); + this.Add(411624, 411600, "沈丘县"); + this.Add(411625, 411600, "郸城县"); + this.Add(411627, 411600, "太康县"); + this.Add(411628, 411600, "鹿邑县"); + this.Add(411681, 411600, "项城市"); + this.Add(411702, 411700, "驿城区"); + this.Add(411721, 411700, "西平县"); + this.Add(411722, 411700, "上蔡县"); + this.Add(411723, 411700, "平舆县"); + this.Add(411724, 411700, "正阳县"); + this.Add(411725, 411700, "确山县"); + this.Add(411726, 411700, "泌阳县"); + this.Add(411727, 411700, "汝南县"); + this.Add(411728, 411700, "遂平县"); + this.Add(411729, 411700, "新蔡县"); + this.Add(420100, 420000, "武汉市"); + this.Add(420200, 420000, "黄石市"); + this.Add(420300, 420000, "十堰市"); + this.Add(420500, 420000, "宜昌市"); + this.Add(420600, 420000, "襄阳市"); + this.Add(420700, 420000, "鄂州市"); + this.Add(420800, 420000, "荆门市"); + this.Add(420900, 420000, "孝感市"); + this.Add(421000, 420000, "荆州市"); + this.Add(421100, 420000, "黄冈市"); + this.Add(421200, 420000, "咸宁市"); + this.Add(421300, 420000, "随州市"); + this.Add(422800, 420000, "恩施土家族苗族自治州"); + this.Add(429004, 420000, "仙桃市"); + this.Add(429005, 420000, "潜江市"); + this.Add(429006, 420000, "天门市"); + this.Add(429021, 420000, "神农架林区"); + this.Add(420102, 420100, "江岸区"); + this.Add(420103, 420100, "江汉区"); + this.Add(420104, 420100, "硚口区"); + this.Add(420105, 420100, "汉阳区"); + this.Add(420106, 420100, "武昌区"); + this.Add(420107, 420100, "青山区"); + this.Add(420111, 420100, "洪山区"); + this.Add(420112, 420100, "东西湖区"); + this.Add(420113, 420100, "汉南区"); + this.Add(420114, 420100, "蔡甸区"); + this.Add(420115, 420100, "江夏区"); + this.Add(420116, 420100, "黄陂区"); + this.Add(420117, 420100, "新洲区"); + this.Add(420202, 420200, "黄石港区"); + this.Add(420203, 420200, "西塞山区"); + this.Add(420204, 420200, "下陆区"); + this.Add(420205, 420200, "铁山区"); + this.Add(420222, 420200, "阳新县"); + this.Add(420281, 420200, "大冶市"); + this.Add(420302, 420300, "茅箭区"); + this.Add(420303, 420300, "张湾区"); + this.Add(420304, 420300, "郧阳区"); + this.Add(420322, 420300, "郧西县"); + this.Add(420323, 420300, "竹山县"); + this.Add(420324, 420300, "竹溪县"); + this.Add(420325, 420300, "房县"); + this.Add(420381, 420300, "丹江口市"); + this.Add(420502, 420500, "西陵区"); + this.Add(420503, 420500, "伍家岗区"); + this.Add(420504, 420500, "点军区"); + this.Add(420505, 420500, "猇亭区"); + this.Add(420506, 420500, "夷陵区"); + this.Add(420525, 420500, "远安县"); + this.Add(420526, 420500, "兴山县"); + this.Add(420527, 420500, "秭归县"); + this.Add(420528, 420500, "长阳土家族自治县"); + this.Add(420529, 420500, "五峰土家族自治县"); + this.Add(420581, 420500, "宜都市"); + this.Add(420582, 420500, "当阳市"); + this.Add(420583, 420500, "枝江市"); + this.Add(420602, 420600, "襄城区"); + this.Add(420606, 420600, "樊城区"); + this.Add(420607, 420600, "襄州区"); + this.Add(420624, 420600, "南漳县"); + this.Add(420625, 420600, "谷城县"); + this.Add(420626, 420600, "保康县"); + this.Add(420682, 420600, "老河口市"); + this.Add(420683, 420600, "枣阳市"); + this.Add(420684, 420600, "宜城市"); + this.Add(420702, 420700, "梁子湖区"); + this.Add(420703, 420700, "华容区"); + this.Add(420704, 420700, "鄂城区"); + this.Add(420802, 420800, "东宝区"); + this.Add(420804, 420800, "掇刀区"); + this.Add(420822, 420800, "沙洋县"); + this.Add(420881, 420800, "钟祥市"); + this.Add(420882, 420800, "京山市"); + this.Add(420902, 420900, "孝南区"); + this.Add(420921, 420900, "孝昌县"); + this.Add(420922, 420900, "大悟县"); + this.Add(420923, 420900, "云梦县"); + this.Add(420981, 420900, "应城市"); + this.Add(420982, 420900, "安陆市"); + this.Add(420984, 420900, "汉川市"); + this.Add(421002, 421000, "沙市区"); + this.Add(421003, 421000, "荆州区"); + this.Add(421022, 421000, "公安县"); + this.Add(421023, 421000, "监利市"); + this.Add(421024, 421000, "江陵县"); + this.Add(421081, 421000, "石首市"); + this.Add(421083, 421000, "洪湖市"); + this.Add(421087, 421000, "松滋市"); + this.Add(421102, 421100, "黄州区"); + this.Add(421121, 421100, "团风县"); + this.Add(421122, 421100, "红安县"); + this.Add(421123, 421100, "罗田县"); + this.Add(421124, 421100, "英山县"); + this.Add(421125, 421100, "浠水县"); + this.Add(421126, 421100, "蕲春县"); + this.Add(421127, 421100, "黄梅县"); + this.Add(421181, 421100, "麻城市"); + this.Add(421182, 421100, "武穴市"); + this.Add(421202, 421200, "咸安区"); + this.Add(421221, 421200, "嘉鱼县"); + this.Add(421222, 421200, "通城县"); + this.Add(421223, 421200, "崇阳县"); + this.Add(421224, 421200, "通山县"); + this.Add(421281, 421200, "赤壁市"); + this.Add(421303, 421300, "曾都区"); + this.Add(421321, 421300, "随县"); + this.Add(421381, 421300, "广水市"); + this.Add(422801, 422800, "恩施市"); + this.Add(422802, 422800, "利川市"); + this.Add(422822, 422800, "建始县"); + this.Add(422823, 422800, "巴东县"); + this.Add(422825, 422800, "宣恩县"); + this.Add(422826, 422800, "咸丰县"); + this.Add(422827, 422800, "来凤县"); + this.Add(422828, 422800, "鹤峰县"); + this.Add(430100, 430000, "长沙市"); + this.Add(430200, 430000, "株洲市"); + this.Add(430300, 430000, "湘潭市"); + this.Add(430400, 430000, "衡阳市"); + this.Add(430500, 430000, "邵阳市"); + this.Add(430600, 430000, "岳阳市"); + this.Add(430700, 430000, "常德市"); + this.Add(430800, 430000, "张家界市"); + this.Add(430900, 430000, "益阳市"); + this.Add(431000, 430000, "郴州市"); + this.Add(431100, 430000, "永州市"); + this.Add(431200, 430000, "怀化市"); + this.Add(431300, 430000, "娄底市"); + this.Add(433100, 430000, "湘西土家族苗族自治州"); + this.Add(430102, 430100, "芙蓉区"); + this.Add(430103, 430100, "天心区"); + this.Add(430104, 430100, "岳麓区"); + this.Add(430105, 430100, "开福区"); + this.Add(430111, 430100, "雨花区"); + this.Add(430112, 430100, "望城区"); + this.Add(430121, 430100, "长沙县"); + this.Add(430181, 430100, "浏阳市"); + this.Add(430182, 430100, "宁乡市"); + this.Add(430202, 430200, "荷塘区"); + this.Add(430203, 430200, "芦淞区"); + this.Add(430204, 430200, "石峰区"); + this.Add(430211, 430200, "天元区"); + this.Add(430212, 430200, "渌口区"); + this.Add(430223, 430200, "攸县"); + this.Add(430224, 430200, "茶陵县"); + this.Add(430225, 430200, "炎陵县"); + this.Add(430281, 430200, "醴陵市"); + this.Add(430302, 430300, "雨湖区"); + this.Add(430304, 430300, "岳塘区"); + this.Add(430321, 430300, "湘潭县"); + this.Add(430381, 430300, "湘乡市"); + this.Add(430382, 430300, "韶山市"); + this.Add(430405, 430400, "珠晖区"); + this.Add(430406, 430400, "雁峰区"); + this.Add(430407, 430400, "石鼓区"); + this.Add(430408, 430400, "蒸湘区"); + this.Add(430412, 430400, "南岳区"); + this.Add(430421, 430400, "衡阳县"); + this.Add(430422, 430400, "衡南县"); + this.Add(430423, 430400, "衡山县"); + this.Add(430424, 430400, "衡东县"); + this.Add(430426, 430400, "祁东县"); + this.Add(430481, 430400, "耒阳市"); + this.Add(430482, 430400, "常宁市"); + this.Add(430502, 430500, "双清区"); + this.Add(430503, 430500, "大祥区"); + this.Add(430511, 430500, "北塔区"); + this.Add(430522, 430500, "新邵县"); + this.Add(430523, 430500, "邵阳县"); + this.Add(430524, 430500, "隆回县"); + this.Add(430525, 430500, "洞口县"); + this.Add(430527, 430500, "绥宁县"); + this.Add(430528, 430500, "新宁县"); + this.Add(430529, 430500, "城步苗族自治县"); + this.Add(430581, 430500, "武冈市"); + this.Add(430582, 430500, "邵东市"); + this.Add(430602, 430600, "岳阳楼区"); + this.Add(430603, 430600, "云溪区"); + this.Add(430611, 430600, "君山区"); + this.Add(430621, 430600, "岳阳县"); + this.Add(430623, 430600, "华容县"); + this.Add(430624, 430600, "湘阴县"); + this.Add(430626, 430600, "平江县"); + this.Add(430681, 430600, "汨罗市"); + this.Add(430682, 430600, "临湘市"); + this.Add(430702, 430700, "武陵区"); + this.Add(430703, 430700, "鼎城区"); + this.Add(430721, 430700, "安乡县"); + this.Add(430722, 430700, "汉寿县"); + this.Add(430723, 430700, "澧县"); + this.Add(430724, 430700, "临澧县"); + this.Add(430725, 430700, "桃源县"); + this.Add(430726, 430700, "石门县"); + this.Add(430781, 430700, "津市市"); + this.Add(430802, 430800, "永定区"); + this.Add(430811, 430800, "武陵源区"); + this.Add(430821, 430800, "慈利县"); + this.Add(430822, 430800, "桑植县"); + this.Add(430902, 430900, "资阳区"); + this.Add(430903, 430900, "赫山区"); + this.Add(430921, 430900, "南县"); + this.Add(430922, 430900, "桃江县"); + this.Add(430923, 430900, "安化县"); + this.Add(430981, 430900, "沅江市"); + this.Add(431002, 431000, "北湖区"); + this.Add(431003, 431000, "苏仙区"); + this.Add(431021, 431000, "桂阳县"); + this.Add(431022, 431000, "宜章县"); + this.Add(431023, 431000, "永兴县"); + this.Add(431024, 431000, "嘉禾县"); + this.Add(431025, 431000, "临武县"); + this.Add(431026, 431000, "汝城县"); + this.Add(431027, 431000, "桂东县"); + this.Add(431028, 431000, "安仁县"); + this.Add(431081, 431000, "资兴市"); + this.Add(431102, 431100, "零陵区"); + this.Add(431103, 431100, "冷水滩区"); + this.Add(431121, 431100, "祁阳县"); + this.Add(431122, 431100, "东安县"); + this.Add(431123, 431100, "双牌县"); + this.Add(431124, 431100, "道县"); + this.Add(431125, 431100, "江永县"); + this.Add(431126, 431100, "宁远县"); + this.Add(431127, 431100, "蓝山县"); + this.Add(431128, 431100, "新田县"); + this.Add(431129, 431100, "江华瑶族自治县"); + this.Add(431202, 431200, "鹤城区"); + this.Add(431221, 431200, "中方县"); + this.Add(431222, 431200, "沅陵县"); + this.Add(431223, 431200, "辰溪县"); + this.Add(431224, 431200, "溆浦县"); + this.Add(431225, 431200, "会同县"); + this.Add(431226, 431200, "麻阳苗族自治县"); + this.Add(431227, 431200, "新晃侗族自治县"); + this.Add(431228, 431200, "芷江侗族自治县"); + this.Add(431229, 431200, "靖州苗族侗族自治县"); + this.Add(431230, 431200, "通道侗族自治县"); + this.Add(431281, 431200, "洪江市"); + this.Add(431302, 431300, "娄星区"); + this.Add(431321, 431300, "双峰县"); + this.Add(431322, 431300, "新化县"); + this.Add(431381, 431300, "冷水江市"); + this.Add(431382, 431300, "涟源市"); + this.Add(433101, 433100, "吉首市"); + this.Add(433122, 433100, "泸溪县"); + this.Add(433123, 433100, "凤凰县"); + this.Add(433124, 433100, "花垣县"); + this.Add(433125, 433100, "保靖县"); + this.Add(433126, 433100, "古丈县"); + this.Add(433127, 433100, "永顺县"); + this.Add(433130, 433100, "龙山县"); + this.Add(440100, 440000, "广州市"); + this.Add(440200, 440000, "韶关市"); + this.Add(440300, 440000, "深圳市"); + this.Add(440400, 440000, "珠海市"); + this.Add(440500, 440000, "汕头市"); + this.Add(440600, 440000, "佛山市"); + this.Add(440700, 440000, "江门市"); + this.Add(440800, 440000, "湛江市"); + this.Add(440900, 440000, "茂名市"); + this.Add(441200, 440000, "肇庆市"); + this.Add(441300, 440000, "惠州市"); + this.Add(441400, 440000, "梅州市"); + this.Add(441500, 440000, "汕尾市"); + this.Add(441600, 440000, "河源市"); + this.Add(441700, 440000, "阳江市"); + this.Add(441800, 440000, "清远市"); + this.Add(441900, 440000, "东莞市"); + this.Add(442000, 440000, "中山市"); + this.Add(445100, 440000, "潮州市"); + this.Add(445200, 440000, "揭阳市"); + this.Add(445300, 440000, "云浮市"); + this.Add(440103, 440100, "荔湾区"); + this.Add(440104, 440100, "越秀区"); + this.Add(440105, 440100, "海珠区"); + this.Add(440106, 440100, "天河区"); + this.Add(440111, 440100, "白云区"); + this.Add(440112, 440100, "黄埔区"); + this.Add(440113, 440100, "番禺区"); + this.Add(440114, 440100, "花都区"); + this.Add(440115, 440100, "南沙区"); + this.Add(440117, 440100, "从化区"); + this.Add(440118, 440100, "增城区"); + this.Add(440203, 440200, "武江区"); + this.Add(440204, 440200, "浈江区"); + this.Add(440205, 440200, "曲江区"); + this.Add(440222, 440200, "始兴县"); + this.Add(440224, 440200, "仁化县"); + this.Add(440229, 440200, "翁源县"); + this.Add(440232, 440200, "乳源瑶族自治县"); + this.Add(440233, 440200, "新丰县"); + this.Add(440281, 440200, "乐昌市"); + this.Add(440282, 440200, "南雄市"); + this.Add(440303, 440300, "罗湖区"); + this.Add(440304, 440300, "福田区"); + this.Add(440305, 440300, "南山区"); + this.Add(440306, 440300, "宝安区"); + this.Add(440307, 440300, "龙岗区"); + this.Add(440308, 440300, "盐田区"); + this.Add(440309, 440300, "龙华区"); + this.Add(440310, 440300, "坪山区"); + this.Add(440311, 440300, "光明区"); + this.Add(440402, 440400, "香洲区"); + this.Add(440403, 440400, "斗门区"); + this.Add(440404, 440400, "金湾区"); + this.Add(440507, 440500, "龙湖区"); + this.Add(440511, 440500, "金平区"); + this.Add(440512, 440500, "濠江区"); + this.Add(440513, 440500, "潮阳区"); + this.Add(440514, 440500, "潮南区"); + this.Add(440515, 440500, "澄海区"); + this.Add(440523, 440500, "南澳县"); + this.Add(440604, 440600, "禅城区"); + this.Add(440605, 440600, "南海区"); + + this.Add(440606, 440600, "顺德区"); + this.Add(440607, 440600, "三水区"); + this.Add(440608, 440600, "高明区"); + this.Add(440703, 440700, "蓬江区"); + this.Add(440704, 440700, "江海区"); + this.Add(440705, 440700, "新会区"); + this.Add(440781, 440700, "台山市"); + this.Add(440783, 440700, "开平市"); + this.Add(440784, 440700, "鹤山市"); + this.Add(440785, 440700, "恩平市"); + this.Add(440802, 440800, "赤坎区"); + this.Add(440803, 440800, "霞山区"); + this.Add(440804, 440800, "坡头区"); + this.Add(440811, 440800, "麻章区"); + this.Add(440823, 440800, "遂溪县"); + this.Add(440825, 440800, "徐闻县"); + this.Add(440881, 440800, "廉江市"); + this.Add(440882, 440800, "雷州市"); + this.Add(440883, 440800, "吴川市"); + this.Add(440902, 440900, "茂南区"); + this.Add(440904, 440900, "电白区"); + this.Add(440981, 440900, "高州市"); + this.Add(440982, 440900, "化州市"); + this.Add(440983, 440900, "信宜市"); + this.Add(441202, 441200, "端州区"); + this.Add(441203, 441200, "鼎湖区"); + this.Add(441204, 441200, "高要区"); + this.Add(441223, 441200, "广宁县"); + this.Add(441224, 441200, "怀集县"); + this.Add(441225, 441200, "封开县"); + this.Add(441226, 441200, "德庆县"); + this.Add(441284, 441200, "四会市"); + this.Add(441302, 441300, "惠城区"); + this.Add(441303, 441300, "惠阳区"); + this.Add(441322, 441300, "博罗县"); + this.Add(441323, 441300, "惠东县"); + this.Add(441324, 441300, "龙门县"); + this.Add(441402, 441400, "梅江区"); + this.Add(441403, 441400, "梅县区"); + this.Add(441422, 441400, "大埔县"); + this.Add(441423, 441400, "丰顺县"); + this.Add(441424, 441400, "五华县"); + this.Add(441426, 441400, "平远县"); + this.Add(441427, 441400, "蕉岭县"); + this.Add(441481, 441400, "兴宁市"); + this.Add(441502, 441500, "城区"); + this.Add(441521, 441500, "海丰县"); + this.Add(441523, 441500, "陆河县"); + this.Add(441581, 441500, "陆丰市"); + this.Add(441602, 441600, "源城区"); + this.Add(441621, 441600, "紫金县"); + this.Add(441622, 441600, "龙川县"); + this.Add(441623, 441600, "连平县"); + this.Add(441624, 441600, "和平县"); + this.Add(441625, 441600, "东源县"); + this.Add(441702, 441700, "江城区"); + this.Add(441704, 441700, "阳东区"); + this.Add(441721, 441700, "阳西县"); + this.Add(441781, 441700, "阳春市"); + this.Add(441802, 441800, "清城区"); + this.Add(441803, 441800, "清新区"); + this.Add(441821, 441800, "佛冈县"); + this.Add(441823, 441800, "阳山县"); + this.Add(441825, 441800, "连山壮族瑶族自治县"); + this.Add(441826, 441800, "连南瑶族自治县"); + this.Add(441881, 441800, "英德市"); + this.Add(441882, 441800, "连州市"); + this.Add(445102, 445100, "湘桥区"); + this.Add(445103, 445100, "潮安区"); + this.Add(445122, 445100, "饶平县"); + this.Add(445202, 445200, "榕城区"); + this.Add(445203, 445200, "揭东区"); + this.Add(445222, 445200, "揭西县"); + this.Add(445224, 445200, "惠来县"); + this.Add(445281, 445200, "普宁市"); + this.Add(445302, 445300, "云城区"); + this.Add(445303, 445300, "云安区"); + this.Add(445321, 445300, "新兴县"); + this.Add(445322, 445300, "郁南县"); + this.Add(445381, 445300, "罗定市"); + this.Add(450100, 450000, "南宁市"); + this.Add(450200, 450000, "柳州市"); + this.Add(450300, 450000, "桂林市"); + this.Add(450400, 450000, "梧州市"); + this.Add(450500, 450000, "北海市"); + this.Add(450600, 450000, "防城港市"); + this.Add(450700, 450000, "钦州市"); + this.Add(450800, 450000, "贵港市"); + this.Add(450900, 450000, "玉林市"); + this.Add(451000, 450000, "百色市"); + this.Add(451100, 450000, "贺州市"); + this.Add(451200, 450000, "河池市"); + this.Add(451300, 450000, "来宾市"); + this.Add(451400, 450000, "崇左市"); + this.Add(450102, 450100, "兴宁区"); + this.Add(450103, 450100, "青秀区"); + this.Add(450105, 450100, "江南区"); + this.Add(450107, 450100, "西乡塘区"); + this.Add(450108, 450100, "良庆区"); + this.Add(450109, 450100, "邕宁区"); + this.Add(450110, 450100, "武鸣区"); + this.Add(450123, 450100, "隆安县"); + this.Add(450124, 450100, "马山县"); + this.Add(450125, 450100, "上林县"); + this.Add(450126, 450100, "宾阳县"); + this.Add(450127, 450100, "横县"); + this.Add(450202, 450200, "城中区"); + this.Add(450203, 450200, "鱼峰区"); + this.Add(450204, 450200, "柳南区"); + this.Add(450205, 450200, "柳北区"); + this.Add(450206, 450200, "柳江区"); + this.Add(450222, 450200, "柳城县"); + this.Add(450223, 450200, "鹿寨县"); + this.Add(450224, 450200, "融安县"); + this.Add(450225, 450200, "融水苗族自治县"); + this.Add(450226, 450200, "三江侗族自治县"); + this.Add(450302, 450300, "秀峰区"); + this.Add(450303, 450300, "叠彩区"); + this.Add(450304, 450300, "象山区"); + this.Add(450305, 450300, "七星区"); + this.Add(450311, 450300, "雁山区"); + this.Add(450312, 450300, "临桂区"); + this.Add(450321, 450300, "阳朔县"); + this.Add(450323, 450300, "灵川县"); + this.Add(450324, 450300, "全州县"); + this.Add(450325, 450300, "兴安县"); + this.Add(450326, 450300, "永福县"); + this.Add(450327, 450300, "灌阳县"); + this.Add(450328, 450300, "龙胜各族自治县"); + this.Add(450329, 450300, "资源县"); + this.Add(450330, 450300, "平乐县"); + this.Add(450332, 450300, "恭城瑶族自治县"); + this.Add(450381, 450300, "荔浦市"); + this.Add(450403, 450400, "万秀区"); + this.Add(450405, 450400, "长洲区"); + this.Add(450406, 450400, "龙圩区"); + this.Add(450421, 450400, "苍梧县"); + this.Add(450422, 450400, "藤县"); + this.Add(450423, 450400, "蒙山县"); + this.Add(450481, 450400, "岑溪市"); + this.Add(450502, 450500, "海城区"); + this.Add(450503, 450500, "银海区"); + this.Add(450512, 450500, "铁山港区"); + this.Add(450521, 450500, "合浦县"); + this.Add(450602, 450600, "港口区"); + this.Add(450603, 450600, "防城区"); + this.Add(450621, 450600, "上思县"); + this.Add(450681, 450600, "东兴市"); + this.Add(450702, 450700, "钦南区"); + this.Add(450703, 450700, "钦北区"); + this.Add(450721, 450700, "灵山县"); + this.Add(450722, 450700, "浦北县"); + this.Add(450802, 450800, "港北区"); + this.Add(450803, 450800, "港南区"); + this.Add(450804, 450800, "覃塘区"); + this.Add(450821, 450800, "平南县"); + this.Add(450881, 450800, "桂平市"); + this.Add(450902, 450900, "玉州区"); + this.Add(450903, 450900, "福绵区"); + this.Add(450921, 450900, "容县"); + this.Add(450922, 450900, "陆川县"); + this.Add(450923, 450900, "博白县"); + this.Add(450924, 450900, "兴业县"); + this.Add(450981, 450900, "北流市"); + this.Add(451002, 451000, "右江区"); + this.Add(451003, 451000, "田阳区"); + this.Add(451022, 451000, "田东县"); + this.Add(451024, 451000, "德保县"); + this.Add(451026, 451000, "那坡县"); + this.Add(451027, 451000, "凌云县"); + this.Add(451028, 451000, "乐业县"); + this.Add(451029, 451000, "田林县"); + this.Add(451030, 451000, "西林县"); + this.Add(451031, 451000, "隆林各族自治县"); + this.Add(451081, 451000, "靖西市"); + this.Add(451082, 451000, "平果市"); + this.Add(451102, 451100, "八步区"); + this.Add(451103, 451100, "平桂区"); + this.Add(451121, 451100, "昭平县"); + this.Add(451122, 451100, "钟山县"); + this.Add(451123, 451100, "富川瑶族自治县"); + this.Add(451202, 451200, "金城江区"); + this.Add(451203, 451200, "宜州区"); + this.Add(451221, 451200, "南丹县"); + this.Add(451222, 451200, "天峨县"); + this.Add(451223, 451200, "凤山县"); + this.Add(451224, 451200, "东兰县"); + this.Add(451225, 451200, "罗城仫佬族自治县"); + this.Add(451226, 451200, "环江毛南族自治县"); + this.Add(451227, 451200, "巴马瑶族自治县"); + this.Add(451228, 451200, "都安瑶族自治县"); + this.Add(451229, 451200, "大化瑶族自治县"); + this.Add(451302, 451300, "兴宾区"); + this.Add(451321, 451300, "忻城县"); + this.Add(451322, 451300, "象州县"); + this.Add(451323, 451300, "武宣县"); + this.Add(451324, 451300, "金秀瑶族自治县"); + this.Add(451381, 451300, "合山市"); + this.Add(451402, 451400, "江州区"); + this.Add(451421, 451400, "扶绥县"); + this.Add(451422, 451400, "宁明县"); + this.Add(451423, 451400, "龙州县"); + this.Add(451424, 451400, "大新县"); + this.Add(451425, 451400, "天等县"); + this.Add(451481, 451400, "凭祥市"); + this.Add(460100, 460000, "海口市"); + this.Add(460200, 460000, "三亚市"); + this.Add(460300, 460000, "三沙市"); + this.Add(460400, 460000, "儋州市"); + this.Add(469001, 460000, "五指山市"); + this.Add(469002, 460000, "琼海市"); + this.Add(469005, 460000, "文昌市"); + this.Add(469006, 460000, "万宁市"); + this.Add(469007, 460000, "东方市"); + this.Add(469021, 460000, "定安县"); + this.Add(469022, 460000, "屯昌县"); + this.Add(469023, 460000, "澄迈县"); + this.Add(469024, 460000, "临高县"); + this.Add(469025, 460000, "白沙黎族自治县"); + this.Add(469026, 460000, "昌江黎族自治县"); + this.Add(469027, 460000, "乐东黎族自治县"); + this.Add(469028, 460000, "陵水黎族自治县"); + this.Add(469029, 460000, "保亭黎族苗族自治县"); + this.Add(469030, 460000, "琼中黎族苗族自治县"); + this.Add(460105, 460100, "秀英区"); + this.Add(460106, 460100, "龙华区"); + this.Add(460107, 460100, "琼山区"); + this.Add(460108, 460100, "美兰区"); + this.Add(460202, 460200, "海棠区"); + this.Add(460203, 460200, "吉阳区"); + this.Add(460204, 460200, "天涯区"); + this.Add(460205, 460200, "崖州区"); + this.Add(460301, 460300, "西沙区"); + this.Add(460302, 460300, "南沙区"); + this.Add(500101, 500000, "万州区"); + this.Add(500102, 500000, "涪陵区"); + this.Add(500103, 500000, "渝中区"); + this.Add(500104, 500000, "大渡口区"); + this.Add(500105, 500000, "江北区"); + this.Add(500106, 500000, "沙坪坝区"); + this.Add(500107, 500000, "九龙坡区"); + this.Add(500108, 500000, "南岸区"); + this.Add(500109, 500000, "北碚区"); + this.Add(500110, 500000, "綦江区"); + this.Add(500111, 500000, "大足区"); + this.Add(500112, 500000, "渝北区"); + this.Add(500113, 500000, "巴南区"); + this.Add(500114, 500000, "黔江区"); + this.Add(500115, 500000, "长寿区"); + this.Add(500116, 500000, "江津区"); + this.Add(500117, 500000, "合川区"); + this.Add(500118, 500000, "永川区"); + this.Add(500119, 500000, "南川区"); + this.Add(500120, 500000, "璧山区"); + this.Add(500151, 500000, "铜梁区"); + this.Add(500152, 500000, "潼南区"); + this.Add(500153, 500000, "荣昌区"); + this.Add(500154, 500000, "开州区"); + this.Add(500155, 500000, "梁平区"); + this.Add(500156, 500000, "武隆区"); + this.Add(500200, 500000, "重庆市郊县"); + this.Add(500229, 500000, "城口县"); + this.Add(500230, 500000, "丰都县"); + this.Add(500231, 500000, "垫江县"); + this.Add(500233, 500000, "忠县"); + this.Add(500235, 500000, "云阳县"); + this.Add(500236, 500000, "奉节县"); + this.Add(500237, 500000, "巫山县"); + this.Add(500238, 500000, "巫溪县"); + this.Add(500240, 500000, "石柱土家族自治县"); + this.Add(500241, 500000, "秀山土家族苗族自治县"); + this.Add(500242, 500000, "酉阳土家族苗族自治县"); + this.Add(500243, 500000, "彭水苗族土家族自治县"); + this.Add(510100, 510000, "成都市"); + this.Add(510300, 510000, "自贡市"); + this.Add(510400, 510000, "攀枝花市"); + this.Add(510500, 510000, "泸州市"); + this.Add(510600, 510000, "德阳市"); + this.Add(510700, 510000, "绵阳市"); + this.Add(510800, 510000, "广元市"); + this.Add(510900, 510000, "遂宁市"); + this.Add(511000, 510000, "内江市"); + this.Add(511100, 510000, "乐山市"); + this.Add(511300, 510000, "南充市"); + this.Add(511400, 510000, "眉山市"); + this.Add(511500, 510000, "宜宾市"); + this.Add(511600, 510000, "广安市"); + this.Add(511700, 510000, "达州市"); + this.Add(511800, 510000, "雅安市"); + this.Add(511900, 510000, "巴中市"); + this.Add(512000, 510000, "资阳市"); + this.Add(513200, 510000, "阿坝藏族羌族自治州"); + this.Add(513300, 510000, "甘孜藏族自治州"); + this.Add(513400, 510000, "凉山彝族自治州"); + this.Add(510104, 510100, "锦江区"); + this.Add(510105, 510100, "青羊区"); + this.Add(510106, 510100, "金牛区"); + this.Add(510107, 510100, "武侯区"); + this.Add(510108, 510100, "成华区"); + this.Add(510112, 510100, "龙泉驿区"); + this.Add(510113, 510100, "青白江区"); + this.Add(510114, 510100, "新都区"); + this.Add(510115, 510100, "温江区"); + this.Add(510116, 510100, "双流区"); + this.Add(510117, 510100, "郫都区"); + this.Add(510118, 510100, "新津区"); + this.Add(510121, 510100, "金堂县"); + this.Add(510129, 510100, "大邑县"); + this.Add(510131, 510100, "蒲江县"); + this.Add(510181, 510100, "都江堰市"); + this.Add(510182, 510100, "彭州市"); + this.Add(510183, 510100, "邛崃市"); + this.Add(510184, 510100, "崇州市"); + this.Add(510185, 510100, "简阳市"); + this.Add(510302, 510300, "自流井区"); + this.Add(510303, 510300, "贡井区"); + this.Add(510304, 510300, "大安区"); + this.Add(510311, 510300, "沿滩区"); + this.Add(510321, 510300, "荣县"); + this.Add(510322, 510300, "富顺县"); + this.Add(510402, 510400, "东区"); + this.Add(510403, 510400, "西区"); + this.Add(510411, 510400, "仁和区"); + this.Add(510421, 510400, "米易县"); + this.Add(510422, 510400, "盐边县"); + this.Add(510502, 510500, "江阳区"); + this.Add(510503, 510500, "纳溪区"); + this.Add(510504, 510500, "龙马潭区"); + this.Add(510521, 510500, "泸县"); + this.Add(510522, 510500, "合江县"); + this.Add(510524, 510500, "叙永县"); + this.Add(510525, 510500, "古蔺县"); + this.Add(510603, 510600, "旌阳区"); + this.Add(510604, 510600, "罗江区"); + this.Add(510623, 510600, "中江县"); + this.Add(510681, 510600, "广汉市"); + this.Add(510682, 510600, "什邡市"); + this.Add(510683, 510600, "绵竹市"); + this.Add(510703, 510700, "涪城区"); + this.Add(510704, 510700, "游仙区"); + this.Add(510705, 510700, "安州区"); + this.Add(510722, 510700, "三台县"); + this.Add(510723, 510700, "盐亭县"); + this.Add(510725, 510700, "梓潼县"); + this.Add(510726, 510700, "北川羌族自治县"); + this.Add(510727, 510700, "平武县"); + this.Add(510781, 510700, "江油市"); + this.Add(510802, 510800, "利州区"); + this.Add(510811, 510800, "昭化区"); + this.Add(510812, 510800, "朝天区"); + this.Add(510821, 510800, "旺苍县"); + this.Add(510822, 510800, "青川县"); + this.Add(510823, 510800, "剑阁县"); + this.Add(510824, 510800, "苍溪县"); + this.Add(510903, 510900, "船山区"); + this.Add(510904, 510900, "安居区"); + this.Add(510921, 510900, "蓬溪县"); + this.Add(510923, 510900, "大英县"); + this.Add(510981, 510900, "射洪市"); + this.Add(511002, 511000, "市中区"); + this.Add(511011, 511000, "东兴区"); + this.Add(511024, 511000, "威远县"); + this.Add(511025, 511000, "资中县"); + this.Add(511083, 511000, "隆昌市"); + this.Add(511102, 511100, "市中区"); + this.Add(511111, 511100, "沙湾区"); + this.Add(511112, 511100, "五通桥区"); + this.Add(511113, 511100, "金口河区"); + this.Add(511123, 511100, "犍为县"); + this.Add(511124, 511100, "井研县"); + this.Add(511126, 511100, "夹江县"); + this.Add(511129, 511100, "沐川县"); + this.Add(511132, 511100, "峨边彝族自治县"); + this.Add(511133, 511100, "马边彝族自治县"); + this.Add(511181, 511100, "峨眉山市"); + this.Add(511302, 511300, "顺庆区"); + this.Add(511303, 511300, "高坪区"); + this.Add(511304, 511300, "嘉陵区"); + this.Add(511321, 511300, "南部县"); + this.Add(511322, 511300, "营山县"); + this.Add(511323, 511300, "蓬安县"); + this.Add(511324, 511300, "仪陇县"); + this.Add(511325, 511300, "西充县"); + this.Add(511381, 511300, "阆中市"); + this.Add(511402, 511400, "东坡区"); + this.Add(511403, 511400, "彭山区"); + this.Add(511421, 511400, "仁寿县"); + this.Add(511423, 511400, "洪雅县"); + this.Add(511424, 511400, "丹棱县"); + this.Add(511425, 511400, "青神县"); + this.Add(511502, 511500, "翠屏区"); + this.Add(511503, 511500, "南溪区"); + this.Add(511504, 511500, "叙州区"); + this.Add(511523, 511500, "江安县"); + this.Add(511524, 511500, "长宁县"); + this.Add(511525, 511500, "高县"); + this.Add(511526, 511500, "珙县"); + this.Add(511527, 511500, "筠连县"); + this.Add(511528, 511500, "兴文县"); + this.Add(511529, 511500, "屏山县"); + this.Add(511602, 511600, "广安区"); + this.Add(511603, 511600, "前锋区"); + this.Add(511621, 511600, "岳池县"); + this.Add(511622, 511600, "武胜县"); + this.Add(511623, 511600, "邻水县"); + this.Add(511681, 511600, "华蓥市"); + this.Add(511702, 511700, "通川区"); + this.Add(511703, 511700, "达川区"); + this.Add(511722, 511700, "宣汉县"); + this.Add(511723, 511700, "开江县"); + this.Add(511724, 511700, "大竹县"); + this.Add(511725, 511700, "渠县"); + this.Add(511781, 511700, "万源市"); + this.Add(511802, 511800, "雨城区"); + this.Add(511803, 511800, "名山区"); + this.Add(511822, 511800, "荥经县"); + this.Add(511823, 511800, "汉源县"); + this.Add(511824, 511800, "石棉县"); + this.Add(511825, 511800, "天全县"); + this.Add(511826, 511800, "芦山县"); + this.Add(511827, 511800, "宝兴县"); + this.Add(511902, 511900, "巴州区"); + this.Add(511903, 511900, "恩阳区"); + this.Add(511921, 511900, "通江县"); + this.Add(511922, 511900, "南江县"); + this.Add(511923, 511900, "平昌县"); + this.Add(512002, 512000, "雁江区"); + this.Add(512021, 512000, "安岳县"); + this.Add(512022, 512000, "乐至县"); + this.Add(513201, 513200, "马尔康市"); + this.Add(513221, 513200, "汶川县"); + this.Add(513222, 513200, "理县"); + this.Add(513223, 513200, "茂县"); + this.Add(513224, 513200, "松潘县"); + this.Add(513225, 513200, "九寨沟县"); + this.Add(513226, 513200, "金川县"); + this.Add(513227, 513200, "小金县"); + this.Add(513228, 513200, "黑水县"); + this.Add(513230, 513200, "壤塘县"); + this.Add(513231, 513200, "阿坝县"); + this.Add(513232, 513200, "若尔盖县"); + this.Add(513233, 513200, "红原县"); + this.Add(513301, 513300, "康定市"); + this.Add(513322, 513300, "泸定县"); + this.Add(513323, 513300, "丹巴县"); + this.Add(513324, 513300, "九龙县"); + this.Add(513325, 513300, "雅江县"); + this.Add(513326, 513300, "道孚县"); + this.Add(513327, 513300, "炉霍县"); + this.Add(513328, 513300, "甘孜县"); + this.Add(513329, 513300, "新龙县"); + this.Add(513330, 513300, "德格县"); + this.Add(513331, 513300, "白玉县"); + this.Add(513332, 513300, "石渠县"); + this.Add(513333, 513300, "色达县"); + this.Add(513334, 513300, "理塘县"); + this.Add(513335, 513300, "巴塘县"); + this.Add(513336, 513300, "乡城县"); + this.Add(513337, 513300, "稻城县"); + this.Add(513338, 513300, "得荣县"); + this.Add(513401, 513400, "西昌市"); + this.Add(513422, 513400, "木里藏族自治县"); + this.Add(513423, 513400, "盐源县"); + this.Add(513424, 513400, "德昌县"); + this.Add(513425, 513400, "会理县"); + this.Add(513426, 513400, "会东县"); + this.Add(513427, 513400, "宁南县"); + this.Add(513428, 513400, "普格县"); + this.Add(513429, 513400, "布拖县"); + this.Add(513430, 513400, "金阳县"); + this.Add(513431, 513400, "昭觉县"); + this.Add(513432, 513400, "喜德县"); + this.Add(513433, 513400, "冕宁县"); + this.Add(513434, 513400, "越西县"); + this.Add(513435, 513400, "甘洛县"); + this.Add(513436, 513400, "美姑县"); + this.Add(513437, 513400, "雷波县"); + this.Add(520100, 520000, "贵阳市"); + this.Add(520200, 520000, "六盘水市"); + this.Add(520300, 520000, "遵义市"); + this.Add(520400, 520000, "安顺市"); + this.Add(520500, 520000, "毕节市"); + this.Add(520600, 520000, "铜仁市"); + this.Add(522300, 520000, "黔西南布依族苗族自治州"); + this.Add(522600, 520000, "黔东南苗族侗族自治州"); + this.Add(522700, 520000, "黔南布依族苗族自治州"); + this.Add(520102, 520100, "南明区"); + this.Add(520103, 520100, "云岩区"); + this.Add(520111, 520100, "花溪区"); + this.Add(520112, 520100, "乌当区"); + this.Add(520113, 520100, "白云区"); + this.Add(520115, 520100, "观山湖区"); + this.Add(520121, 520100, "开阳县"); + this.Add(520122, 520100, "息烽县"); + this.Add(520123, 520100, "修文县"); + this.Add(520181, 520100, "清镇市"); + this.Add(520201, 520200, "钟山区"); + this.Add(520203, 520200, "六枝特区"); + this.Add(520221, 520200, "水城区"); + this.Add(520281, 520200, "盘州市"); + this.Add(520302, 520300, "红花岗区"); + this.Add(520303, 520300, "汇川区"); + this.Add(520304, 520300, "播州区"); + this.Add(520322, 520300, "桐梓县"); + this.Add(520323, 520300, "绥阳县"); + this.Add(520324, 520300, "正安县"); + this.Add(520325, 520300, "道真仡佬族苗族自治县"); + this.Add(520326, 520300, "务川仡佬族苗族自治县"); + this.Add(520327, 520300, "凤冈县"); + this.Add(520328, 520300, "湄潭县"); + this.Add(520329, 520300, "余庆县"); + this.Add(520330, 520300, "习水县"); + this.Add(520381, 520300, "赤水市"); + this.Add(520382, 520300, "仁怀市"); + this.Add(520402, 520400, "西秀区"); + this.Add(520403, 520400, "平坝区"); + this.Add(520422, 520400, "普定县"); + this.Add(520423, 520400, "镇宁布依族苗族自治县"); + this.Add(520424, 520400, "关岭布依族苗族自治县"); + this.Add(520425, 520400, "紫云苗族布依族自治县"); + this.Add(520502, 520500, "七星关区"); + this.Add(520521, 520500, "大方县"); + this.Add(520522, 520500, "黔西县"); + this.Add(520523, 520500, "金沙县"); + this.Add(520524, 520500, "织金县"); + this.Add(520525, 520500, "纳雍县"); + this.Add(520526, 520500, "威宁彝族回族苗族自治县"); + this.Add(520527, 520500, "赫章县"); + this.Add(520602, 520600, "碧江区"); + this.Add(520603, 520600, "万山区"); + this.Add(520621, 520600, "江口县"); + this.Add(520622, 520600, "玉屏侗族自治县"); + this.Add(520623, 520600, "石阡县"); + this.Add(520624, 520600, "思南县"); + this.Add(520625, 520600, "印江土家族苗族自治县"); + this.Add(520626, 520600, "德江县"); + this.Add(520627, 520600, "沿河土家族自治县"); + this.Add(520628, 520600, "松桃苗族自治县"); + this.Add(522301, 522300, "兴义市"); + this.Add(522302, 522300, "兴仁市"); + this.Add(522323, 522300, "普安县"); + this.Add(522324, 522300, "晴隆县"); + this.Add(522325, 522300, "贞丰县"); + this.Add(522326, 522300, "望谟县"); + this.Add(522327, 522300, "册亨县"); + this.Add(522328, 522300, "安龙县"); + this.Add(522601, 522600, "凯里市"); + this.Add(522622, 522600, "黄平县"); + this.Add(522623, 522600, "施秉县"); + this.Add(522624, 522600, "三穗县"); + this.Add(522625, 522600, "镇远县"); + this.Add(522626, 522600, "岑巩县"); + this.Add(522627, 522600, "天柱县"); + this.Add(522628, 522600, "锦屏县"); + this.Add(522629, 522600, "剑河县"); + this.Add(522630, 522600, "台江县"); + this.Add(522631, 522600, "黎平县"); + this.Add(522632, 522600, "榕江县"); + this.Add(522633, 522600, "从江县"); + this.Add(522634, 522600, "雷山县"); + this.Add(522635, 522600, "麻江县"); + this.Add(522636, 522600, "丹寨县"); + this.Add(522701, 522700, "都匀市"); + this.Add(522702, 522700, "福泉市"); + this.Add(522722, 522700, "荔波县"); + this.Add(522723, 522700, "贵定县"); + this.Add(522725, 522700, "瓮安县"); + this.Add(522726, 522700, "独山县"); + this.Add(522727, 522700, "平塘县"); + this.Add(522728, 522700, "罗甸县"); + this.Add(522729, 522700, "长顺县"); + this.Add(522730, 522700, "龙里县"); + this.Add(522731, 522700, "惠水县"); + this.Add(522732, 522700, "三都水族自治县"); + this.Add(530100, 530000, "昆明市"); + this.Add(530300, 530000, "曲靖市"); + this.Add(530400, 530000, "玉溪市"); + this.Add(530500, 530000, "保山市"); + this.Add(530600, 530000, "昭通市"); + this.Add(530700, 530000, "丽江市"); + this.Add(530800, 530000, "普洱市"); + this.Add(530900, 530000, "临沧市"); + this.Add(532300, 530000, "楚雄彝族自治州"); + this.Add(532500, 530000, "红河哈尼族彝族自治州"); + this.Add(532600, 530000, "文山壮族苗族自治州"); + this.Add(532800, 530000, "西双版纳傣族自治州"); + this.Add(532900, 530000, "大理白族自治州"); + this.Add(533100, 530000, "德宏傣族景颇族自治州"); + this.Add(533300, 530000, "怒江傈僳族自治州"); + this.Add(533400, 530000, "迪庆藏族自治州"); + this.Add(530102, 530100, "五华区"); + this.Add(530103, 530100, "盘龙区"); + this.Add(530111, 530100, "官渡区"); + this.Add(530112, 530100, "西山区"); + this.Add(530113, 530100, "东川区"); + this.Add(530114, 530100, "呈贡区"); + this.Add(530115, 530100, "晋宁区"); + this.Add(530124, 530100, "富民县"); + this.Add(530125, 530100, "宜良县"); + this.Add(530126, 530100, "石林彝族自治县"); + this.Add(530127, 530100, "嵩明县"); + this.Add(530128, 530100, "禄劝彝族苗族自治县"); + this.Add(530129, 530100, "寻甸回族彝族自治县"); + this.Add(530181, 530100, "安宁市"); + this.Add(530302, 530300, "麒麟区"); + this.Add(530303, 530300, "沾益区"); + this.Add(530304, 530300, "马龙区"); + this.Add(530322, 530300, "陆良县"); + this.Add(530323, 530300, "师宗县"); + this.Add(530324, 530300, "罗平县"); + this.Add(530325, 530300, "富源县"); + this.Add(530326, 530300, "会泽县"); + this.Add(530381, 530300, "宣威市"); + this.Add(530402, 530400, "红塔区"); + this.Add(530403, 530400, "江川区"); + this.Add(530423, 530400, "通海县"); + this.Add(530424, 530400, "华宁县"); + this.Add(530425, 530400, "易门县"); + this.Add(530426, 530400, "峨山彝族自治县"); + this.Add(530427, 530400, "新平彝族傣族自治县"); + this.Add(530428, 530400, "元江哈尼族彝族傣族自治县"); + this.Add(530481, 530400, "澄江市"); + this.Add(530502, 530500, "隆阳区"); + this.Add(530521, 530500, "施甸县"); + this.Add(530523, 530500, "龙陵县"); + this.Add(530524, 530500, "昌宁县"); + this.Add(530581, 530500, "腾冲市"); + this.Add(530602, 530600, "昭阳区"); + this.Add(530621, 530600, "鲁甸县"); + this.Add(530622, 530600, "巧家县"); + this.Add(530623, 530600, "盐津县"); + this.Add(530624, 530600, "大关县"); + this.Add(530625, 530600, "永善县"); + this.Add(530626, 530600, "绥江县"); + this.Add(530627, 530600, "镇雄县"); + this.Add(530628, 530600, "彝良县"); + this.Add(530629, 530600, "威信县"); + this.Add(530681, 530600, "水富市"); + this.Add(530702, 530700, "古城区"); + this.Add(530721, 530700, "玉龙纳西族自治县"); + this.Add(530722, 530700, "永胜县"); + this.Add(530723, 530700, "华坪县"); + this.Add(530724, 530700, "宁蒗彝族自治县"); + this.Add(530802, 530800, "思茅区"); + this.Add(530821, 530800, "宁洱哈尼族彝族自治县"); + this.Add(530822, 530800, "墨江哈尼族自治县"); + this.Add(530823, 530800, "景东彝族自治县"); + this.Add(530824, 530800, "景谷傣族彝族自治县"); + this.Add(530825, 530800, "镇沅彝族哈尼族拉祜族自治县"); + this.Add(530826, 530800, "江城哈尼族彝族自治县"); + this.Add(530827, 530800, "孟连傣族拉祜族佤族自治县"); + this.Add(530828, 530800, "澜沧拉祜族自治县"); + this.Add(530829, 530800, "西盟佤族自治县"); + this.Add(530902, 530900, "临翔区"); + this.Add(530921, 530900, "凤庆县"); + this.Add(530922, 530900, "云县"); + this.Add(530923, 530900, "永德县"); + this.Add(530924, 530900, "镇康县"); + this.Add(530925, 530900, "双江拉祜族佤族布朗族傣族自治县"); + this.Add(530926, 530900, "耿马傣族佤族自治县"); + this.Add(530927, 530900, "沧源佤族自治县"); + this.Add(532301, 532300, "楚雄市"); + this.Add(532322, 532300, "双柏县"); + this.Add(532323, 532300, "牟定县"); + this.Add(532324, 532300, "南华县"); + this.Add(532325, 532300, "姚安县"); + this.Add(532326, 532300, "大姚县"); + this.Add(532327, 532300, "永仁县"); + this.Add(532328, 532300, "元谋县"); + this.Add(532329, 532300, "武定县"); + this.Add(532331, 532300, "禄丰县"); + this.Add(532501, 532500, "个旧市"); + this.Add(532502, 532500, "开远市"); + this.Add(532503, 532500, "蒙自市"); + this.Add(532504, 532500, "弥勒市"); + this.Add(532523, 532500, "屏边苗族自治县"); + this.Add(532524, 532500, "建水县"); + this.Add(532525, 532500, "石屏县"); + this.Add(532527, 532500, "泸西县"); + this.Add(532528, 532500, "元阳县"); + this.Add(532529, 532500, "红河县"); + this.Add(532530, 532500, "金平苗族瑶族傣族自治县"); + this.Add(532531, 532500, "绿春县"); + this.Add(532532, 532500, "河口瑶族自治县"); + this.Add(532601, 532600, "文山市"); + this.Add(532622, 532600, "砚山县"); + this.Add(532623, 532600, "西畴县"); + this.Add(532624, 532600, "麻栗坡县"); + this.Add(532625, 532600, "马关县"); + this.Add(532626, 532600, "丘北县"); + this.Add(532627, 532600, "广南县"); + this.Add(532628, 532600, "富宁县"); + this.Add(532801, 532800, "景洪市"); + this.Add(532822, 532800, "勐海县"); + this.Add(532823, 532800, "勐腊县"); + this.Add(532901, 532900, "大理市"); + this.Add(532922, 532900, "漾濞彝族自治县"); + this.Add(532923, 532900, "祥云县"); + this.Add(532924, 532900, "宾川县"); + this.Add(532925, 532900, "弥渡县"); + this.Add(532926, 532900, "南涧彝族自治县"); + this.Add(532927, 532900, "巍山彝族回族自治县"); + this.Add(532928, 532900, "永平县"); + this.Add(532929, 532900, "云龙县"); + this.Add(532930, 532900, "洱源县"); + this.Add(532931, 532900, "剑川县"); + this.Add(532932, 532900, "鹤庆县"); + this.Add(533102, 533100, "瑞丽市"); + this.Add(533103, 533100, "芒市"); + this.Add(533122, 533100, "梁河县"); + this.Add(533123, 533100, "盈江县"); + this.Add(533124, 533100, "陇川县"); + this.Add(533301, 533300, "泸水市"); + this.Add(533323, 533300, "福贡县"); + this.Add(533324, 533300, "贡山独龙族怒族自治县"); + this.Add(533325, 533300, "兰坪白族普米族自治县"); + this.Add(533401, 533400, "香格里拉市"); + this.Add(533422, 533400, "德钦县"); + this.Add(533423, 533400, "维西傈僳族自治县"); + this.Add(540100, 540000, "拉萨市"); + this.Add(540200, 540000, "日喀则市"); + this.Add(540300, 540000, "昌都市"); + this.Add(540400, 540000, "林芝市"); + this.Add(540500, 540000, "山南市"); + this.Add(540600, 540000, "那曲市"); + this.Add(542500, 540000, "阿里地区"); + this.Add(540102, 540100, "城关区"); + this.Add(540103, 540100, "堆龙德庆区"); + this.Add(540104, 540100, "达孜区"); + this.Add(540121, 540100, "林周县"); + this.Add(540122, 540100, "当雄县"); + this.Add(540123, 540100, "尼木县"); + this.Add(540124, 540100, "曲水县"); + this.Add(540127, 540100, "墨竹工卡县"); + this.Add(540202, 540200, "桑珠孜区"); + this.Add(540221, 540200, "南木林县"); + this.Add(540222, 540200, "江孜县"); + this.Add(540223, 540200, "定日县"); + this.Add(540224, 540200, "萨迦县"); + this.Add(540225, 540200, "拉孜县"); + this.Add(540226, 540200, "昂仁县"); + this.Add(540227, 540200, "谢通门县"); + this.Add(540228, 540200, "白朗县"); + this.Add(540229, 540200, "仁布县"); + this.Add(540230, 540200, "康马县"); + this.Add(540231, 540200, "定结县"); + this.Add(540232, 540200, "仲巴县"); + this.Add(540233, 540200, "亚东县"); + this.Add(540234, 540200, "吉隆县"); + this.Add(540235, 540200, "聂拉木县"); + this.Add(540236, 540200, "萨嘎县"); + this.Add(540237, 540200, "岗巴县"); + this.Add(540302, 540300, "卡若区"); + this.Add(540321, 540300, "江达县"); + this.Add(540322, 540300, "贡觉县"); + this.Add(540323, 540300, "类乌齐县"); + this.Add(540324, 540300, "丁青县"); + this.Add(540325, 540300, "察雅县"); + this.Add(540326, 540300, "八宿县"); + this.Add(540327, 540300, "左贡县"); + this.Add(540328, 540300, "芒康县"); + this.Add(540329, 540300, "洛隆县"); + this.Add(540330, 540300, "边坝县"); + this.Add(540402, 540400, "巴宜区"); + this.Add(540421, 540400, "工布江达县"); + this.Add(540422, 540400, "米林县"); + this.Add(540423, 540400, "墨脱县"); + this.Add(540424, 540400, "波密县"); + this.Add(540425, 540400, "察隅县"); + this.Add(540426, 540400, "朗县"); + this.Add(540502, 540500, "乃东区"); + this.Add(540521, 540500, "扎囊县"); + this.Add(540522, 540500, "贡嘎县"); + this.Add(540523, 540500, "桑日县"); + this.Add(540524, 540500, "琼结县"); + this.Add(540525, 540500, "曲松县"); + this.Add(540526, 540500, "措美县"); + this.Add(540527, 540500, "洛扎县"); + this.Add(540528, 540500, "加查县"); + this.Add(540529, 540500, "隆子县"); + this.Add(540530, 540500, "错那县"); + this.Add(540531, 540500, "浪卡子县"); + this.Add(540602, 540600, "色尼区"); + this.Add(540621, 540600, "嘉黎县"); + this.Add(540622, 540600, "比如县"); + this.Add(540623, 540600, "聂荣县"); + this.Add(540624, 540600, "安多县"); + this.Add(540625, 540600, "申扎县"); + this.Add(540626, 540600, "索县"); + this.Add(540627, 540600, "班戈县"); + this.Add(540628, 540600, "巴青县"); + this.Add(540629, 540600, "尼玛县"); + this.Add(540630, 540600, "双湖县"); + this.Add(542521, 542500, "普兰县"); + this.Add(542522, 542500, "札达县"); + this.Add(542523, 542500, "噶尔县"); + this.Add(542524, 542500, "日土县"); + this.Add(542525, 542500, "革吉县"); + this.Add(542526, 542500, "改则县"); + this.Add(542527, 542500, "措勤县"); + this.Add(610100, 610000, "西安市"); + this.Add(610200, 610000, "铜川市"); + this.Add(610300, 610000, "宝鸡市"); + this.Add(610400, 610000, "咸阳市"); + this.Add(610500, 610000, "渭南市"); + this.Add(610600, 610000, "延安市"); + this.Add(610700, 610000, "汉中市"); + this.Add(610800, 610000, "榆林市"); + this.Add(610900, 610000, "安康市"); + this.Add(611000, 610000, "商洛市"); + this.Add(610102, 610100, "新城区"); + this.Add(610103, 610100, "碑林区"); + this.Add(610104, 610100, "莲湖区"); + this.Add(610111, 610100, "灞桥区"); + this.Add(610112, 610100, "未央区"); + this.Add(610113, 610100, "雁塔区"); + this.Add(610114, 610100, "阎良区"); + this.Add(610115, 610100, "临潼区"); + this.Add(610116, 610100, "长安区"); + this.Add(610117, 610100, "高陵区"); + this.Add(610118, 610100, "鄠邑区"); + this.Add(610122, 610100, "蓝田县"); + this.Add(610124, 610100, "周至县"); + this.Add(610202, 610200, "王益区"); + this.Add(610203, 610200, "印台区"); + this.Add(610204, 610200, "耀州区"); + this.Add(610222, 610200, "宜君县"); + this.Add(610302, 610300, "渭滨区"); + this.Add(610303, 610300, "金台区"); + this.Add(610304, 610300, "陈仓区"); + this.Add(610322, 610300, "凤翔县"); + this.Add(610323, 610300, "岐山县"); + this.Add(610324, 610300, "扶风县"); + this.Add(610326, 610300, "眉县"); + this.Add(610327, 610300, "陇县"); + this.Add(610328, 610300, "千阳县"); + this.Add(610329, 610300, "麟游县"); + this.Add(610330, 610300, "凤县"); + this.Add(610331, 610300, "太白县"); + this.Add(610402, 610400, "秦都区"); + this.Add(610403, 610400, "杨陵区"); + this.Add(610404, 610400, "渭城区"); + this.Add(610422, 610400, "三原县"); + this.Add(610423, 610400, "泾阳县"); + this.Add(610424, 610400, "乾县"); + this.Add(610425, 610400, "礼泉县"); + this.Add(610426, 610400, "永寿县"); + this.Add(610428, 610400, "长武县"); + this.Add(610429, 610400, "旬邑县"); + this.Add(610430, 610400, "淳化县"); + this.Add(610431, 610400, "武功县"); + this.Add(610481, 610400, "兴平市"); + this.Add(610482, 610400, "彬州市"); + this.Add(610502, 610500, "临渭区"); + this.Add(610503, 610500, "华州区"); + this.Add(610522, 610500, "潼关县"); + this.Add(610523, 610500, "大荔县"); + this.Add(610524, 610500, "合阳县"); + this.Add(610525, 610500, "澄城县"); + this.Add(610526, 610500, "蒲城县"); + this.Add(610527, 610500, "白水县"); + this.Add(610528, 610500, "富平县"); + this.Add(610581, 610500, "韩城市"); + this.Add(610582, 610500, "华阴市"); + this.Add(610602, 610600, "宝塔区"); + this.Add(610603, 610600, "安塞区"); + this.Add(610621, 610600, "延长县"); + this.Add(610622, 610600, "延川县"); + this.Add(610625, 610600, "志丹县"); + this.Add(610626, 610600, "吴起县"); + this.Add(610627, 610600, "甘泉县"); + this.Add(610628, 610600, "富县"); + this.Add(610629, 610600, "洛川县"); + this.Add(610630, 610600, "宜川县"); + this.Add(610631, 610600, "黄龙县"); + this.Add(610632, 610600, "黄陵县"); + this.Add(610681, 610600, "子长市"); + this.Add(610702, 610700, "汉台区"); + this.Add(610703, 610700, "南郑区"); + this.Add(610722, 610700, "城固县"); + this.Add(610723, 610700, "洋县"); + this.Add(610724, 610700, "西乡县"); + this.Add(610725, 610700, "勉县"); + this.Add(610726, 610700, "宁强县"); + this.Add(610727, 610700, "略阳县"); + this.Add(610728, 610700, "镇巴县"); + this.Add(610729, 610700, "留坝县"); + this.Add(610730, 610700, "佛坪县"); + this.Add(610802, 610800, "榆阳区"); + this.Add(610803, 610800, "横山区"); + this.Add(610822, 610800, "府谷县"); + this.Add(610824, 610800, "靖边县"); + this.Add(610825, 610800, "定边县"); + this.Add(610826, 610800, "绥德县"); + this.Add(610827, 610800, "米脂县"); + this.Add(610828, 610800, "佳县"); + this.Add(610829, 610800, "吴堡县"); + this.Add(610830, 610800, "清涧县"); + this.Add(610831, 610800, "子洲县"); + this.Add(610881, 610800, "神木市"); + this.Add(610902, 610900, "汉滨区"); + this.Add(610921, 610900, "汉阴县"); + this.Add(610922, 610900, "石泉县"); + this.Add(610923, 610900, "宁陕县"); + this.Add(610924, 610900, "紫阳县"); + this.Add(610925, 610900, "岚皋县"); + this.Add(610926, 610900, "平利县"); + this.Add(610927, 610900, "镇坪县"); + this.Add(610928, 610900, "旬阳县"); + this.Add(610929, 610900, "白河县"); + this.Add(611002, 611000, "商州区"); + this.Add(611021, 611000, "洛南县"); + this.Add(611022, 611000, "丹凤县"); + this.Add(611023, 611000, "商南县"); + this.Add(611024, 611000, "山阳县"); + this.Add(611025, 611000, "镇安县"); + this.Add(611026, 611000, "柞水县"); + this.Add(620100, 620000, "兰州市"); + this.Add(620200, 620000, "嘉峪关市"); + this.Add(620300, 620000, "金昌市"); + this.Add(620400, 620000, "白银市"); + this.Add(620500, 620000, "天水市"); + this.Add(620600, 620000, "武威市"); + this.Add(620700, 620000, "张掖市"); + this.Add(620800, 620000, "平凉市"); + this.Add(620900, 620000, "酒泉市"); + this.Add(621000, 620000, "庆阳市"); + this.Add(621100, 620000, "定西市"); + this.Add(621200, 620000, "陇南市"); + this.Add(622900, 620000, "临夏回族自治州"); + this.Add(623000, 620000, "甘南藏族自治州"); + this.Add(620102, 620100, "城关区"); + this.Add(620103, 620100, "七里河区"); + this.Add(620104, 620100, "西固区"); + this.Add(620105, 620100, "安宁区"); + this.Add(620111, 620100, "红古区"); + this.Add(620121, 620100, "永登县"); + this.Add(620122, 620100, "皋兰县"); + this.Add(620123, 620100, "榆中县"); + this.Add(620302, 620300, "金川区"); + this.Add(620321, 620300, "永昌县"); + this.Add(620402, 620400, "白银区"); + this.Add(620403, 620400, "平川区"); + this.Add(620421, 620400, "靖远县"); + this.Add(620422, 620400, "会宁县"); + this.Add(620423, 620400, "景泰县"); + this.Add(620502, 620500, "秦州区"); + this.Add(620503, 620500, "麦积区"); + this.Add(620521, 620500, "清水县"); + this.Add(620522, 620500, "秦安县"); + this.Add(620523, 620500, "甘谷县"); + this.Add(620524, 620500, "武山县"); + this.Add(620525, 620500, "张家川回族自治县"); + this.Add(620602, 620600, "凉州区"); + this.Add(620621, 620600, "民勤县"); + this.Add(620622, 620600, "古浪县"); + this.Add(620623, 620600, "天祝藏族自治县"); + this.Add(620702, 620700, "甘州区"); + this.Add(620721, 620700, "肃南裕固族自治县"); + this.Add(620722, 620700, "民乐县"); + this.Add(620723, 620700, "临泽县"); + this.Add(620724, 620700, "高台县"); + this.Add(620725, 620700, "山丹县"); + this.Add(620802, 620800, "崆峒区"); + this.Add(620821, 620800, "泾川县"); + this.Add(620822, 620800, "灵台县"); + this.Add(620823, 620800, "崇信县"); + this.Add(620825, 620800, "庄浪县"); + this.Add(620826, 620800, "静宁县"); + this.Add(620881, 620800, "华亭市"); + this.Add(620902, 620900, "肃州区"); + this.Add(620921, 620900, "金塔县"); + this.Add(620922, 620900, "瓜州县"); + this.Add(620923, 620900, "肃北蒙古族自治县"); + this.Add(620924, 620900, "阿克塞哈萨克族自治县"); + this.Add(620981, 620900, "玉门市"); + this.Add(620982, 620900, "敦煌市"); + this.Add(621002, 621000, "西峰区"); + this.Add(621021, 621000, "庆城县"); + this.Add(621022, 621000, "环县"); + this.Add(621023, 621000, "华池县"); + this.Add(621024, 621000, "合水县"); + this.Add(621025, 621000, "正宁县"); + this.Add(621026, 621000, "宁县"); + this.Add(621027, 621000, "镇原县"); + this.Add(621102, 621100, "安定区"); + this.Add(621121, 621100, "通渭县"); + this.Add(621122, 621100, "陇西县"); + this.Add(621123, 621100, "渭源县"); + this.Add(621124, 621100, "临洮县"); + this.Add(621125, 621100, "漳县"); + this.Add(621126, 621100, "岷县"); + this.Add(621202, 621200, "武都区"); + this.Add(621221, 621200, "成县"); + this.Add(621222, 621200, "文县"); + this.Add(621223, 621200, "宕昌县"); + this.Add(621224, 621200, "康县"); + this.Add(621225, 621200, "西和县"); + this.Add(621226, 621200, "礼县"); + this.Add(621227, 621200, "徽县"); + + this.Add(621228, 621200, "两当县"); + this.Add(622901, 622900, "临夏市"); + this.Add(622921, 622900, "临夏县"); + this.Add(622922, 622900, "康乐县"); + this.Add(622923, 622900, "永靖县"); + this.Add(622924, 622900, "广河县"); + this.Add(622925, 622900, "和政县"); + this.Add(622926, 622900, "东乡族自治县"); + this.Add(622927, 622900, "积石山保安族东乡族撒拉族自治县"); + this.Add(623001, 623000, "合作市"); + this.Add(623021, 623000, "临潭县"); + this.Add(623022, 623000, "卓尼县"); + this.Add(623023, 623000, "舟曲县"); + this.Add(623024, 623000, "迭部县"); + this.Add(623025, 623000, "玛曲县"); + this.Add(623026, 623000, "碌曲县"); + this.Add(623027, 623000, "夏河县"); + this.Add(630100, 630000, "西宁市"); + this.Add(630200, 630000, "海东市"); + this.Add(632200, 630000, "海北藏族自治州"); + this.Add(632300, 630000, "黄南藏族自治州"); + this.Add(632500, 630000, "海南藏族自治州"); + this.Add(632600, 630000, "果洛藏族自治州"); + this.Add(632700, 630000, "玉树藏族自治州"); + this.Add(632800, 630000, "海西蒙古族藏族自治州"); + this.Add(630102, 630100, "城东区"); + this.Add(630103, 630100, "城中区"); + this.Add(630104, 630100, "城西区"); + this.Add(630105, 630100, "城北区"); + this.Add(630106, 630100, "湟中区"); + this.Add(630121, 630100, "大通回族土族自治县"); + this.Add(630123, 630100, "湟源县"); + this.Add(630202, 630200, "乐都区"); + this.Add(630203, 630200, "平安区"); + this.Add(630222, 630200, "民和回族土族自治县"); + this.Add(630223, 630200, "互助土族自治县"); + this.Add(630224, 630200, "化隆回族自治县"); + this.Add(630225, 630200, "循化撒拉族自治县"); + this.Add(632221, 632200, "门源回族自治县"); + this.Add(632222, 632200, "祁连县"); + this.Add(632223, 632200, "海晏县"); + this.Add(632224, 632200, "刚察县"); + this.Add(632301, 632300, "同仁市"); + this.Add(632322, 632300, "尖扎县"); + this.Add(632323, 632300, "泽库县"); + this.Add(632324, 632300, "河南蒙古族自治县"); + this.Add(632521, 632500, "共和县"); + this.Add(632522, 632500, "同德县"); + this.Add(632523, 632500, "贵德县"); + this.Add(632524, 632500, "兴海县"); + this.Add(632525, 632500, "贵南县"); + this.Add(632621, 632600, "玛沁县"); + this.Add(632622, 632600, "班玛县"); + this.Add(632623, 632600, "甘德县"); + this.Add(632624, 632600, "达日县"); + this.Add(632625, 632600, "久治县"); + this.Add(632626, 632600, "玛多县"); + this.Add(632701, 632700, "玉树市"); + this.Add(632722, 632700, "杂多县"); + this.Add(632723, 632700, "称多县"); + this.Add(632724, 632700, "治多县"); + this.Add(632725, 632700, "囊谦县"); + this.Add(632726, 632700, "曲麻莱县"); + this.Add(632801, 632800, "格尔木市"); + this.Add(632802, 632800, "德令哈市"); + this.Add(632803, 632800, "茫崖市"); + this.Add(632821, 632800, "乌兰县"); + this.Add(632822, 632800, "都兰县"); + this.Add(632823, 632800, "天峻县"); + this.Add(632825, 632800, "海西蒙古族藏族自治州直辖"); + this.Add(640100, 640000, "银川市"); + this.Add(640200, 640000, "石嘴山市"); + this.Add(640300, 640000, "吴忠市"); + this.Add(640400, 640000, "固原市"); + this.Add(640500, 640000, "中卫市"); + this.Add(640104, 640100, "兴庆区"); + this.Add(640105, 640100, "西夏区"); + this.Add(640106, 640100, "金凤区"); + this.Add(640121, 640100, "永宁县"); + this.Add(640122, 640100, "贺兰县"); + this.Add(640181, 640100, "灵武市"); + this.Add(640202, 640200, "大武口区"); + this.Add(640205, 640200, "惠农区"); + this.Add(640221, 640200, "平罗县"); + this.Add(640302, 640300, "利通区"); + this.Add(640303, 640300, "红寺堡区"); + this.Add(640323, 640300, "盐池县"); + this.Add(640324, 640300, "同心县"); + this.Add(640381, 640300, "青铜峡市"); + this.Add(640402, 640400, "原州区"); + this.Add(640422, 640400, "西吉县"); + this.Add(640423, 640400, "隆德县"); + this.Add(640424, 640400, "泾源县"); + this.Add(640425, 640400, "彭阳县"); + this.Add(640502, 640500, "沙坡头区"); + this.Add(640521, 640500, "中宁县"); + this.Add(640522, 640500, "海原县"); + this.Add(650100, 650000, "乌鲁木齐市"); + this.Add(650200, 650000, "克拉玛依市"); + this.Add(650400, 650000, "吐鲁番市"); + this.Add(650500, 650000, "哈密市"); + this.Add(652300, 650000, "昌吉回族自治州"); + this.Add(652700, 650000, "博尔塔拉蒙古自治州"); + this.Add(652800, 650000, "巴音郭楞蒙古自治州"); + this.Add(652900, 650000, "阿克苏地区"); + this.Add(653000, 650000, "克孜勒苏柯尔克孜自治州"); + this.Add(653100, 650000, "喀什地区"); + this.Add(653200, 650000, "和田地区"); + this.Add(654000, 650000, "伊犁哈萨克自治州"); + this.Add(654200, 650000, "塔城地区"); + this.Add(654300, 650000, "阿勒泰地区"); + this.Add(659001, 650000, "石河子市"); + this.Add(659002, 650000, "阿拉尔市"); + this.Add(659003, 650000, "图木舒克市"); + this.Add(659004, 650000, "五家渠市"); + this.Add(659005, 650000, "北屯市"); + this.Add(659006, 650000, "铁门关市"); + this.Add(659007, 650000, "双河市"); + this.Add(659008, 650000, "可克达拉市"); + this.Add(659009, 650000, "昆玉市"); + this.Add(659010, 650000, "胡杨河市"); + this.Add(650102, 650100, "天山区"); + this.Add(650103, 650100, "沙依巴克区"); + this.Add(650104, 650100, "新市区"); + this.Add(650105, 650100, "水磨沟区"); + this.Add(650106, 650100, "头屯河区"); + this.Add(650107, 650100, "达坂城区"); + this.Add(650109, 650100, "米东区"); + this.Add(650121, 650100, "乌鲁木齐县"); + this.Add(650202, 650200, "独山子区"); + this.Add(650203, 650200, "克拉玛依区"); + this.Add(650204, 650200, "白碱滩区"); + this.Add(650205, 650200, "乌尔禾区"); + this.Add(650402, 650400, "高昌区"); + this.Add(650421, 650400, "鄯善县"); + this.Add(650422, 650400, "托克逊县"); + this.Add(650502, 650500, "伊州区"); + this.Add(650521, 650500, "巴里坤哈萨克自治县"); + this.Add(650522, 650500, "伊吾县"); + this.Add(652301, 652300, "昌吉市"); + this.Add(652302, 652300, "阜康市"); + this.Add(652323, 652300, "呼图壁县"); + this.Add(652324, 652300, "玛纳斯县"); + this.Add(652325, 652300, "奇台县"); + this.Add(652327, 652300, "吉木萨尔县"); + this.Add(652328, 652300, "木垒哈萨克自治县"); + this.Add(652701, 652700, "博乐市"); + this.Add(652702, 652700, "阿拉山口市"); + this.Add(652722, 652700, "精河县"); + this.Add(652723, 652700, "温泉县"); + this.Add(652801, 652800, "库尔勒市"); + this.Add(652822, 652800, "轮台县"); + this.Add(652823, 652800, "尉犁县"); + this.Add(652824, 652800, "若羌县"); + this.Add(652825, 652800, "且末县"); + this.Add(652826, 652800, "焉耆回族自治县"); + this.Add(652827, 652800, "和静县"); + this.Add(652828, 652800, "和硕县"); + this.Add(652829, 652800, "博湖县"); + this.Add(652901, 652900, "阿克苏市"); + this.Add(652902, 652900, "库车市"); + this.Add(652922, 652900, "温宿县"); + this.Add(652924, 652900, "沙雅县"); + this.Add(652925, 652900, "新和县"); + this.Add(652926, 652900, "拜城县"); + this.Add(652927, 652900, "乌什县"); + this.Add(652928, 652900, "阿瓦提县"); + this.Add(652929, 652900, "柯坪县"); + this.Add(653001, 653000, "阿图什市"); + this.Add(653022, 653000, "阿克陶县"); + this.Add(653023, 653000, "阿合奇县"); + this.Add(653024, 653000, "乌恰县"); + this.Add(653101, 653100, "喀什市"); + this.Add(653121, 653100, "疏附县"); + this.Add(653122, 653100, "疏勒县"); + this.Add(653123, 653100, "英吉沙县"); + this.Add(653124, 653100, "泽普县"); + this.Add(653125, 653100, "莎车县"); + this.Add(653126, 653100, "叶城县"); + this.Add(653127, 653100, "麦盖提县"); + this.Add(653128, 653100, "岳普湖县"); + this.Add(653129, 653100, "伽师县"); + this.Add(653130, 653100, "巴楚县"); + this.Add(653131, 653100, "塔什库尔干塔吉克自治县"); + this.Add(653201, 653200, "和田市"); + this.Add(653221, 653200, "和田县"); + this.Add(653222, 653200, "墨玉县"); + this.Add(653223, 653200, "皮山县"); + this.Add(653224, 653200, "洛浦县"); + this.Add(653225, 653200, "策勒县"); + this.Add(653226, 653200, "于田县"); + this.Add(653227, 653200, "民丰县"); + this.Add(654002, 654000, "伊宁市"); + this.Add(654003, 654000, "奎屯市"); + this.Add(654004, 654000, "霍尔果斯市"); + this.Add(654021, 654000, "伊宁县"); + this.Add(654022, 654000, "察布查尔锡伯自治县"); + this.Add(654023, 654000, "霍城县"); + this.Add(654024, 654000, "巩留县"); + this.Add(654025, 654000, "新源县"); + this.Add(654026, 654000, "昭苏县"); + this.Add(654027, 654000, "特克斯县"); + this.Add(654028, 654000, "尼勒克县"); + this.Add(654201, 654200, "塔城市"); + this.Add(654202, 654200, "乌苏市"); + this.Add(654221, 654200, "额敏县"); + this.Add(654223, 654200, "沙湾县"); + this.Add(654224, 654200, "托里县"); + this.Add(654225, 654200, "裕民县"); + this.Add(654226, 654200, "和布克赛尔蒙古自治县"); + this.Add(654301, 654300, "阿勒泰市"); + this.Add(654321, 654300, "布尔津县"); + this.Add(654322, 654300, "富蕴县"); + this.Add(654323, 654300, "福海县"); + this.Add(654324, 654300, "哈巴河县"); + this.Add(654325, 654300, "青河县"); + this.Add(654326, 654300, "吉木乃县"); + this.Add(810001, 810000, "中西区"); + this.Add(810002, 810000, "湾仔区"); + this.Add(810003, 810000, "东区"); + this.Add(810004, 810000, "南区"); + this.Add(810005, 810000, "油尖旺区"); + this.Add(810006, 810000, "深水埗区"); + this.Add(810007, 810000, "九龙城区"); + this.Add(810008, 810000, "黄大仙区"); + this.Add(810009, 810000, "观塘区"); + this.Add(810010, 810000, "荃湾区"); + this.Add(810011, 810000, "屯门区"); + this.Add(810012, 810000, "元朗区"); + this.Add(810013, 810000, "北区"); + this.Add(810014, 810000, "大埔区"); + this.Add(810015, 810000, "西贡区"); + this.Add(810016, 810000, "沙田区"); + this.Add(810017, 810000, "葵青区"); + this.Add(810018, 810000, "离岛区"); + this.Add(820001, 820000, "花地玛堂区"); + this.Add(820002, 820000, "花王堂区"); + this.Add(820003, 820000, "望德堂区"); + this.Add(820004, 820000, "大堂区"); + this.Add(820005, 820000, "风顺堂区"); + this.Add(820006, 820000, "嘉模堂区"); + this.Add(820007, 820000, "路凼填海区"); + this.Add(820008, 820000, "圣方济各堂区"); +} \ No newline at end of file