提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
前言
一、模板编写
二、发布模板
三、接口获取
四、移动端调用
前言
在实际的应用生产过程中,尤其是移动端GIS软件的开发,针对一些闭源的格式,比如dwg、esri-mdb、esri-gdb等等,这种非开源格式不像shp、dxf、kml这种明码格式可以通过手搓数据格式转换来实现解析,FME是一个很好的转换工具,但是没办法安装在移动端。我们团队开发的NewGIS平台能够实现自动解析FME写好的模板,并将模板发布为接口或者工具。
一、模板编写
以矢量文件转换为例子,写一个读取文件夹中的文件并对矢量格式分类,然后再读取转换为geojson的模板
先通过path读模块读取文件路径
然后过滤成多个数据类型
统一转换为geojson并写出
参数就两个,一个写入,一个写出,可以理解为猪进去,香肠出来。
二、发布模板
登录NewGIS平台,上传模板
上传完成后,在列表栏可以搜索到模板,并运行该模板
三、接口获取
我们需要在其他端调用该接口,用F12爬取一下接口,
首先的上传文件接口
然后是运行模板接口
最后是获取运行结果的接口
然后用go语言将这几个接口封装为函数,函数的主要功能就是调用上述的接口,将文件转换为geojson,这儿因为是外网部署,为了安全性,接口地址修改了
func SendData(path string) geojson.FeatureCollection {var featureCollection geojson.FeatureCollectionif filepath.Ext(path) != ".zip" && filepath.Ext(path) != ".rar" {dirPath := filepath.Dir(path)newdir := filepath.Join(dirPath, "temp_result")MoveFileToFolder(path, newdir)newpath := filepath.Join(dirPath, "temp_result.zip")ZipFolderTo(dirPath, newpath)path = newpath}//获取任务idresp, _ := http.Get("http://.goho.co/task/FmwParamsGet?FmwId=5915ad49-eb29-4c76-a963-08d31c264d84&users=%E6%A2%81%E8%BF%9B")defer resp.Body.Close()body, _ := io.ReadAll(resp.Body)var taskjson map[string]interface{}json.Unmarshal(body, &taskjson)TaskId := taskjson["TaskId"].(string)//上传矢量文件file, _ := os.Open(path)defer file.Close()buf := new(bytes.Buffer)writer := multipart.NewWriter(buf)writer.WriteField("field", "导入矢量文件")writer.WriteField("filter", "")writer.WriteField("taskid", TaskId)part, _ := writer.CreateFormFile("file", path)io.Copy(part, file)writer.Close()req, err := http.NewRequest("POST", "http://.goho.co/task/TempFileAccept", buf)if err != nil {panic(err)}req.Header.Set("Content-Type", writer.FormDataContentType())client := &http.Client{}res, _ := client.Do(req)defer res.Body.Close()//运行模板data := map[string]interface{}{"taskid": TaskId,"data": make(map[string]string),}jsonData, _ := json.Marshal(data)url := "http://15808108713.goho.co/task/TaskRun"req, _ = http.NewRequest("POST", url, bytes.NewBuffer(jsonData))req.Header.Set("Content-Type", "application/json")client = &http.Client{}resp, _ = client.Do(req)//监控是否完成模板执行如果已完成则拿到下载链接downloadurl := ""status := ""for {resp, _ = http.Get("http://.goho.co/task/TaskGet?User=%E6%A2%81%E8%BF%9B&fmw_id=5915ad49-eb29-4c76-a963-08d31c264d84")body, _ = io.ReadAll(resp.Body)var resultjson []map[string]interface{}json.Unmarshal(body, &resultjson)for _, value := range resultjson {if TaskId == value["task_id"].(string) {if value["status"].(string) == "3" || value["status"].(string) == "4" {status = value["status"].(string)downloadurl = value["out_path"].(string)}}}time.Sleep(1 * time.Second)if status != "" {break}}if downloadurl != "" {resp, _ = http.Get(downloadurl)tempFile, _ := ioutil.TempFile("", "example-*.zip")defer tempFile.Close()_, err = io.Copy(tempFile, resp.Body)tempFile.Seek(0, 0)zr, _ := zip.OpenReader(tempFile.Name())defer zr.Close()file2 := zr.File[0]f, _ := file2.Open()defer f.Close()var content bytes.Bufferio.Copy(&content, f)data2 := content.Bytes()json.Unmarshal(data2, &featureCollection.Features)//删除任务}url = fmt.Sprintf("http://.goho.co/task/TaskDel?task_id=%s", TaskId)http.Get(url)return featureCollection
}
四、移动端调用
导入数据
选择dwg文件
可以看到图层属性读取成功
原始数据图