正在显示
14 个修改的文件
包含
370 行增加
和
24 行删除
1 | +GBK | |
\ No newline at end of file | ... | ... |
不能预览此文件类型
不能预览此文件类型
不能预览此文件类型
不能预览此文件类型
... | ... | @@ -33,8 +33,7 @@ class Api(ApiTemplate): |
33 | 33 | try: |
34 | 34 | |
35 | 35 | task_guid = uuid.uuid1().__str__() |
36 | - download_process = multiprocessing.Process(target=self.download, args=(task_guid,self.para)) | |
37 | - download_process.start() | |
36 | + | |
38 | 37 | |
39 | 38 | task = Task(guid=task_guid, |
40 | 39 | name="下载 | {}".format(self.para.get("table_name")), |
... | ... | @@ -45,11 +44,18 @@ class Api(ApiTemplate): |
45 | 44 | file_name=None, |
46 | 45 | process="数据下载中", |
47 | 46 | database_guid=self.para.get("database_guid"), |
48 | - task_pid=download_process.pid) | |
47 | + # task_pid=download_process.pid | |
48 | + ) | |
49 | 49 | |
50 | 50 | db.session.add(task) |
51 | 51 | db.session.commit() |
52 | 52 | |
53 | + download_process = multiprocessing.Process(target=self.download, args=(task_guid,self.para)) | |
54 | + download_process.start() | |
55 | + | |
56 | + task.task_pid = download_process.pid | |
57 | + db.session.commit() | |
58 | + | |
53 | 59 | res["data"] = "下载任务已提交!" |
54 | 60 | |
55 | 61 | # 提示信息 |
... | ... | @@ -79,8 +85,10 @@ class Api(ApiTemplate): |
79 | 85 | try: |
80 | 86 | |
81 | 87 | #任务控制,等待执行 |
88 | + | |
82 | 89 | TaskController.wait(task_guid) |
83 | 90 | task_writer = TaskWriter(task_guid) |
91 | + | |
84 | 92 | task_writer.update_task({"state":2,"update_time":datetime.datetime.now(),"process" : "下载中"}) |
85 | 93 | task_writer.update_process("开始下载...") |
86 | 94 | |
... | ... | @@ -186,6 +194,9 @@ class Api(ApiTemplate): |
186 | 194 | |
187 | 195 | # 创建一个gdb datasource |
188 | 196 | gdb_driver = ogr.GetDriverByName('FileGDB') |
197 | + if not gdb_driver: | |
198 | + raise Exception("目前不支持GDB下载,驱动不存在!") | |
199 | + | |
189 | 200 | uuid_ = uuid.uuid1().__str__() |
190 | 201 | parent = os.path.dirname(os.path.dirname(os.path.realpath(__file__))) |
191 | 202 | ... | ... |
... | ... | @@ -76,8 +76,7 @@ class Api(ApiTemplate): |
76 | 76 | print("关闭数据库失败!") |
77 | 77 | return res |
78 | 78 | |
79 | - entry_thread = multiprocessing.Process(target=self.entry,args=(self.para.get("task_guid"),)) | |
80 | - entry_thread.start() | |
79 | + | |
81 | 80 | |
82 | 81 | |
83 | 82 | # 录入数据后台进程,录入主函数为entry |
... | ... | @@ -93,11 +92,17 @@ class Api(ApiTemplate): |
93 | 92 | catalog_guid=self.para.get("catalog_guid"), |
94 | 93 | process="等待入库", |
95 | 94 | parameter=json.dumps(self.para), |
96 | - task_pid=entry_thread.pid) | |
95 | + # task_pid=entry_thread.pid | |
96 | + ) | |
97 | 97 | db.session.add(task) |
98 | 98 | db.session.commit() |
99 | 99 | |
100 | 100 | |
101 | + entry_thread = multiprocessing.Process(target=self.entry,args=(self.para.get("task_guid"),)) | |
102 | + entry_thread.start() | |
103 | + task.task_pid=entry_thread.pid | |
104 | + db.session.commit() | |
105 | + | |
101 | 106 | res["result"] = True |
102 | 107 | res["msg"] = "数据录入提交成功!" |
103 | 108 | res["data"] = self.para["task_guid"] |
... | ... | @@ -110,6 +115,7 @@ class Api(ApiTemplate): |
110 | 115 | task_writer = None |
111 | 116 | this_task_layer = [] |
112 | 117 | try: |
118 | + | |
113 | 119 | #任务控制,等待执行 |
114 | 120 | TaskController.wait(task_guid) |
115 | 121 | |
... | ... | @@ -160,6 +166,7 @@ class Api(ApiTemplate): |
160 | 166 | task_writer.session.delete(iln) |
161 | 167 | |
162 | 168 | except Exception as e: |
169 | + StructurePrint().print(e.__str__(), "error") | |
163 | 170 | task_writer.update_task({"state": -1, "process": "入库失败"}) |
164 | 171 | for ln in this_task_layer: |
165 | 172 | iln = task_writer.session.query(InsertingLayerName).filter_by(name=ln).one_or_none() | ... | ... |
... | ... | @@ -35,9 +35,6 @@ class Api(ApiTemplate): |
35 | 35 | # 初始化task |
36 | 36 | task_guid = uuid.uuid1().__str__() |
37 | 37 | |
38 | - refresh_process = multiprocessing.Process(target=self.table_refresh,args=(database,task_guid,self.para.get("creator"))) | |
39 | - refresh_process.start() | |
40 | - | |
41 | 38 | task = Task(guid=task_guid, |
42 | 39 | name="更新 | {}".format(database.alias), |
43 | 40 | create_time=datetime.datetime.now(), |
... | ... | @@ -47,10 +44,17 @@ class Api(ApiTemplate): |
47 | 44 | file_name=None, |
48 | 45 | database_guid=database.guid, |
49 | 46 | process="数据库更新中", |
50 | - task_pid=refresh_process.pid) | |
47 | + # task_pid=refresh_process.pid | |
48 | + ) | |
51 | 49 | |
52 | 50 | db.session.add(task) |
53 | 51 | db.session.commit() |
52 | + | |
53 | + refresh_process = multiprocessing.Process(target=self.table_refresh,args=(database,task_guid,self.para.get("creator"))) | |
54 | + refresh_process.start() | |
55 | + task.task_pid = refresh_process.pid | |
56 | + db.session.commit() | |
57 | + | |
54 | 58 | res["msg"] = "数据库更新已提交!" |
55 | 59 | res["data"] = task_guid |
56 | 60 | res["result"] = True | ... | ... |
... | ... | @@ -71,9 +71,6 @@ class Api(ApiTemplate): |
71 | 71 | |
72 | 72 | # 初始化task |
73 | 73 | task_guid = uuid.uuid1().__str__() |
74 | - vacuate_process = multiprocessing.Process(target=self.task,args=(table,task_guid)) | |
75 | - vacuate_process.start() | |
76 | - | |
77 | 74 | |
78 | 75 | task = Task(guid=task_guid, |
79 | 76 | name="矢量金字塔 | {}".format(table.name), |
... | ... | @@ -85,12 +82,19 @@ class Api(ApiTemplate): |
85 | 82 | file_name=None, |
86 | 83 | database_guid=table.database_guid, |
87 | 84 | process="构建中", |
88 | - task_pid= vacuate_process.pid | |
85 | + # task_pid= vacuate_process.pid | |
89 | 86 | # parameter=",".join([str(x) for x in ref_grids]) |
90 | 87 | ) |
91 | 88 | |
92 | 89 | db.session.add(task) |
93 | 90 | db.session.commit() |
91 | + | |
92 | + vacuate_process = multiprocessing.Process(target=self.task,args=(table,task_guid)) | |
93 | + vacuate_process.start() | |
94 | + | |
95 | + task.task_pid = vacuate_process.pid | |
96 | + db.session.commit() | |
97 | + | |
94 | 98 | res["msg"] = "矢量金字塔构建已提交!" |
95 | 99 | res["data"] = task_guid |
96 | 100 | res["result"] = True | ... | ... |
... | ... | @@ -74,8 +74,7 @@ class Api(ApiTemplate): |
74 | 74 | # 初始化task |
75 | 75 | task_guid = uuid.uuid1().__str__() |
76 | 76 | |
77 | - vacuate_process = multiprocessing.Process(target=self.task,args=(table,task_guid,grids)) | |
78 | - vacuate_process.start() | |
77 | + | |
79 | 78 | |
80 | 79 | |
81 | 80 | task = Task(guid=task_guid, |
... | ... | @@ -90,10 +89,17 @@ class Api(ApiTemplate): |
90 | 89 | database_guid=table.database_guid, |
91 | 90 | process="构建中", |
92 | 91 | parameter=self.para.get("grids"), |
93 | - task_pid=vacuate_process.pid) | |
92 | + # task_pid=vacuate_process.pid | |
93 | + ) | |
94 | 94 | |
95 | 95 | db.session.add(task) |
96 | 96 | db.session.commit() |
97 | + | |
98 | + vacuate_process = multiprocessing.Process(target=self.task,args=(table,task_guid,grids)) | |
99 | + vacuate_process.start() | |
100 | + task.task_pid = vacuate_process.pid | |
101 | + db.session.commit() | |
102 | + | |
97 | 103 | res["msg"] = "矢量金字塔构建已提交!" |
98 | 104 | res["data"] = task_guid |
99 | 105 | res["result"] = True | ... | ... |
... | ... | @@ -25,13 +25,6 @@ class Api(ApiTemplate): |
25 | 25 | res = {} |
26 | 26 | try: |
27 | 27 | task_guid = uuid.uuid1().__str__() |
28 | - | |
29 | - | |
30 | - pyramid_process = multiprocessing.Process(target=self.task, args=(task_guid,self.para)) | |
31 | - pyramid_process.start() | |
32 | - | |
33 | - | |
34 | - | |
35 | 28 | task = Task(guid=task_guid, |
36 | 29 | name="影像金字塔 | {}".format(self.para.get("alias")), |
37 | 30 | create_time=datetime.datetime.now(), |
... | ... | @@ -44,6 +37,9 @@ class Api(ApiTemplate): |
44 | 37 | db.session.add(task) |
45 | 38 | db.session.commit() |
46 | 39 | |
40 | + pyramid_process = multiprocessing.Process(target=self.task, args=(task_guid,self.para)) | |
41 | + pyramid_process.start() | |
42 | + | |
47 | 43 | res["data"] = "创建影像金字塔任务已提交!" |
48 | 44 | res["result"] = True |
49 | 45 | ... | ... |
... | ... | @@ -31,6 +31,7 @@ class Api(ApiTemplate): |
31 | 31 | # 调用电子地图的注册服务接口 |
32 | 32 | |
33 | 33 | project_file = ProjectFile.create(self.para) |
34 | + | |
34 | 35 | para = {"name":self.para.get("name"), |
35 | 36 | "title":self.para.get("title"), |
36 | 37 | "type":"tileserver", |
... | ... | @@ -41,6 +42,7 @@ class Api(ApiTemplate): |
41 | 42 | resp: Response = requests.post(tile_service_register_url,data=json.dumps(para), |
42 | 43 | headers={'Content-Type':'application/json'},timeout=3 |
43 | 44 | ) |
45 | + | |
44 | 46 | if resp.status_code == 200: |
45 | 47 | resp.encoding="utf-8" |
46 | 48 | resp_json = resp.json() |
... | ... | @@ -143,6 +145,12 @@ class Api(ApiTemplate): |
143 | 145 | "in": "formData", |
144 | 146 | "type": "string", |
145 | 147 | "description": "[电子地图,影像地图]切片方案"}, |
148 | + | |
149 | + {"name": "scheme", | |
150 | + "in": "formData", | |
151 | + "type": "string", | |
152 | + "description": "[影像地图,电子地图]切片方案json"}, | |
153 | + | |
146 | 154 | {"name": "overview", |
147 | 155 | "in": "formData", |
148 | 156 | "type": "string", | ... | ... |
1 | +# coding=utf-8 | |
2 | +#author: 4N | |
3 | +#createtime: 2021/12/6 | |
4 | +#email: nheweijun@sina.com | |
5 | + | |
6 | + | |
7 | +from app.modules.service.models import TileScheme | |
8 | +from app.util.component.ModelVisitor import ModelVisitor | |
9 | +from app.util.component.StructurePrint import StructurePrint | |
10 | +import json | |
11 | +import base64 | |
12 | + | |
13 | + | |
14 | +class ProjectFile: | |
15 | + | |
16 | + @classmethod | |
17 | + def create(cls,para): | |
18 | + if para.get("tile_type").__eq__("WMTS"): | |
19 | + | |
20 | + if para.get("scheme"): | |
21 | + tile_scheme = json.loads(para.get("scheme")) | |
22 | + else: | |
23 | + tile_scheme: TileScheme = TileScheme.query.filter_by(guid=para.get("scheme_guid")).one_or_none() | |
24 | + if not tile_scheme: | |
25 | + raise Exception("切片方案不存在!") | |
26 | + tile_scheme = ModelVisitor.object_to_json(tile_scheme) | |
27 | + | |
28 | + default_scheme = {} | |
29 | + other_scheme = [] | |
30 | + if isinstance(tile_scheme,list): | |
31 | + for ts in tile_scheme: | |
32 | + if ts.get("isDefault"): | |
33 | + default_scheme = ts | |
34 | + else: | |
35 | + other_scheme.append(ts) | |
36 | + else: | |
37 | + default_scheme = tile_scheme | |
38 | + | |
39 | + project_xml_format = ''' | |
40 | +<?xml version="1.0"?> | |
41 | +<dmap projectname="wmtstest" version="4.0"> | |
42 | + <projectCrs> | |
43 | + <spatialrefsys> | |
44 | + <wkt>{wkt}</wkt> | |
45 | + <proj4>{proj4}</proj4> | |
46 | + <srid>{srid}</srid> | |
47 | + <description/> | |
48 | + <projectionacronym/> | |
49 | + </spatialrefsys> | |
50 | + </projectCrs> | |
51 | + <projectlayers> | |
52 | + <maplayer name="{name}" alias="{alias}" type="0"> | |
53 | + <extent> | |
54 | + <xmin>{xmin}</xmin> | |
55 | + <ymin>{ymin}</ymin> | |
56 | + <xmax>{xmax}</xmax> | |
57 | + <ymax>{ymax}</ymax> | |
58 | + </extent> | |
59 | + <style>{layer_style}</style> | |
60 | + <format>{layer_format}</format> | |
61 | + <vendor>{vendor}</vendor> | |
62 | + <datasource>{datasource}</datasource> | |
63 | + <defaultTileMatrixSet>{defaultTileMatrixSet}</defaultTileMatrixSet> | |
64 | + <tileMatrixSets> | |
65 | + <tileMatrixSet> | |
66 | + <id>{id}</id> | |
67 | + <crs>{crs}</crs> | |
68 | + <tileCols>{cols}</tileCols> | |
69 | + <tileRows>{rows}</tileRows> | |
70 | + <dpi>{dpi}</dpi> | |
71 | + <tileOrigin> | |
72 | + <X>{x}</X> | |
73 | + <Y>{y}</Y> | |
74 | + </tileOrigin> | |
75 | + <levels> | |
76 | + {levels} | |
77 | + </levels> | |
78 | + </tileMatrixSet> | |
79 | + {other_tileMatrixSet} | |
80 | + </tileMatrixSets> | |
81 | + </maplayer> | |
82 | + </projectlayers> | |
83 | +</dmap> | |
84 | +''' | |
85 | + | |
86 | + level_each = '''<level> | |
87 | + <id>{lev}</id> | |
88 | + <scaleDenominator>{scale}</scaleDenominator> | |
89 | + <resolution>{resolution}</resolution> | |
90 | + </level> | |
91 | + ''' | |
92 | + | |
93 | + levels = '' | |
94 | + for level in json.loads(default_scheme.get("levels")): | |
95 | + levels = "{}{}".format(levels, level_each.format(lev=level["level"], | |
96 | + scale=level["scale"], | |
97 | + resolution=level["resolution"], | |
98 | + )) | |
99 | + #删除空格 | |
100 | + levels = levels.strip() | |
101 | + | |
102 | + layer_extent = para.get("layer_extent").split(",") | |
103 | + | |
104 | + project_xml = project_xml_format.format(wkt="", | |
105 | + proj4="", | |
106 | + srid=para.get("crs").split("::")[-1], | |
107 | + name=para.get("layer_name"), | |
108 | + alias=para.get("alias") if para.get("alias") else "", | |
109 | + xmin=layer_extent[0], | |
110 | + xmax=layer_extent[1], | |
111 | + ymin=layer_extent[2], | |
112 | + ymax=layer_extent[3], | |
113 | + layer_style=para.get("layer_style"), | |
114 | + layer_format=para.get("layer_format"), | |
115 | + vendor=para.get("vendor"), | |
116 | + datasource=para.get("datasource"), | |
117 | + id=default_scheme.get("name"), | |
118 | + crs=para.get("crs"), | |
119 | + cols=default_scheme.get("cols"), | |
120 | + rows=default_scheme.get("rows"), | |
121 | + dpi=default_scheme.get("dpi"), | |
122 | + x=default_scheme.get("top_left").split(",")[0], | |
123 | + y=default_scheme.get("top_left").split(",")[1], | |
124 | + levels=levels, | |
125 | + other_tileMatrixSet=cls.create_other(other_scheme), | |
126 | + defaultTileMatrixSet=default_scheme.get("name"), | |
127 | + ) | |
128 | + else: | |
129 | + | |
130 | + project_xml_format = ''' | |
131 | +<?xml version="1.0"?> | |
132 | +<dmap projectname="tmstest" version="4.0"> | |
133 | + <projectCrs> | |
134 | + <spatialrefsys> | |
135 | + <wkt>{wkt}</wkt> | |
136 | + <proj4>{proj4}</proj4> | |
137 | + <srid>{srid}</srid> | |
138 | + <description/> | |
139 | + <projectionacronym/> | |
140 | + </spatialrefsys> | |
141 | + </projectCrs> | |
142 | + <projectlayers> | |
143 | + <maplayer name="{name}" alias="{alias}" type="0"> | |
144 | + <extent> | |
145 | + <xmin>{xmin}</xmin> | |
146 | + <ymin>{ymin}</ymin> | |
147 | + <xmax>{xmax}</xmax> | |
148 | + <ymax>{ymax}</ymax> | |
149 | + </extent> | |
150 | + <style>{layer_style}</style> | |
151 | + <format>{layer_format}</format> | |
152 | + <vendor>{vendor}</vendor> | |
153 | + <datasource>{datasource}</datasource> | |
154 | + </maplayer> | |
155 | + </projectlayers> | |
156 | +</dmap> | |
157 | +''' | |
158 | + layer_extent = para.get("layer_extent").split(",") | |
159 | + project_xml = project_xml_format.format(wkt="", | |
160 | + proj4="", | |
161 | + srid=para.get("crs").split("::")[-1], | |
162 | + name=para.get("layer_name"), | |
163 | + alias=para.get("alias") if para.get("alias") else "", | |
164 | + xmin=layer_extent[0], | |
165 | + xmax=layer_extent[1], | |
166 | + ymin=layer_extent[2], | |
167 | + ymax=layer_extent[3], | |
168 | + layer_style=para.get("layer_style"), | |
169 | + layer_format=para.get("layer_format"), | |
170 | + vendor=para.get("vendor"), | |
171 | + datasource=para.get("datasource"), | |
172 | + ) | |
173 | + | |
174 | + project_xml = project_xml.strip() | |
175 | + StructurePrint().print(project_xml) | |
176 | + StructurePrint().print(str(base64.b64encode(project_xml.encode('utf-8')), encoding="utf8")) | |
177 | + return str(base64.b64encode(project_xml.encode('utf-8')), encoding="utf8") | |
178 | + | |
179 | + @classmethod | |
180 | + def create_other(cls,other_scheme): | |
181 | + other = "" | |
182 | + | |
183 | + for scheme in other_scheme: | |
184 | + | |
185 | + tileMatrixSet=''' | |
186 | + <tileMatrixSet> | |
187 | + <id>{id}</id> | |
188 | + <crs>{crs}</crs> | |
189 | + <tileCols>{cols}</tileCols> | |
190 | + <tileRows>{rows}</tileRows> | |
191 | + <dpi>{dpi}</dpi> | |
192 | + <tileOrigin> | |
193 | + <X>{x}</X> | |
194 | + <Y>{y}</Y> | |
195 | + </tileOrigin> | |
196 | + <levels> | |
197 | + {levels} | |
198 | + </levels> | |
199 | + </tileMatrixSet> | |
200 | + ''' | |
201 | + | |
202 | + level_each = '''<level> | |
203 | + <id>{lev}</id> | |
204 | + <scaleDenominator>{scale}</scaleDenominator> | |
205 | + <resolution>{resolution}</resolution> | |
206 | + </level> | |
207 | + ''' | |
208 | + | |
209 | + levels = '' | |
210 | + for level in json.loads(scheme.get("levels")): | |
211 | + levels = "{}{}".format(levels, level_each.format(lev=level["level"], | |
212 | + scale=level["scale"], | |
213 | + resolution=level["resolution"], | |
214 | + )) | |
215 | + # 删除空格 | |
216 | + levels = levels.strip() | |
217 | + tileMatrixSet = tileMatrixSet.format(id=scheme.get("name"), | |
218 | + crs=scheme.get("crs"), | |
219 | + cols=scheme.get("tileCols"), | |
220 | + rows=scheme.get("tileRows"), | |
221 | + dpi=scheme.get("dpi"), | |
222 | + x=scheme.get("top_left").split(",")[0], | |
223 | + y=scheme.get("top_left").split(",")[1], | |
224 | + levels=levels | |
225 | + ) | |
226 | + tileMatrixSet = tileMatrixSet.strip() | |
227 | + other+=tileMatrixSet | |
228 | + | |
229 | + other = other.strip() | |
230 | + return other | ... | ... |
test/VectorTile/__init__.py
0 → 100644
1 | +# coding=utf-8 | |
2 | +#author: 4N | |
3 | +#createtime: 2022/4/12 | |
4 | +#email: nheweijun@sina.com | |
5 | + | |
6 | + | |
7 | +from osgeo.ogr import * | |
8 | +from osgeo import ogr | |
9 | +import time | |
10 | +import shutil | |
11 | +import sys | |
12 | +import os | |
13 | + | |
14 | +def shp2mvt(data_path,out_path): | |
15 | + t1 = time.time() | |
16 | + | |
17 | + if os.path.exists(out_path): | |
18 | + shutil.rmtree(out_path, True) | |
19 | + try: | |
20 | + data_path = sys.argv[1] | |
21 | + out_path = sys.argv[2] | |
22 | + except: | |
23 | + pass | |
24 | + | |
25 | + driver: Driver = ogr.GetDriverByName("ESRI Shapefile") | |
26 | + ds: DataSource = driver.Open(data_path, 0) | |
27 | + | |
28 | + lay:Layer = ds.GetLayer(0) | |
29 | + | |
30 | + | |
31 | + mvt_driver:Driver = ogr.GetDriverByName("MVT") | |
32 | + | |
33 | + mvt_driver.CopyDataSource(ds,out_path) | |
34 | + | |
35 | + print(time.time()-t1) | |
36 | + | |
37 | + | |
38 | +def shp2geojson(data_path,out_path,format="pbf"): | |
39 | + t1 = time.time() | |
40 | + | |
41 | + try: | |
42 | + data_path = sys.argv[1] | |
43 | + out_path = sys.argv[2] | |
44 | + except: | |
45 | + pass | |
46 | + | |
47 | + | |
48 | + driver: Driver = ogr.GetDriverByName("ESRI Shapefile") | |
49 | + ds: DataSource = driver.Open(data_path, 0) | |
50 | + | |
51 | + mvt_driver:Driver = ogr.GetDriverByName("GeoJSON") | |
52 | + | |
53 | + mvt_driver.CopyDataSource(ds,out_path) | |
54 | + | |
55 | + print(time.time()-t1) | |
56 | + | |
57 | +def geojson2mvt(data_path,out_path): | |
58 | + t1 = time.time() | |
59 | + | |
60 | + if os.path.exists(out_path): | |
61 | + shutil.rmtree(out_path, True) | |
62 | + | |
63 | + | |
64 | + geosjon_driver: Driver = ogr.GetDriverByName("GeoJSON") | |
65 | + ds: DataSource = geosjon_driver.Open(data_path, 0) | |
66 | + | |
67 | + mvt_driver:Driver = ogr.GetDriverByName("MVT") | |
68 | + | |
69 | + mvt_driver.CopyDataSource(ds,out_path) | |
70 | + | |
71 | + print(time.time()-t1) | |
72 | + | |
73 | +if __name__ == '__main__': | |
74 | + | |
75 | + | |
76 | + # shp2geojson(r"J:\Data\矢量数据\广州\gzpoi\gzpoisub3.shp",r"J:\Data\矢量数据\广州\gzpoi\gzpoisub3.geojson") | |
77 | + | |
78 | + # geojson2mvt(r"J:\Data\矢量数据\广州\gzpoi\gzpoisub2.geojson",r"J:\Data\矢量数据\广州\gzpoi\gzpoisub3.mvt") | |
79 | + shp2mvt(r"J:\Data\矢量数据\广州\gzpoi\gzpoisub3.shp",r"J:\Data\矢量数据\广州\gzpoi\gzpoisub3.mvt") | |
\ No newline at end of file | ... | ... |
请
注册
或
登录
后发表评论