利用NewGIS平台将FME模板发布为接口

news2024/12/25 12:16:59

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

前言

一、模板编写

二、发布模板

三、接口获取

四、移动端调用

​​​​​


前言

        在实际的应用生产过程中,尤其是移动端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文件

可以看到图层属性读取成功

原始数据图


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1707166.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

win11中文文件名称乱码解决方案

解压后出现以下的乱码 解决方案 步骤1.winR 输入intl.cpl 或 windows 自带的搜索搜“intl.cpl”,打开这个面板控制项 步骤2.在新打开的区域面板中,选择“管理”标签页,点击下方的“更改系统区域设置”按钮 步骤3.取消"Beta版…"选…

Nginx的配置与调试

目录 1、安装Nginx 2、Nginx的配置文件结构 2.1 Nginx的全局配置 2.2 HTTP服务器配置 2.3 HttpGzip模块配置 2.4 负载均衡配置 2.5 server虚拟主机配置 2.6 location URL匹配配置 2.7 StubStatus模块配置 1、安装Nginx 在安装Nginx之前,需确保系统已经安装…

Day38 代码随想录打卡|二叉树篇---二叉树的最大深度

题目(leecode T104): 给定一个二叉树 root ,返回其最大深度。 二叉树的 最大深度 是指从根节点到最远叶子节点的最长路径上的节点数。 递归法: 递归法首先将根节点作为参数传入,随后每一轮传入当前节点的…

【openlayers系统学习】3.3假彩色图像合成(三个波段合成假彩色图像)

三、假彩色图像合成 在上一步中,我们使用 ol/source/GeoTIFF​ 源从单个多波段源(具有红色、绿色、蓝色和Alpha波段)渲染真彩色图像。在下面这个例子中,我们将从可见光谱之外提取数据,并使用它来呈现假彩色合成。 我…

Linux echo命令(在终端输出文本)

文章目录 Linux Echo命令深度解析简介命令语法常见选项- -n:不输出行尾的换行符,这意味着输出后不会换到下一行。- -e:启用反斜杠转义的解释,允许使用特殊字符。- -E:禁用反斜杠转义的解释(默认选项&#x…

简单得阴影引导实现

效果如下: 实现方式: 1、引入三方库: implementation io.github.razerdp:BasePopup:3.2.0 2、代码实现 class NewUserGuide3Popup : BasePopupWindow {constructor(activity: Activity) : super(activity)constructor(context: Context) : super(con…

如何开启tomcat管理功能

1 、修改conf/tomcat-users.xml <role rolename"manager-gui"/> <user username"tomcat" password"tomcat" roles"manager-gui"/>2、修改webapps/manager/META-INF/context.xml <Valve className"org.apache.cata…

动态规划part02 Day42

LC62不同路径 LC63不同路径II(超时10min) 超时原因分析&#xff1a;思路想错了&#xff0c;即便是正确思路初始化也有点问题&#xff0c;应该将不必要的判断逻辑引入初始化的过程中初始化&#xff1a; 从左上角到[i][0]和[0][j]都只有一条路径dp[i][0]1和dp[0][j]1引入故障&am…

Go 错误日志处理

是不是所有的 if err ! nil 的地方都应该输出错误日志&#xff1f; 打印过多的错误日志会导致日志文件变得冗长和难以阅读。 其次&#xff0c;重复的错误信息会增加冗余。 此外&#xff0c;每一层都打印错误日志&#xff0c;一旦错误信息设计不当&#xff0c;可能会导致上下…

【iOS】——GCD再学习

文章目录 一、GCD的定义二、GCD 任务和队列1.任务2.队列 三、GCD 的使用1.创建队列2.创建任务3.队列任务 组合方式并发队列 同步执行异步执行 并发队列同步执行 串行队列异步执行 串行队列同步执行 主队列在主线程中调用 同步执行 主队列在其它线程中调用 同步执行 主队…

大模型实战-动手实现单agent

文章目录 入口cli_main.py工具tools.pyprompt prompt_cn.pyLLM 推理 model_provider.py致谢 agent 的核心思想&#xff1a;不断调用 LLM&#xff08;多轮对话&#xff09;&#xff0c;让 LLM 按照指定的格式&#xff08;例如 json&#xff09;进行回复&#xff0c;提取 LLM 回复…

vue 区分多环境打包

需求&#xff1a;区分不同的环境&#xff08;测试、正式环境&#xff09;&#xff0c;接口文档地址不同&#xff1b; 配置步骤&#xff1a; 1、在根目录下面新建 .env.xxx 文件&#xff08;xxx 根据环境不同配置&#xff09; 文件中一定要配置的参数项为&#xff1a;NODE_ENV…

自适应感兴趣区域的级联多尺度残差注意力CNN用于自动脑肿瘤分割| 文献速递-深度学习肿瘤自动分割

Title 题目 Cascade multiscale residual attention CNNs with adaptive ROI for automatic brain tumor segmentation 自适应感兴趣区域的级联多尺度残差注意力CNN用于自动脑肿瘤分割 01 文献速递介绍 脑肿瘤是大脑细胞异常和不受控制的增长&#xff0c;被认为是神经系统…

前端API: IntersectionObserver的那一二三件事

IntersectionObserver 基础 IntersectionObserver 可以监听一个元素和可视区域相交部分的比例&#xff0c;然后在可视比例达到某个阈值的时候触发回调。比如可以用来处理图片的懒加载等等 首先我们来看下基本的格式&#xff1a; const observer new IntersectionObserver(c…

vue 笔记02

目录 01 事件修饰符 02 按键修饰符 03 v-bind属性 04 vue-axios的基本使用 05 vue的生命周期 06 vue生命周期涉及到的其他的知识点 01 事件修饰符 vue的事件修饰符 事件名称.修饰符1.修饰符2...事件驱动函数 stop 阻止冒泡修饰符 prevent 阻止默认行为 once 当前事件只触…

牛客题霸-SQL大厂面试真题(一)

本文基于前段时间学习总结的 MySQL 相关的查询语法&#xff0c;在牛客网找了相应的 MySQL 题目进行练习&#xff0c;以便加强对于 MySQL 查询语法的理解和应用。 由于涉及到的数据库表较多&#xff0c;因此本文不再展示&#xff0c;只提供 MySQL 代码与示例输出。 以下内容是…

期权方向性交易策略怎么制定?

今天期权懂带你了解期权方向性交易策略怎么制定&#xff1f;国内的期权品种已经多达十几种&#xff0c;其中ETF期权是流量最大的品种&#xff0c;截止今日已经上市了十二种ETF期权。 期权方向性交易策略怎么制定&#xff1f; 期权方向性交易策略主要依赖于投资者对市场未来走势…

作业job——kettle开发30

一、作业 大多数ETL项目都需要完成各种各样的维护工作。 例如&#xff0c;如何传送文件;验证数据库表是否存在&#xff0c;等等。而这些操作都是按照一定顺序完成。因为转换以并行方式执行&#xff0c;就需要一个可以串行执行的作业来处理这些操作。 一个作业包含一个或多个作…

WHLUG活动回顾 | 4大技术分享!干货满满,热闹非凡!

内容来源&#xff1a;deepin&#xff08;深度&#xff09;社区 2024 年 5 月 25 日下午&#xff0c;由 deepin&#xff08;深度&#xff09;社区华中科技大学开放原子开源俱乐部联合举办的武汉 Linux 爱好者线下沙龙活动&#xff08;WHLUG&#xff09;在华中科技大学成功举办。…

vue3中的toRaw API

文章目录 什么是toRaw API&#xff1f;为什么需要toRaw&#xff1f;如何使用toRaw&#xff1f;实际应用场景 这两天在写项目的时候&#xff0c;发现了一个之前没用过的api&#xff0c;于是上网查了一下&#xff0c;发现这个api还是挺常用&#xff0c;所以在这记录一下 什么是t…