创建临时图层

本文介绍如何使用 MapInfo 创建临时图层来动态添加地图上的点或线等元素,适用于轨迹跟踪等场景。文中提供了详细的步骤及代码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 
首先说明一下创建临时图层的作用,当你需要在现有的地图上动态地添加一些点或线等图元时,就可以在临时

图层中进行。比如说在作动态轨迹跟踪时,通过读取数据库中的点坐标,不断地更新轨迹和图元的位置。代码如

下:

 

    /// <summary>
    /// 创建临时图层
    /// Design by Glacier
    /// 2008年8月6日
    /// <param name="tempLayerTableName">表名</param>
    /// <param name="tempLayerName">图层名</param>
    /// </summary>
    public static void CreateTempLayer(string tempLayerTableName, string tempLayerName)
    {
        MapInfo.Mapping.Map myMap = MapInfo.Engine.Session.Current.MapFactory

[MapControl1.MapAlias];

        //指定表名建立表信息
        MapInfo.Data.TableInfoMemTable tblInfoTemp = new MapInfo.Data.TableInfoMemTable

(tempLayerTableName);

        //确保当前目录下不存在同名表
        MapInfo.Data.Table tblTemp = MapInfo.Engine.Session.Current.Catalog.GetTable

(tempLayerTableName);
        if (tblTemp != null)
        {
            MapInfo.Engine.Session.Current.Catalog.CloseTable(tempLayerTableName);
        }

        //向表信息中添加可绘图列
        tblInfoTemp.Columns.Add(MapInfo.Data.ColumnFactory.CreateFeatureGeometryColumn

(myMap.GetDisplayCoordSys()));
        tblInfoTemp.Columns.Add(MapInfo.Data.ColumnFactory.CreateStyleColumn());

        //向表信息中添加自定义列
        tblInfoTemp.Columns.Add(MapInfo.Data.ColumnFactory.CreateIntColumn("index"));
        tblInfoTemp.Columns.Add(MapInfo.Data.ColumnFactory.CreateStringColumn("name", 10));

        //根据表信息创建临时表
        tblTemp = MapInfo.Engine.Session.Current.Catalog.CreateTable(tblInfoTemp);

        //指定表,图层名和图层别名创建临时图层
        FeatureLayer tempLayer = new FeatureLayer(tblTemp, tempLayerName, tempLayerName);
        myMap.Layers.Add(tempLayer);
    }

我想用qgis手动批处理,The current available LTR version of QGIS is 3.40.6. from qgis.core import QgsProject, QgsRasterLayer from qgis import processing import os import numpy as np from datetime import datetime def get_raster_layers(): """获取所有热力图图层""" layers = [] for i in range(24): layer_name = f"Heatmap_{i:02d}" layer = QgsProject.instance().mapLayersByName(layer_name) if layer: layers.append(layer[0]) return layers def calculate_temporal_features(layers, output_folder): """ 计算时序特征 :param layers: 热力图图层列表 :param output_folder: 输出文件夹 """ try: print("开始计算时序特征...") # 1. 时段划分 morning_hours = [7, 8, 9] # 早高峰 noon_hours = [10, 11, 12, 13, 14, 15, 16] # 平峰期 evening_hours = [17, 18, 19] # 晚高峰 # 2. 计算各时段平均值 print("\n计算时段平均值...") for period_name, hours in [("早高峰", morning_hours), ("平峰期", noon_hours), ("晚高峰", evening_hours)]: period_layers = [layers[h] for h in hours if h < len(layers)] if period_layers: # 创建临时图层列表 temp_layers = [] for i, layer in enumerate(period_layers): temp_path = os.path.join(output_folder, f"temp_{i}.tif") processing.run("gdal:translate", { 'INPUT': layer, 'OUTPUT': temp_path }) temp_layers.append(temp_path) # 计算平均值 output_path = os.path.join(output_folder, f"period_{period_name}.tif") processing.run("gdal:rastercalculator", { 'INPUT_A': temp_layers, 'BAND_A': [1] * len(temp_layers), 'FORMULA': f"({' + '.join(['A' + str(i+1) for i in range(len(temp_layers))])}) / {len(temp_layers)}", 'OUTPUT': output_path }) print(f"已生成{period_name}平均值: {output_path}") # 清理临时文件 for temp_file in temp_layers: if os.path.exists(temp_file): os.remove(temp_file) # 3. 计算时序波动率 print("\n计算时序波动率...") for i in range(len(layers)-1): # 创建临时图层 temp_path1 = os.path.join(output_folder, f"temp_1.tif") temp_path2 = os.path.join(output_folder, f"temp_2.tif") processing.run("gdal:translate", { 'INPUT': layers[i], 'OUTPUT': temp_path1 }) processing.run("gdal:translate", { 'INPUT': layers[i+1], 'OUTPUT': temp_path2 }) # 计算变化率 output_path = os.path.join(output_folder, f"fluctuation_{i:02d}_{i+1:02d}.tif") processing.run("gdal:rastercalculator", { 'INPUT_A': [temp_path1, temp_path2], 'BAND_A': [1, 1], 'FORMULA': '(A2 - A1) / (A1 + 0.0001)', 'OUTPUT': output_path }) print(f"已生成时段{i:02d}-{i+1:02d}波动率: {output_path}") # 清理临时文件 for temp_file in [temp_path1, temp_path2]: if os.path.exists(temp_file): os.remove(temp_file) # 4. 计算热力峰值时刻 print("\n计算热力峰值时刻...") max_values = [] for layer in layers: stats = layer.dataProvider().bandStatistics(1) max_values.append(stats.maximumValue) peak_hour = max_values.index(max(max_values)) print(f"热力峰值时刻: {peak_hour:02d}:00") # 5. 输出统计信息 print("\n生成统计报告...") report_path = os.path.join(output_folder, "temporal_analysis_report.txt") with open(report_path, 'w', encoding='utf-8') as f: f.write("热力度时序分析报告\n") f.write("=" * 50 + "\n\n") f.write("1. 时段划分\n") f.write(f"早高峰(7:00-9:00)平均热力值: {np.mean([max_values[h] for h in morning_hours]):.2f}\n") f.write(f"平峰期(10:00-16:00)平均热力值: {np.mean([max_values[h] for h in noon_hours]):.2f}\n") f.write(f"晚高峰(17:00-19:00)平均热力值: {np.mean([max_values[h] for h in evening_hours]):.2f}\n\n") f.write("2. 热力峰值时刻\n") f.write(f"峰值出现时间: {peak_hour:02d}:00\n") f.write(f"峰值热力值: {max(max_values):.2f}\n\n") f.write("3. 时序波动特征\n") for i in range(len(max_values)-1): fluctuation = (max_values[i+1] - max_values[i]) / (max_values[i] + 0.0001) f.write(f"时段{i:02d}:00-{i+1:02d}:00 波动率: {fluctuation:.2%}\n") print(f"统计报告已生成: {report_path}") except Exception as e: print(f"计算时序特征时出错: {str(e)}") def main(): try: print("开始处理时序数据...") # 获取所有热力图图层 layers = get_raster_layers() if not layers: print("错误:未找到热力图图层") return print(f"找到 {len(layers)} 个热力图图层") # 设置输出文件夹 output_folder = r"D:\3-my\Graduate\data\heatmap_output\temporal_analysis" os.makedirs(output_folder, exist_ok=True) # 计算时序特征 calculate_temporal_features(layers, output_folder) print("\n处理完成") except Exception as e: print(f"程序执行出错: {str(e)}") if __name__ == "__main__": main()
最新发布
05-08
我在qgis里运行这个代码,静默出错了 from qgis.core import QgsProject, QgsRasterLayer from qgis import processing import os import numpy as np def get_raster_layers(): """获取所有热力图图层""" print("\n=== 开始获取图层 ===") layers = [] project = QgsProject.instance() if not project: print("错误:QGIS项目未初始化") return layers print("当前项目中的图层:") for layer in project.mapLayers().values(): print(f"- {layer.name()}") for i in range(24): layer_name = f"Heatmap_{i:02d}" print(f"\n尝试获取图层: {layer_name}") layer = project.mapLayersByName(layer_name) if layer: print(f"成功找到图层: {layer_name}") print(f"图层类型: {layer[0].type()}") print(f"图层路径: {layer[0].source()}") layers.append(layer[0]) else: print(f"未找到图层: {layer_name}") print(f"\n总共找到 {len(layers)} 个图层") return layers def calculate_period_average(layers, output_folder): """ 计算各时段平均值 :param layers: 热力图图层列表 :param output_folder: 输出文件夹 """ try: print("\n=== 开始计算时段平均值 ===") # 1. 时段划分 print("\n--- 时段划分 ---") morning_hours = [7, 8, 9] # 早高峰 noon_hours = [10, 11, 12, 13, 14, 15, 16] # 平峰期 evening_hours = [17, 18, 19] # 晚高峰 print(f"早高峰时段: {morning_hours}") print(f"平峰期时段: {noon_hours}") print(f"晚高峰时段: {evening_hours}") # 2. 计算各时段平均值 print("\n--- 计算时段平均值 ---") for period_name, hours in [("早高峰", morning_hours), ("平峰期", noon_hours), ("晚高峰", evening_hours)]: print(f"\n处理{period_name}...") period_layers = [layers[h] for h in hours if h < len(layers)] print(f"找到 {len(period_layers)} 个图层") if period_layers: # 创建临时图层列表 temp_layers = [] for i, layer in enumerate(period_layers): print(f"\n处理第 {i+1} 个图层") print(f"图层名称: {layer.name()}") print(f"图层类型: {layer.type()}") print(f"图层路径: {layer.source()}") temp_path = os.path.join(output_folder, f"temp_{i}.tif") print(f"创建临时文件: {temp_path}") try: result = processing.run("gdal:translate", { 'INPUT': layer, 'OUTPUT': temp_path }) print(f"转换结果: {result}") temp_layers.append(temp_path) except Exception as e: print(f"转换图层时出错: {str(e)}") continue if temp_layers: # 计算平均值 output_path = os.path.join(output_folder, f"period_{period_name}.tif") print(f"\n计算平均值,输出到: {output_path}") formula = f"({' + '.join(['A' + str(i+1) for i in range(len(temp_layers))])}) / {len(temp_layers)}" print(f"计算公式: {formula}") try: result = processing.run("gdal:rastercalculator", { 'INPUT_A': temp_layers, 'BAND_A': [1] * len(temp_layers), 'FORMULA': formula, 'OUTPUT': output_path }) print(f"计算结果: {result}") except Exception as e: print(f"计算平均值时出错: {str(e)}") # 清理临时文件 for temp_file in temp_layers: if os.path.exists(temp_file): print(f"删除临时文件: {temp_file}") os.remove(temp_file) else: print(f"警告:{period_name}没有可用的临时图层") except Exception as e: print(f"计算时段平均值时出错: {str(e)}") import traceback print(traceback.format_exc()) def main(): try: print("=== 开始处理时段平均值 ===") # 获取所有热力图图层 print("\n1. 获取图层") layers = get_raster_layers() if not layers: print("错误:未找到热力图图层") return print(f"找到 {len(layers)} 个热力图图层") # 设置输出文件夹 print("\n2. 设置输出文件夹") output_folder = r"D:\3-my\Graduate\data\heatmap_output\temporal_analysis" os.makedirs(output_folder, exist_ok=True) print(f"输出文件夹: {output_folder}") # 计算时段平均值 print("\n3. 开始计算时段平均值") calculate_period_average(layers, output_folder) print("\n=== 处理完成 ===") except Exception as e: print(f"程序执行出错: {str(e)}") import traceback print(traceback.format_exc()) if __name__ == "__main__": main()
05-08
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值