从零开始将图片信息和空间信息绑定,并在前端展示到地图

news2025/7/19 9:00:31

作者:xiaoyan

关键词:前端查询时展示和空间数据绑定的图片资源

本文适合零基础入门

背景:iServer支持空间查询,可以将空间数据属性表中的属性查询出来,如通过SQL语句查询出某地大楼实际层高,或者查询出某条道路车道数量等等,但若用户不满足于查询出属性表中记录的字符串,数字等呢?是否有办法向属性表中存入图片等等。例如将商铺门面照片存入属性表,在前端通过查询时,不仅显示出该商铺在地图上的地理位置,商店名称,查询时是否能在前端弹窗,展示该商铺的实景图片呢?通过iDesktop,iServer,iClient三款超图产品配合,本文将带您一步一步实现,在查询同时在前端弹窗展示图片的效果。
数据内绑定图片上图效果
准备:iDesktop,iServer,iClient,几张图片。
可选:根据业务场景选择需要用到的数据,本文中数据为临时绘制,图片也可以绑定到从测绘等工作中获得的业务数据。

步骤:
iDesktop准备数据

  1. 首先,我们需要准备数据,在iDesktop中我们将我们期望的图片与空间数据进行绑定,在这里将带您实现一个最简单的例子。
  2. 打开我们安装好的iDesktop,在左上角工作空间管理器中,创建一个文件型数据源,命名,选择保存路径。这里基于我们已有的数据源来做也是可以的。

新建文件数据源

创建一个点数据集,线或者面数据集也是可以的,这里可以根据业务场景来自己决定。记得选择好当前需要的坐标系。以便在之后前端加载到地图上展示。
新建数据集
新建数据集
之后双击我们新创建出的数据集,将其在地图窗口中打开。在左下角图层管理器中将数据集单击小铅笔,开启编辑状态。
开始编辑
绘制点

之后单击此处,我们可以在我们数据集中添加点,我们的数据可以是在iDesktop中手绘的,也可以是叠加一张影像底图去绘制,也可以是从shapefile,cad,geojson,gdb等公开格式数据集中导入的。此处绘制三个点,作为我们的测试数据。为了更明显展示我为这个图层配置了图层风格。
制作数据
实际业务中数据量会比这个大得多,在此处只是做一个示例。

我们的数据需要一个用来作为查询条件的字段,以及一个存储图片的字段。
右键我们刚刚创建好的数据集,为我们的数据集属性表添加这两个字段。
添加字段
单击属性后在iDesktop右边会弹出该窗口,我们选择编辑属性表,单击加号,添加字段。需要为字段设置名称,别名,以及类型。
添加字段
我的配置如下,请注意存储图片我们这里需要使用二进制型作为字段内容的类型。PointName我这里用于作为空间数据的查询条件,Picture用来存储我们的图片。

之后单击√应用,为数据集新增这两个字段。

然后我们为这两个字段填入数据,右键数据集,然后单击“浏览属性表”
编辑属性表存入图片
二进制型的字段,我们对空白处双击可以开始编辑,之后单击出现的 “…”按钮,我们选择我们想要保存的图片。
插入图片
保存好后二进制型字段会显示为BinaryData
BinaryData指示为已经保存好
到这里我们数据就制作好了,之后我们右键工作空间,将工作空间保存到与文件型数据源相同路径下。
保存工作空间
之后我们就拥有了这两个文件,这是将工作空间和数据源保存成文件型的,也可以选择保存到数据库中,让同一个网段的机器都能方便访问,这一段不再叙述。
获得的数据
通过iDesktop制作数据就到这里了,之后我们需要在iServer中将这份数据,发布成服务,供前端浏览器调用。

已制作好的数据:
链接:https://pan.baidu.com/s/1DN0ghWdu9UnGUxMjbmdOrw?pwd=smap
提取码:smap

iServer:
这一步中我们需要将我们制作好的数据发布到iServer服务器作为一个数据服务,作为数据服务,这样我们才能在前端针对性的获取我们想要的数据。发布数据服务的过程不再赘述,详情请参考以下地址。
http://support.supermap.com.cn/DataWarehouse/WebDocHelp/iServer/index.htm
发布数据服务
之后在数据服务获得的地址中,按照红框中路径层层访问,最终浏览我们存入的图片。
存入的图片
选择一个要素进行查看,发现我们存入PICTURE字段的二进制图片,在此处没有以图片的方式显示。而是一长串字母和符号,其实这是我们图片的Base64编码。Base64编码在前端是可以放入img标签的,即可变成一张图片,用以插入dom树中。

iClient:
下面演示的是将图片的base64编码,通过iServer提供的数据服务查询出后,拼接至img标签内,在页面中作为气泡展示在地图上的代码。


<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title data-i18n="resources.title_mapService"></title>
<script type="text/javascript" include="bootstrap-css" src="../js/include-web.js"></script>
<script type="text/javascript" src="../../dist/ol/include-ol.js"></script>
<style>
        .ol-popup {
            position: absolute;
            background-color: white;
            -webkit-filter: drop-shadow(0 1px 4px rgba(0, 0, 0, 0.2));
            filter: drop-shadow(0 1px 4px rgba(0, 0, 0, 0.2));
            padding: 15px;
            border-radius: 10px;
            border: 1px solid #cccccc;
            bottom: 12px;
            left: -50px;
            min-width: 380px;
            /*height:100px;*/
            /*width:100px;*/
        }

        .ol-popup:after, .ol-popup:before {
            top: 100%;
            border: solid transparent;
            content: " ";
            height: 0;
            width: 0;
            position: absolute;
            pointer-events: none;
        }

        .ol-popup:after {
            border-top-color: white;
            border-width: 10px;
            left: 48px;
            margin-left: -10px;
        }

        .ol-popup:before {
            border-top-color: #cccccc;
            border-width: 11px;
            left: 48px;
            margin-left: -11px;
        }

    </style>
</head>
<body style=" margin: 0;overflow: hidden;background: #fff;width: 100%;height:100%; position: absolute;top: 0;">
<div id="map" style="width: 100%;height:100%"></div>
<div id="popup" class="ol-popup">
<div id="popup-content"></div>
</div>
<script type="text/javascript">
	//构造气泡
    var container = document.getElementById('popup');
    var content = document.getElementById('popup-content');
    var overlay = new ol.Overlay(({
        element: container,
        autoPan: true,
        autoPanAnimation: {
            duration: 250
        }
    }));
    var map,
        url = (window.isLocal ? window.server : "https://iserver.supermap.io") + "/iserver/services/map-world/rest/maps/World";
        urlPic = "http://localhost:8090/iserver/services/data-my/rest/data";
    map = new ol.Map({
        target: 'map',
        controls: ol.control.defaults({attributionOptions: {collapsed: false}})
            .extend([new ol.supermap.control.Logo()]),
        view: new ol.View({
            center: [0, 0],
            zoom: 2,
            projection: 'EPSG:4326',
            multiWorld: true
        }),
        overlays: [overlay]
    });
    var layer = new ol.layer.Tile({
        source: new ol.source.TileSuperMapRest({
            url: url
        }),
        projection: 'EPSG:4326'
    });
    map.addLayer(layer);
    // 以上代码用于添加地图底图,这部分可以替换为业务上发布的地图服务,与以下查询出的数据配合
    
    //构建查询parameter
    var sqlParam = new ol.supermap.GetFeaturesBySQLParameters({
            queryParameter: {
            	//这里写的是我们查询数据源以及查询条件
            	//当前查询的数据是my数据源中的myPoint表
                name: "myPoint@my",
                //查询条件为根据PointName进行查询,返回PointName为 "超图大厦" 的数据
                //注意通过 \ 符号来将查询字符串中的冒号等预定义符号转义
                attributeFilter: "PointName = \"超图大厦\" "
            },
            //同上,这里写查询的数据源数据集名称,写法与上面稍微有些区别
            datasetNames: ["my:myPoint"]
        });
        //新建查询
        new ol.supermap.FeatureService(urlPic).getFeaturesBySQL(sqlParam, function (serviceResult) {
           
            //若查询出结果只有一个,则为serviceResult.result.features.features[0],若存在多个结果,则需遍历返回中该数组
            var features = serviceResult.result.features.features[0];
            //通过查询出的serviceResult.result.features.features[0].properties.PICTURE,与我们的img标签进行拼接,此处构建为innerHtml字符串,用于传入我们已经构建好的气泡中。
            var innerHtml = "<img src=\"data:image/png;base64," + serviceResult.result.features.features[0].properties.PICTURE +" \"style=\"width: 100\%;height:100\%\" "+ "\" />";
            //将构建好的字符串放入我们的气泡中
            content.innerHTML = innerHtml;
            //查询结果中不仅包含图片Base64编码,还包含查询出 “超图大厦” 的位置信息,将位置信息同样传递给我们的气泡,这样可以让气泡刚好在要素地理位置上弹出
            overlay.setPosition([features.geometry.coordinates[0], features.geometry.coordinates[1]]);
            
        });


</script>
</body>
</html>

以上代码可以直接复制进官网编译器中进行运行,需将数据服务url替换为刚刚我们自己发布的。
iClient引用参考:iClient准备与开始

注意事项:Base64编码会将图片占用空间变大1/3,在存入图片时尽量选择<1mb图片,在前端达到比较好的显示效果同时不会导致编码过长。

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

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

相关文章

RHCE实验--配置nfs服务

1、开放/nfs/shared目录&#xff0c;供所有用户查询资料&#xff1b; 2、开放/nfs/upload目录&#xff0c;供所有用户上传下载资料&#xff1b; 服务器与客户端都写好yum源以及挂载光盘&#xff0c;然后安装服务包 [rootserver ~]# yum install rpcbind -y [rootserver ~]# y…

Vue3基础

Vue 官网 https://cn.vuejs.org/ https://v3.cn.vuejs.org/ https://staging-cn.vuejs.org/api/ 1、环境 1.1、nodejs node node -vnpm #当前版本 npm -v #升级npm版本 npm install -g npm1.2、vue #安装vue npm install -g vue-cli #安装最新版本 npm install -g vu…

LQ0197 锦标赛【程序填空】

题目来源&#xff1a;蓝桥杯2014初赛 C A组E题 题目描述 本题为代码补全填空题&#xff0c;请将题目中给出的源代码补全&#xff0c;并复制到右侧代码框中&#xff0c;选择对应的编译语言&#xff08;C/Java&#xff09;后进行提交。若题目中给出的源代码语言不唯一&#xff0…

Python简单实现人脸识别检测, 对照片进行评分

大家好&#xff0c;今天和大家说说如何用Python简单实现人脸识别检测, 对照片进行排名&#xff0c;看看自己有多漂亮。 [开发环境]: Python 3.8 Pycharm 2021.2 [模块使用]: requests >>> pip install requeststqdm >>> pip install tqdm 简单实现进度条效果…

Arduino从零开始(1)——按钮控制LED

0.前言 本文主要介绍Arduino对于开关和条件判断函数的使用。 目录 0.前言 1.介绍 2.按钮控制LED 2.1下拉模式&#xff1a; 2.2上拉模式 3.扩展实验&#xff1a; 1.介绍 前篇介绍了点亮LED&#xff0c;这次案例我们尝试通过一个简单的传感器——按钮&#xff0c;来实现…

Ubuntu20.04离线安装Vmware tools

参考连接&#xff1a;在 Linux 虚拟机中手动安装 VMware Tools 从 Workstation Pro 菜单栏中选择虚拟机 > 安装 VMware Tools。 如果安装了早期版本的Vmware tools&#xff0c;则菜单项是更新Vmware tools如果这个安装Vmware tools 是灰色的&#xff0c;进行如下的处理方式…

HTML基本骨架与编辑器选择

HTML基本骨架与编辑器选择 文章目录HTML基本骨架与编辑器选择1.HTML基本了解1.1 什么是HTML1.2 HTML标签1.3 HTML元素1.4 Web浏览器1.5 HTML网页结构1.6 HTML版本了解2.HTML基本骨架介绍3.HTML编辑器的下载与使用1.HTML基本了解 1.1 什么是HTML HTML 是用来描述网页的一种语言…

双链表的基本操作

目录 一、双链表的设计 二、双链表的实现和基本操作 1.实现双链表节点以及设置first、last指针 2.获取当前链表中元素的数量 3.获取指定位置的节点 4.在尾部添加结点元素 5.在指定位置添加元素 6.删除指定位置的结点 一、双链表的设计 针对于查询操作&#xff0c;我们可…

计算机操作系统:实验3 【虚拟存储器管理】

计算机操作系统&#xff1a;实验3 【虚拟存储器管理】 文章目录计算机操作系统&#xff1a;实验3 【虚拟存储器管理】一、前言二、实验目的三、实验环境四、实验内容五、实验说明1、设计中虚页和实页的表示2、关于缺页次数的统计3、LRU算法中“最近最久未用”页面的确定4、算法…

删除类及其对象的属性:delattr()函数

【小白从小学Python、C、Java】 【Python-计算机等级考试二级】 【Python-数据分析】 删除类及其对象的属性 delattr()函数 [太阳]选择题 请问对以下Python代码说法错误的是&#xff1f; class MyClass1: x 1 y 2 myObject1 MyClass1() print(【访问】myObject1的属…

Revit中“结构框架显示与剪切“的应用和一键剪切功能

一、Revit关于"结构框架显示与剪切"的应用 结构框架&#xff1a;顾名思义其实它表示的就是结构梁而已&#xff0c;但是我们画图的时候往往会显示"实线"和"虚线"&#xff0c;以至于在出结构图纸的时候&#xff0c;达不到出图要求 NO.2、应用 Part…

ISCTF

upload upload,一道phar文件上传题目 <?php class upload{public $filename;public $ext;public $size;public $Valid_ext;public function __construct(){$this->filename $_FILES["file"]["name"];$this->ext end(explode(".", …

[山东科技大学OJ]1490 Problem F: 该按哪些键

Time Limit: 1 Sec Memory Limit: 128 MB Submit: 1693 Solved: 433 [Submit][Status] Description Peter在手机上打字时一直用全键键盘来输入&#xff0c;但最近不知道怎么搞的&#xff0c;把全键键盘弄丢了&#xff0c;只剩下了9键键盘。一项喜欢高科技的Peter却不会用9键…

彻底搞懂nodejs事件循环

nodejs是单线程执行的&#xff0c;同时它又是基于事件驱动的非阻塞IO编程模型。这就使得我们不用等待异步操作结果返回&#xff0c;就可以继续往下执行代码。当异步事件触发之后&#xff0c;就会通知主线程&#xff0c;主线程执行相应事件的回调。 以上是众所周知的内容。今天…

ASEMI整流桥D3KB100参数,D3KB100规格,D3KB100封装

编辑-Z ASEMI整流桥D3KB100参数&#xff1a; 型号&#xff1a;D3KB100 最大重复峰值反向电压&#xff08;VRRM&#xff09;&#xff1a;1000V RMS反向电压VR(RMS)&#xff1a;700 平均整流输出电流&#xff08;IO&#xff09;&#xff1a;3A 峰值正向浪涌电流&#xff08…

【论文阅读】时序动作检测系列论文精读(2019年)

文章目录1. BMN: Boundary-Matching Network for Temporal Action Proposal Generation论文目的——拟解决问题贡献——创新实现流程详细方法2. MGG: Multi-granularity Generator for Temporal Action Proposal论文目的——拟解决问题贡献——创新实现流程详细方法3. P-GCN: G…

稳压二极管的应用及注意事项

文章目录稳压二极管也被称为齐纳二极管 齐纳二极管和普通二极管的伏安特性曲线 齐纳二极管的工作原理 稳压二极管的伏安特性曲线的正向特性和普通二极管差不多&#xff0c;反向特性是在反向电压低于反向击穿电压时&#xff0c;反向申阳很大&#xff0c;反向漏电流极小。但是…

【学习笔记】AGC028/AGC007

AGC028 Removing Blocks High Elements 好仙啊。 我会转化&#xff01;&#xff01;问题转化为在原序列剩下的数中取ISISIS序列aaa,bbb&#xff0c;满足cx∣a∣cy∣b∣cx|a|cy|b|cx∣a∣cy∣b∣ 。对于没在a,ba,ba,b序列中的数&#xff0c;可以通过恰当放置使其不对前缀最大…

并发编程- synchronized,Lock及volatile的使用

文章目录并发编程的可见性问题解决方法synchronizedLockvolatile并发编程的可见性问题 多线程访问共享变量&#xff0c;造成线程不安全&#xff0c;最后的数值不对 public class VDemo {private static int num 0;public static void add() {num;}public static void main(St…

红队内网渗透神器--CobaltStrike安装教程

CobaltStrike介绍&#xff1a; CobaltStrike是一款渗透测试神器&#xff0c;被业界人称为CS神器。CobaltStrike分为客户端与服务端&#xff0c;服务端是一个&#xff0c;客户端可以有多个&#xff0c;可被团队进行分布式协团操作。 CobaltStrike集成了端口转发、服务扫描&…