提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
前言
一、模板编写
二、发布模板
三、接口获取
四、移动端调用
前言
在实际的应用生产过程中,尤其是移动端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.FeatureCollection
if 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
}
//获取任务id
resp, _ := 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.Buffer
io.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文件
可以看到图层属性读取成功
原始数据图