Leaflet天地图进阶玩法:UniApp中实现动态标记点与省级边界绘制(附江西GeoJSON文件)

uniapp 整合 OpenLayers - 加载Geojson数据(在线、离线、点选、点选位置导航) 因为,打包后app文件夹中,WWW文件目录没有了,这样就会导致openlayer的相对路径失效,从而无法加载离线地图。在官方基座,上面的代码运行没有问题,但是打包的APP就无法加载离线地图了。manifest.json添加配置。 阅读详情

UniApp + Leaflet 进阶实战:构建高性能动态地图应用与省级行政区划可视化

在移动端应用开发中,地图功能正从简单的“显示位置”向复杂的“数据可视化与交互分析”演进。对于需要开发政务GIS、区域巡检、资产监控等系统的中高级开发者而言,如何在跨平台框架中实现高性能、高定制化的地图功能,是一个兼具挑战与机遇的课题。UniApp以其“一次开发,多端发布”的优势,结合Leaflet这一轻量级但功能强大的地图库,为我们提供了绝佳的解决方案。然而,仅仅加载一个底图是远远不够的,真正的价值在于如何动态地、高效地呈现业务数据,例如实时更新的标记点、清晰的行政区划边界,并实现视图层与逻辑层的无缝通信。本文将深入探讨在UniApp中,利用Leaflet与RenderJS,构建一个支持动态标记点与省级边界绘制的高性能地图应用,并以江西省为例,分享从数据处理到性能优化的全链路独家技巧。

1. 环境搭建与核心架构设计

在开始编码之前,搭建一个稳健且高效的开发环境至关重要。UniApp与Leaflet的结合,核心在于理解并驾驭其跨层通信机制。

1.1 项目初始化与依赖管理

首先,创建一个标准的UniApp项目。这里我们推荐使用HBuilderX的CLI或可视化界面创建。项目创建后,进入项目根目录,通过npm或yarn安装必要的Leaflet依赖。

# 进入项目目录
cd your-uniapp-project

# 安装 Leaflet 核心库
npm install leaflet --save

# 安装适用于国内地图服务的插件(如 leaflet.chinatmsproviders,注意名称可能变化,请以npm官方为准)
# 此处以 leaflet.chinatmsproviders 为例,实际请搜索最新可用插件
npm install leaflet.chinatmsproviders --save

关键点:由于UniApp的视图层(Webview)与逻辑层(JS Core)分离,直接在<script>逻辑层操作DOM(如地图容器)是无效的。这就是RenderJS登场的原因。Renderjs是运行在视图层的JavaScript,可以操作DOM、BOM,并调用强大的地图库。我们不需要单独安装renderjs,它是UniApp的内置功能。

1.2 理解RenderJS与逻辑层通信模型

这是整个架构的基石。逻辑层(普通<script>)负责业务逻辑、数据请求和状态管理;视图层(<script module="xxx" lang="renderjs">)负责DOM操作和地图渲染。两者之间的数据同步是双向的。

  • 逻辑层 → 视图层 (RenderJS):通过:prop和:change:prop绑定实现。
    • :prop="data":将逻辑层的data变量传递给RenderJS模块。
    • :change:prop="moduleName.methodName":当逻辑层的data变化时,自动触发RenderJS模块中指定的方法。
  • 视图层 (RenderJS) → 逻辑层:通过ownerInstance.callMethod实现。
    • 在RenderJS的方法中,可以通过this.$ownerInstance.callMethod('logicMethod', args)来调用逻辑层中定义的方法。

这种设计实现了关注点分离:逻辑层专心处理数据,视图层专心处理渲染,通过约定好的接口进行通信,代码结构清晰,性能也更优。

2. 天地图底图集成与省级GeoJSON加载

选择了Leaflet,我们自然希望使用权威、稳定的底图数据源。国家基础地理信息公共服务平台(天地图)是一个优秀的选择。

2.1 在RenderJS中动态引入Leaflet

为了避免Leaflet较大的资源文件影响首页加载速度,我们采用动态脚本注入的方式在RenderJS的mounted生命周期中加载。

// 在 <script module="leaflet" lang="renderjs"> 的 mounted 中
mounted() {
  // 动态加载 Leaflet CSS
  const link = document.createElement('link');
  link.rel = "stylesheet";
  link.href = "https://unpkg.com/leaflet@1.9.3/dist/leaflet.css";
  document.head.appendChild(link);

  // 动态加载 Leaflet JS
  const script = document.createElement('script');
  script.src = "https://unpkg.com/leaflet@1.9.3/dist/leaflet.js";
  script.type = "text/javascript";
  document.head.appendChild(script);

  // 脚本加载完成后初始化地图
  script.onload = this.initMap.bind(this);
}

注意:使用CDN链接需注意网络可达性。在生产环境中,更推荐将leaflet.css和leaflet.js下载到项目静态资源目录,使用相对路径引入,以保证稳定性和加载速度。

2.2 初始化天地图图层

在initMap方法中,我们创建地图实例并添加天地图作为底图。天地图通常提供影像(img)、矢量(vec)、注记(cia)等多种图层,我们可以通过图层组(L.layerGroup)来组合它们。

methods: {
  initMap() {
    // 1. 创建影像底图图层
    const imgLayer = L.tileLayer(
      'https://t{s}.tianditu.gov.cn/DataServer?T=img_w&x={x}&y={y}&l={z}&tk=YOUR_TIANDITU_TOKEN',
      {
        subdomains: ['0', '1', '2', '3', '4', '5', '6', '7'],
        attribution: '© 天地图'
      }
    );

    // 2. 创建中文注记图层
    const ciaLayer = L.tileLayer(
      'https://t{s}.tianditu.gov.cn/DataServer?T=cia_w&x={x}&y={y}&l={z}&tk=YOUR_TIANDITU_TOKEN',
      {
        subdomains: ['0', '1', '2', '3', '4', '5', '6', '7'],
        transparent: true // 注记层需要透明
      }
    );

    // 3. 将两个图层组合成一个图层组
    const baseMap = L.layerGroup([imgLayer, ciaLayer]);

    // 4. 初始化地图实例,以江西省大致中心点为例
    this.map = L.map('mapId', {
      center: [27.682976, 115.857972], // 江西中心坐标
      zoom: 8,
      layers: [baseMap], // 设置初始图层
      zoomControl: false, // 可自定义缩放控件位置
      attributionControl: false // 隐藏默认版权信息,需自行添加天地图版权
    });

    // 5. 后续加载GeoJSON边界等操作...
  }
}

重要提示:使用天地图服务必须申请并配置自己的密钥(tk参数),替换上面URL中的YOUR_TIANDITU_TOKEN。未经授权使用可能违反服务条款。

2.3 加载与绘制省级GeoJSON边界

行政区划边界是政务GIS系统的核心要素。我们需要获取标准的GeoJSON数据。可以从阿里云DataV.GeoAtlas等官方或权威数据平台下载。

数据准备:

  1. 访问阿里云DataV.GeoAtlas,选择“中国”->“省份”->“江西省”,下载其GeoJSON文件。
  2. 将下载的jiangxi.json文件放入UniApp项目的static目录下(例如static/geojson/)。

在RenderJS中加载并绘制:

// 在 initMap 方法内部,地图初始化之后
import jiangxiGeoJSON from '@/static/geojson/jiangxi.json';

// 使用 L.geoJSON 加载并绘制边界
L.geoJSON(jiangxiGeoJSON, {
  style: {
    color: '#3388ff', // 边界线颜色
    weight: 2,        // 边界线宽度
    opacity: 0.8,     // 边界线透明度
    fillColor: '#3388ff', // 填充颜色
    fillOpacity: 0.1   // 填充透明度
  },
  onEachFeature: function (feature, layer) {
    // 可以为每个要素(这里就是江西省)绑定交互事件
    layer.bindPopup(`<b>${feature.properties.name}</b>`); // 鼠标点击显示名称
  }
}).addTo(this.map);

通过以上步骤,一个带有天地图底图和清晰江西省边界的地图就已经成功渲染在UniApp页面中了。

3. 实现高性能动态标记点管理

动态标记点是业务数据的直观体现。其挑战在于数据频繁更新时,如何高效、无闪烁地重新渲染。

3.1 数据结构设计与逻辑层数据流

假设我们从后端API获取到一个任务点列表,每个点包含经纬度、状态等信息。

// 在逻辑层 (普通<script>) 的 data 中
data() {
  return {
    markerData: [], // 标记点数据数组
    currentProjectId: null
  };
},
methods: {
  async fetchMarkerData(projectId) {
    const res = await api.getTaskPoints({ projectId });
    // 假设返回数据格式: [{ id: 1, lat: 28.682, lon: 115.858, status: 'processing', name: '任务点A' }, ...]
    this.markerData = res.data;
  }
}

3.2 RenderJS监听数据变化与渲染优化

逻辑层数据变化通过:prop和:change:prop通知RenderJS。

<!-- 在模板中 -->
<view class="map-container" id="mapId"
      :prop="markerData"
      :change:prop="leafletMap.updateMarkers">
</view>

在RenderJS中,我们需要实现updateMarkers方法来响应数据变化。性能关键点:避免每次更新都清除所有图层再重绘,这会导致地图闪烁。应使用图层组(L.layerGroup)来管理所有标记点。

// 在 <script module="leafletMap" lang="renderjs"> 的 data 中
data() {
  return {
    map: null,
    markerLayerGroup: null, // 用于管理所有标记点的图层组
    customIcons: {} // 缓存不同状态的图标
  };
},
methods: {
  updateMarkers(newValue, oldValue, ownerInstance) {
    if (!this.map || !newValue) return;

    // 1. 如果存在旧的标记图层组,先将其从地图移除并清空
    if (this.markerLayerGroup) {
      this.map.removeLayer(this.markerLayerGroup);
      this.markerLayerGroup = null;
    }

    // 2. 创建新的图层组
    this.markerLayerGroup = L.layerGroup();

    // 3. 遍历新数据,创建标记并添加到图层组
    newValue.forEach(point => {
      const icon = this.getIconByStatus(point.status); // 根据状态获取图标
      const marker = L.marker([point.lat, point.lon], { icon: icon })
        .bindPopup(`<b>${point.name}</b><br/>状态: ${point.status}`);

      // 可以绑定点击事件,传递数据回逻辑层
      marker.on('click', () => {
        ownerInstance.callMethod('onMarkerClick', point);
      });

      this.markerLayerGroup.addLayer(marker);
    });

    // 4. 将整个图层组添加到地图
    this.markerLayerGroup.addTo(this.map);
  },

  getIconByStatus(status) {
    // 图标缓存,避免重复创建
    if (!this.customIcons[status]) {
      const iconUrl = this.getIconUrl(status); // 根据状态返回图片路径
      this.customIcons[status] = L.icon({
        iconUrl: iconUrl,
        iconSize: [25, 41], // 图标大小
        iconAnchor: [12, 41], // 图标锚点(底部中心)
        popupAnchor: [0, -34] // 弹出框锚点
      });
    }
    return this.customIcons[status];
  }
}

优化技巧:对于成百上千个标记点,可以考虑使用Leaflet.markercluster插件进行聚合,以大幅提升渲染性能和用户体验。

4. 高级功能与实战技巧

掌握了基础架构和核心功能后,我们可以进一步探索一些提升应用专业性和用户体验的高级功能。

4.1 实现边界外区域遮罩(视觉聚焦)

为了让用户的注意力集中在目标省份,可以添加一个半透明的遮罩层,将省外区域变暗。这需要利用GeoJSON的几何数据创建一个“反向”的多边形。

// 在 initMap 方法中,加载完边界后调用
createMaskLayer(geoJsonData) {
  // 1. 获取江西省的边界坐标数组
  const jiangxiCoords = geoJsonData.features[0].geometry.coordinates;
  // 注意:GeoJSON坐标可能是多边形的数组,需要根据实际情况处理
  let latlngs;
  if (jiangxiCoords[0][0] instanceof Array) {
    latlngs = jiangxiCoords[0]; // 多边形外环
  } else {
    latlngs = jiangxiCoords;
  }

  // 2. 定义一个覆盖整个地图视野的巨大矩形坐标(作为遮罩底板)
  const worldBounds = [
    [90, -180], // 西北角
    [90, 180],  // 东北角
    [-90, 180], // 东南角
    [-90, -180] // 西南角
  ];

  // 3. 使用 Leaflet.Polygon 的 `hole` 参数创建带孔洞的多边形
  // 孔洞就是江西省的边界,这样孔洞内的区域是透明的,孔洞外是遮罩
  const maskPolygon = L.polygon([worldBounds, latlngs], { // 注意顺序:外圈在前,内圈(孔洞)在后
    color: 'transparent',
    fillColor: '#000',
    fillOpacity: 0.5,
    weight: 0,
    interactive: false // 遮罩层不响应鼠标事件
  });

  maskPolygon.addTo(this.map);
}

4.2 坐标转换与数据处理

在实际项目中,后端返回的坐标格式可能五花八门(如度分秒)。我们需要一个健壮的转换函数。

// 在 RenderJS 的 methods 中
parseCoordinate(coordStr) {
  // 处理如 "115°30'28\"E" 或 "28.6832" 等格式
  if (!coordStr || typeof coordStr !== 'string') return null;

  // 如果是十进制数字字符串,直接转换
  if (!isNaN(parseFloat(coordStr))) {
    return parseFloat(coordStr);
  }

  // 处理度分秒格式,例如:115°30'28"E
  const regex = /([\d.]+)°\s*([\d.]+)'\s*([\d.]+)"\s*([NSEW])?/i;
  const match = coordStr.match(regex);
  if (match) {
    const degrees = parseFloat(match[1]);
    const minutes = parseFloat(match[2]) / 60;
    const seconds = parseFloat(match[3]) / 3600;
    let decimal = degrees + minutes + seconds;
    // 处理南纬西经
    if (match[4] && /[SW]/i.test(match[4])) {
      decimal = -decimal;
    }
    return decimal;
  }
  console.warn(`无法解析的坐标格式: ${coordStr}`);
  return null;
}

4.3 地图控件自定义与交互增强

Leaflet允许高度自定义控件。例如,添加一个一键返回初始视图的按钮。

<!-- 在模板中,地图容器内部 -->
<view class="custom-control" @click="leafletMap.flyToInitialView">
  <image src="/static/icon/home.png" mode="widthFix"></image>
</view>
// 在 RenderJS 的 methods 中
flyToInitialView() {
  if (this.map) {
    this.map.flyTo([27.682976, 115.857972], 8); // 使用flyTo有平滑动画效果
  }
}

通过CSS将这个custom-control定位到地图的角落,一个美观实用的自定义控件就完成了。

4.4 性能监控与调试技巧

在UniApp中调试RenderJS有一定难度,因为其运行在独立的Webview环境。

  • Console日志:在RenderJS中console.log的信息,需要在HBuilderX的调试台中选择对应的<webview>标签页查看。
  • 性能关注点:
    • 图层管理:及时清理无用的图层(map.removeLayer),避免内存泄漏。
    • 事件解绑:在组件销毁时(RenderJS的beforeDestroy或destroyed生命周期),解绑地图和标记的事件监听器。
    • 图片优化:标记图标应使用雪碧图(Sprite)或适当压缩,减少HTTP请求和内存占用。
  • 跨端差异:在App端,Webview性能与原生有差距,避免一次性渲染过多元素(如超过500个标记点)。在小程序端,需注意相关平台对document、window对象的支持情况,RenderJS的适用性可能不同,务必查阅UniApp官方文档进行兼容性测试。

整个开发过程就像在搭建一个精密的仪器,逻辑层和视图层各司其职,通过清晰的接口耦合。RenderJS赋予了UniApp操作复杂DOM库的能力,而Leaflet的轻量与强大使得在移动端实现专业级地图应用成为可能。当你成功地将动态数据流畅地呈现在地图上,并实现平滑的交互时,那种对技术栈的掌控感会非常强烈。记住,良好的架构设计(数据流清晰)和细节优化(如图标缓存、图层管理)是保证应用丝滑体验的关键。

uniapp 使用leaflet加载天地图 app端 阅读详情

相关推荐

在app中使用天地图(uniapp)

以上示例是显示的江西省内,如果需要其他省份数据,可以去阿里云数据可视化平台下载指定的json文件即可,还是通过 renderjs 渲染出地图,操作地图也是在里面。,下载到本地后替换上面的导入即可。

qq_52630125的博客 4281

用uniapp开发的微信小程序,如何使用开源地图组件leafletwx

用uniapp开发的微信小程序,如何使用开源地图组件leafletwx

whbke的博客 2921

uniapp - [微信小程序] 详细动态设置分享转发时的参数,实现点击按钮元素后 “手动触发“ 动态设置参数并调起转发分享给好友(列表上每一个分享按钮,单独设置分享转发参数,每次都是不同的分享参数)

uniapp小程序如何动态设置分享的配置参数,uniapp小程序分享功能怎么携带参数,uniapp微信小程序开发中怎么能动态带参数设置分享,uniapp小程序动态赋值onShareAppMessage里return的参数配置,uniapp微信小程序多个分享事件并带不同的参数,uniapp小程序分享转发时每次都带不同的参数,uniapp小程序一个列表中每个都带有分享功能怎么做,uni-app小程序平台端怎么动态的给分享功能设置不同的参数,uniapp微信小程序一个页面有多个分享怎么办,uniapp一个页面表格

🏆 前端领域优质创作者 3684

uni-app renderjs 使用leaflet示例

在保证已有script下在创建一个新的script标签,标签中定义land=“renderjs” module=“任意名”通过change监听‘msg’的变化来调用视图层的‘receiveMsg’方法,rendererjs是一个运行在视图层的js,只支持app-vue和h5。module相当于id,后面需要通过module属性来调用方法。通过callMethod来调用逻辑层的方法并定义传入的参数。下面是通过renderjs使用leaflet地图示例。renderjs的用处。renderjs用法。

weixin_60645637的博客 1939

uni-app-echarts+PC+移动端中国地图下钻+标点+统计+放大缩小.rar

预览地址:https://blog.youkuaiyun.com/HandsomeGuy_/article/details/120882604

南京邮电大学电工电子实验(二)复习一

本文给电工电子实验(二)的复习进行一些知识点的提醒

YOUXISUN的博客 2960

uniapp 整合 openlayers 加载 天地图、geojson、wms、wfs、TMS数据

【代码】uniapp 整合 openlayers 加载 天地图、geojson、wms、wfs、TMS数据。

qq_19688207的博客 442

第七章 Wi-Fi连接过程

系列文章目录 第一章 国内下载AOSP最新源码的方法 第二章 下载AOSP WiFi相关的代码 第三章 将源码导入Android Studio(无需编译idegen) 文章目录系列文章目录前言一、Wi-Fi连接是什么?二、Wi-Fi连接的过程1. 手动连接总结 前言 Wi-Fi连接分为下面几种过程,每种的流程都有些许差异: 手动连接 自动连接 在BSS之间漫游 Passpoint热点连接 一、Wi-Fi连接是什么? Wi-Fi连接是指STA(手机)连接到AP(无线路由器)的过程,这个过程分为链路

Frank.Zhang的专栏 2527

前端(九)——探索微信小程序、Vue、React和Uniapp生命周期

微信小程序、Vue、React和Uniapp的基本定义和应用领域 微信小程序生命周期,生命周期概述,页面生命周期,应用生命周期,组件和API的生命周期钩子 Vue生命周期,生命周期钩子函数,响应式监听与生命周期关联,生命周期的钩子函数在实际开发中的应用,数据获取,异步操作,页面刷新,参数传递与响应,动态样式和类绑定,生命周期钩子函数的应用扩展,React生命周期,类组件生命周期方法,声命周期方法的触发条件和顺序,使用React Hooks对生命周期的变化与影响,依赖项【】的解析,useEffect是三合一的

杜永康的博客 2128

期货分仓系统CTP协议/国内期货软件源码

期货分仓系统与CTP协议以及国内期货软件源码是期货交易技术领域的几个重要方面。

q2247238820的博客 962

IAR调试CC1310的错误:Fatal error:Failed to connect to the XDS emlulator (Error -241 @ 0x0:)

从simplelink_cc13x0_sdk_2_10_00_36导入collector工程后,rebuild后进行debug,出现了如图错误:Fatal error:Failed to connect to the XDS emlulator (connect ICEPick)...(Error -241 @ 0x0)A router subpath could not be accessed....

qq_40417648的博客 6228

Uniapp 使用 Leaflet

在 regionChangeHandler 方法中,可以通过 e.target.getZoom() 获取新的缩放级别,通过 e.target.getCenter() 获取变化后的地图中心经纬度。在 Uniapp 中使用 Leaflet 处理地图的缩放和移动事件,可以通过监听 Leaflet 提供的相应事件来实现。上述代码中,首先创建了一个具有特定类名的视图容器用于显示地图,然后在页面的onReady生命周期方法中初始化地图,并添加了 OpenStreetMap 的瓦片图层。

weixin_43891869的博客 2501

数字IC后端PR阶段Innovus,ICC,ICC2修复short万能脚本分享

数字IC后端PR阶段Innovus,ICC,ICC2修复short万能脚本分享

weixin_37584728的博客 3460

uniapp开发app项目适配微信小程序问题总结

uniapp开发app项目适配微信小程序问题总结

cielzy的博客 964

Matlab实战:3种雷达间歇采样干扰的仿真与识别(附完整代码)

本文通过Matlab实战,详细仿真了雷达有源间歇采样干扰的三种核心样式:直接转发、重复转发和循环转发干扰。文章提供了完整的代码实现,并深入探讨了基于时频分析和循环平稳分析的特征提取与识别方法,为雷达抗干扰技术的学习与实践提供了清晰的工程实现路径。

weixin_29053695的博客 364

同步整流buck电路图设计:手把手入门必看

从零开始拆解同步整流Buck电路图及其原理,手把手带你画出关键拓扑、选型MOSFET、分析续流路径。重点讲清占空比控制逻辑与体二极管导通损耗的规避方法,让buck电路图及其原理真正落地可调、稳定可靠。

weixin_33308579的博客 997

uniapp引用leaflet地图实现方案

uniapp 移动端引用leaflet地图的实现方案

云雨之石的博客 2781

【深度学习新浪潮】算力行业的核心技术有哪些?

算力行业核心技术是芯片+互联+存储+调度+能效+软件的全栈协同:芯片提供算力、互联打通集群、存储保障数据、调度提升效率、能效支撑规模、软件释放算力。当前AI大模型推动算力从“单机”走向“万卡级超节点集群”,技术竞争从单一芯片升级为系统级、全栈化的综合能力。

专注:太空算力、AI infra、异构调度、大模型成本工程 339

uniapp通过绝对路径解压zpi中的shpe转化为geojson

【代码】uniapp通过绝对路径解压zpi中的shpe转化为geojson。

厚积薄发. 384

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

uni-app 引入 mapbox地图

uni-app 引入 mapbox地图

GIS(地理信息系统) 2898

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

uni-app使用wx-canvas实现微信小程序上显示地图map和坐标geo

源码 <template> <view class="echart-box"> <canvas class="ec-canvas" :id="chartId" :canvasId="chartId" @error="error"></canvas> </view> </template> <script> import WxCanvas from "../../components/echart.

weixin_45938584的博客 1557

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

uniapp在地图上加载CAD图,标记区域网格,加载geojson数据

if (Array.isArray(newValue.jsonobj) && newValue.jsonobj.length > 0) { // 确保是数组并且不为空。// 如果需要,你可以在这里返回其他的Layer,例如CircleMarker等。// 如果不想显示任何标记,则返回空的Layer或特定类型的Layer。// // 可以为每个图层绑定弹出窗口等交互功能。// 遍历res.data.result数组中的每一个元素。this.$http.get("///////地址", {

THY0827的博客 1027

uniapp中使用Vue2Leaflet

官网:https://vue2-leaflet.netlify.app/ 导入模块 npm install leaflet vue2-leaflet --save 或者 yarn add leaflet vue2-leaflet 引入 main.js中加入如下代码 import { LMap, LTileLayer, LMarker } from 'vue2-leaflet'; import 'leaflet/dist/leaflet.css'; Vue.component('l-map', LMap

牧xin的博客 3136

保姆级教程:用ECharts 5.x实现带纹理和3D阴影的江西地图(附同步缩放代码)

本文提供了一份详细的ECharts 5.x教程,指导如何实现带纹理和3D阴影的江西地图,并解决多图层交互时的同步缩放问题。通过实战案例,读者将学习到地图纹理填充、3D投影效果实现以及图层同步控制等高级技巧,提升数据可视化的视觉效果和交互体验。

weixin_28675661的博客 348

使用uni-app生成微信小程序踩的坑

毕设要求写一个浏览器端,一个APP端,一个微信端,刚开始以为要学三个技术然后写三个客户端,后来知道了uni-app这个神器,一次编写就可以编译生成APP、H5以及各种小程序版本的客户端。然而我比较熟悉的是web的前端开发,而且浏览器用于测试也是唾手可得,所以整个开发过程中用浏览器测试的基本上都很顺利,展现的效果也很好,然而在编译小程序端的时候出了很大的问题,整个页面都扭曲了,经过这两天的查资料与修复,终于得到了浏览器中的效果,正好也记录一下这些坑。 1.不允许id选择器 这个问题是最容易发现的,在h5页面中

zekdot的博客 1万+

天地图GeoJSON实战:5分钟实现行政区划边界动态渲染与视角自适应

本文详细介绍了如何利用天地图API高效加载和渲染标准GeoJSON行政区划数据。通过构建一个可复用的渲染器模块,并集成智能视角自适应算法,开发者可在5分钟内实现地图边界数据的动态渲染与最佳视角适配,大幅提升WebGIS应用的开发效率和用户体验。

zeta9的博客 260
上一篇: 解决matplotlib字体缓存问题的替代方案:从_rebuild到shutil.rmtree
下一篇: JS逆向实战:大麦网sign参数逆向与动态token机制解析
糖果HTML
博客等级 码龄3年 76粉丝 1357原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值