DayDreamInGIS 逆地理编码工具(根据经纬度获取位置描述)插件源码解析

news2024/11/20 13:17:56

本工具调用高德地图逆地理编码api,根据高的地图逆地理编码api,实现根据经纬度获取位置描述。

总体设计逻辑,窗体采用WPF,通过属性的方式传递交互对象,核心处理逻辑写到button的执行逻辑中。

1.页面

页面XAML:

<Window x:Class="DayDreamInGISTool.GeoCoding.InverseGCWPF"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
             mc:Ignorable="d" Title="逆地理编码" ResizeMode="NoResize" WindowStartupLocation="CenterScreen"
             Width="500" Height="480">
    <Grid Margin="5">
        <Grid.RowDefinitions>
            <RowDefinition Height="40"></RowDefinition>
            <RowDefinition Height="40"></RowDefinition>
            <RowDefinition Height="40"></RowDefinition>
            <RowDefinition Height="40"></RowDefinition>
            <RowDefinition Height="40"></RowDefinition>
            <RowDefinition></RowDefinition>
            <RowDefinition></RowDefinition>
            <RowDefinition Height="40"></RowDefinition>
        </Grid.RowDefinitions>
        <Grid>
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="100"></ColumnDefinition>
                <ColumnDefinition></ColumnDefinition>
            </Grid.ColumnDefinitions>
            <Label Content="高德地图Token" VerticalAlignment="Center"></Label>
            <TextBox Grid.Column="1" VerticalAlignment="Center" Name="txtGDToken" Height="22" Text="b1670be70e419c2a112957742e55a756"></TextBox>
        </Grid>
        <!--第二行-->
        <Grid Grid.Row="1">
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="100"></ColumnDefinition>
                <ColumnDefinition></ColumnDefinition>
            </Grid.ColumnDefinitions>
            <Label Content="图层" VerticalAlignment="Center" HorizontalAlignment="Right"></Label>
            <ComboBox Grid.Column="1" Name="cmbLayer" VerticalAlignment="Center" Height="23" SelectionChanged="cmbLayer_SelectionChanged"></ComboBox>
        </Grid>
        <!--第三行-->
        <Grid Grid.Row="2">
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="100"></ColumnDefinition>
                <ColumnDefinition></ColumnDefinition>
            </Grid.ColumnDefinitions>
            <Label Content="经度" VerticalAlignment="Center" HorizontalAlignment="Right"></Label>
            <ComboBox Grid.Column="1" Name="cmbLongtitude" VerticalAlignment="Center" Height="23"></ComboBox>
        </Grid>
        <!--第四行-->
        <Grid Grid.Row="3">
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="100"></ColumnDefinition>
                <ColumnDefinition></ColumnDefinition>
            </Grid.ColumnDefinitions>
            <Label Content="纬度" VerticalAlignment="Center" HorizontalAlignment="Right"></Label>
            <ComboBox Grid.Column="1" VerticalAlignment="Center" Name="cmbLatitude" Height="23"></ComboBox>
        </Grid>
        <!--第五行-->
        <Grid Grid.Row="4">
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="100"></ColumnDefinition>
                <ColumnDefinition></ColumnDefinition>
            </Grid.ColumnDefinitions>
            <Label Content="位置" VerticalAlignment="Center" HorizontalAlignment="Right"></Label>
            <ComboBox Grid.Column="1" VerticalAlignment="Center" Name="cmbLocation" Height="23"></ComboBox>
        </Grid>

        <Grid Grid.Row="5">
            <GroupBox Header="地址结构">
                <Grid Margin="45 5">
                    <Grid.RowDefinitions>
                        <RowDefinition></RowDefinition>
                        <RowDefinition></RowDefinition>
                    </Grid.RowDefinitions>
                    <Grid>
                        <Grid.ColumnDefinitions>
                            <ColumnDefinition></ColumnDefinition>
                            <ColumnDefinition></ColumnDefinition>
                            <ColumnDefinition></ColumnDefinition>
                            <ColumnDefinition></ColumnDefinition>
                        </Grid.ColumnDefinitions>
                        <CheckBox Grid.Column="0" Name="chkPro" IsChecked="False" VerticalAlignment="Center" Checked="chkPro_Checked">省</CheckBox>
                        <CheckBox Grid.Column="1" Name="chkCity" IsChecked="False" VerticalAlignment="Center" Checked="chkCity_Checked">市</CheckBox>
                        <CheckBox Grid.Column="2" Name="chkCounty" IsChecked="False" VerticalAlignment="Center" Checked="chkCounty_Checked">县/区</CheckBox>
                        <CheckBox Grid.Column="3" Name="chkTown" IsChecked="False" VerticalAlignment="Center" Checked="chkTown_Checked">街道/乡镇</CheckBox>
                    </Grid>
                    <Grid Grid.Row="1">
                        <Label>示例</Label>
                        <TextBox Name="txtExample" VerticalAlignment="Center" HorizontalAlignment="Right" IsReadOnly="True">
                            北京市朝阳区望京街道方恒国际中心B座方恒国际
                        </TextBox>
                    </Grid>
                    
                </Grid>
            </GroupBox>
        </Grid>
        
        <!--第六行 说明-->
        <Grid Grid.Row="6">
            <GroupBox Header="说明">
                <Grid Margin="8">
                    <TextBlock TextWrapping="Wrap" LineHeight="20">
                        <Run>本插件使用高德地图逆地理编码服务获取位置描述,经纬度需为wgs84或者cgcs2000的经纬度,如果token不能使用,请去高德图管网申请token</Run>
                        <LineBreak></LineBreak>
                        <Hyperlink  Click="Hyperlink_Click" NavigateUri="https://console.amap.com/dev/key/app"> https://console.amap.com/dev/key/app</Hyperlink>
                    </TextBlock>
                    
                </Grid>
            </GroupBox>
        </Grid>
        
        <!--第七行-->
        <Grid Grid.Row="7">
            <Grid.ColumnDefinitions>
                <ColumnDefinition></ColumnDefinition>
                <ColumnDefinition></ColumnDefinition>
            </Grid.ColumnDefinitions>
            <Button Content="确定" Name="btnOK" Width="80" Height="30" VerticalAlignment="Center" HorizontalAlignment="Center" Click="btnOK_Click"></Button>
            <Button Content="取消" Name="btnCancel" Width="80" Height="30" Grid.Column="1" VerticalAlignment="Center" HorizontalAlignment="Center" Click="btnCancel_Click"></Button>
        </Grid>
    </Grid>
</Window>

页面逻辑代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using ESRI.ArcGIS.Carto;
using ESRI.ArcGIS.Geometry;
using ESRI.ArcGIS.Geodatabase;
using System.CodeDom;
using System.Diagnostics;

namespace DayDreamInGISTool.GeoCoding
{
    /// <summary>
    /// InverseGCWPF.xaml 的交互逻辑
    /// </summary>
    public partial class InverseGCWPF : Window
    {
        private IFeatureLayer pftlyr = null;

        public IFeatureLayer Pftlyr
        {
            get { return pftlyr; }
            set { pftlyr = value; }
        }
        private string xfdnm;

        public string Xfdnm
        {
            get { return xfdnm; }
            set { xfdnm = value; }
        }
        private string yfdnm;

        public string Yfdnm
        {
            get { return yfdnm; }
            set { yfdnm = value; }
        }
        private string locationfdnm;

        public string Locationfdnm
        {
            get { return locationfdnm; }
            set { locationfdnm = value; }
        }
        private string gdtoken;

        public string Gdtoken
        {
            get { return gdtoken; }
            set { gdtoken = value; }
        }

        private IMap pMap = null;

        string toolname = "DDGInverGeocoding";
        string keyname = "gdtoken";
        string tokenInReg = "";

        public InverseGCWPF()
        {
            InitializeComponent();
            pMap = ArcMap.Document.FocusMap;
            GISCommonHelper.CartoLyrHelper.setFeatureLyrCombox(ref cmbLayer, pMap, esriGeometryType.esriGeometryAny);

            try
            {
                object tt = GISCommonHelper.esriSystemHelper.getValueFromReg2(toolname, keyname);
                if (tt == null)
                {

                }
                else
                {
                    tokenInReg = tt.ToString();
                    this.txtGDToken.Text = tt.ToString();
                }
            }
            catch (Exception)
            {

                throw;
            }

            setExample();
        }

        private bool isPro;

        public bool IsPro
        {
            get { return isPro; }
            set { isPro = value; }
        }
        private bool isCity;

        public bool IsCity
        {
            get { return isCity; }
            set { isCity = value; }
        }
        private bool isCounty;

        public bool IsCounty
        {
            get { return isCounty; }
            set { isCounty = value; }
        }
        private bool isTown;

        public bool IsTown
        {
            get { return isTown; }
            set { isTown = value; }
        }

        private void cmbLayer_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {
            if (cmbLayer.SelectedIndex != -1)
            {
                pftlyr = cmbLayer.SelectedValue as IFeatureLayer;

                GISCommonHelper.CartoFieldHelper.setFieldCombox(ref cmbLongtitude, pftlyr.FeatureClass.Fields, false, 
                    esriFieldType.esriFieldTypeDouble, esriFieldType.esriFieldTypeSingle);
                GISCommonHelper.CartoFieldHelper.setFieldCombox(ref cmbLatitude, pftlyr.FeatureClass.Fields, false,
                    esriFieldType.esriFieldTypeDouble, esriFieldType.esriFieldTypeSingle);
                GISCommonHelper.CartoFieldHelper.setFieldCombox(ref cmbLocation, pftlyr.FeatureClass.Fields,false,esriFieldType.esriFieldTypeString);

                GISCommonHelper.CartoFieldHelper.setDftField(ref cmbLongtitude, p =>
                {
                    if (p.alias_name.Contains("经度") || p.name.Contains("经度") || p.alias_name.Contains("Lng") 
                    || p.name.Contains("Lng") || p.alias_name.Contains("Longtitude") || p.name.Contains("Longtitude")
                    || p.name.ToLower()=="x" || p.alias_name.ToLower()=="x")
                    {
                        return true;
                    }

                    return false;
                });

                GISCommonHelper.CartoFieldHelper.setDftField(ref cmbLatitude, p =>
                {
                    if (p.alias_name.Contains("纬度") || p.name.Contains("纬度") || p.alias_name.Contains("Lat") 
                    || p.name.Contains("Lat") || p.alias_name.Contains("Latitude") || p.name.Contains("Latitude")
                    || p.name.ToLower()=="y" || p.alias_name.ToLower()=="y")
                    {
                        return true;
                    }

                    return false;
                });

                GISCommonHelper.CartoFieldHelper.setDftField(ref cmbLocation, p =>
                {
                    if (p.alias_name.Contains("位置") || p.name=="位置" || p.name.ToLower().Contains("location"))
                    {
                        return true;
                    }
                    else
                    {
                        return false;
                    }
                });
            }
        }

        private void btnCancel_Click(object sender, RoutedEventArgs e)
        {
            this.DialogResult = false;
        }

        // 北京市朝阳区望京街道方恒国际中心B座方恒国际
        string pro = "浙江省";
        string city = "杭州市";
        string county = "上城区";
        string town = "四季青街道";
        string building = "钱江新城";

        private void btnOK_Click(object sender, RoutedEventArgs e)
        {
            if (pftlyr == null)
            {
                MessageBox.Show("请选择图层");
                return;
            }

            if (cmbLatitude.SelectedIndex == -1)
            {
                MessageBox.Show("请配置纬度字段");
                return;
            }
            else
            {
                yfdnm = cmbLatitude.SelectedValue.ToString();
            }

            if (cmbLongtitude.SelectedIndex == -1)
            {
                MessageBox.Show("请配置经度字段");
                return;
            }
            else
            {
                xfdnm = cmbLongtitude.SelectedValue.ToString();
            }

            if (cmbLocation.SelectedIndex == -1)
            {
                MessageBox.Show("请配置位置字段");
                return;
            }
            else
            {
                locationfdnm = cmbLocation.SelectedValue.ToString();
            }

            if (string.IsNullOrEmpty(txtGDToken.Text))
            {
                MessageBox.Show("高德地图token不能为空");
            }
            else 
            {
                gdtoken = txtGDToken.Text;
                if(gdtoken== tokenInReg)
                {

                }
                else
                {
                    //写入注册表
                    GISCommonHelper.esriSystemHelper.setValueToReg2(toolname, new KeyValuePair<string, object>(keyname, gdtoken));
                }
            }

            this.DialogResult = true;
        }

        private void Hyperlink_Click(object sender, RoutedEventArgs e) 
        {
            System.Windows.Documents.Hyperlink link = sender as System.Windows.Documents.Hyperlink;
            Process.Start(new ProcessStartInfo(link.NavigateUri.AbsoluteUri));
        }

        private void setExample()
        {
            string res = "";
            if (isPro)
            {
                res += pro;
            }

            if (isCity)
            {
                res+= city;
            }

            if (isCounty)
            {
                res += county;
            }

            if(isTown) 
            {
                res += town;
            }

            res += building;
            txtExample.Text = res;
        }

        private void chkPro_Checked(object sender, RoutedEventArgs e)
        {
            isPro = chkPro.IsChecked.Value;
            setExample();
        }

        private void chkCity_Checked(object sender, RoutedEventArgs e)
        {
            isCity= chkCity.IsChecked.Value;
            setExample();
        }

        private void chkCounty_Checked(object sender, RoutedEventArgs e)
        {
            isCounty= chkCounty.IsChecked.Value;
            setExample();
        }

        private void chkTown_Checked(object sender, RoutedEventArgs e)
        {
            isTown= chkTown.IsChecked.Value;
            setExample();
        }
    }
}

2.代码逻辑

using System;
using System.Collections.Generic;
using System.Text;
using System.IO;
using ESRI.ArcGIS.Geodatabase;
using ESRI.ArcGIS.Geometry;
using ESRI.ArcGIS.Carto;
using System.Windows;
using GISCommonHelper;
using DayDreamInGISTool.Assister;
using Newtonsoft.Json.Linq;

namespace DayDreamInGISTool.GeoCoding
{
    /// <summary>
    /// 高德地图逆地理编码
    /// 地址结构点选  OO
    /// 处理消息/状态写入 OO
    /// 进度条 OO
    /// token限制 默认token限速
    /// </summary>
    public class btnInverseGeocoding : ESRI.ArcGIS.Desktop.AddIns.Button
    {
        public btnInverseGeocoding()
        {
        }

        ESRI.ArcGIS.esriSystem.ITrackCancel trackCancel = null;
        ESRI.ArcGIS.esriSystem.IStepProgressor stepProgressor = null;
        ESRI.ArcGIS.Framework.IProgressDialog2 progressDialog2 = null;

        InverseGCWPF iwp = null;
        string tsttoken = "";
        bool isTest = false;
        
        protected override void OnClick()
        {
            try
            {
                iwp = new InverseGCWPF();
                if (iwp.ShowDialog().Value)
                {
                    if(iwp.Gdtoken== tsttoken)
                    {
                        MessageBox.Show("测试token,每次处理不超过30个要素");
                        isTest = true;
                    }
                    

                    trackCancel = new ESRI.ArcGIS.Display.CancelTrackerClass();
                    ESRI.ArcGIS.Framework.IProgressDialogFactory progressDialogFactory = new ESRI.ArcGIS.Framework.ProgressDialogFactoryClass();
                    stepProgressor = progressDialogFactory.Create(trackCancel, ArcMap.Application.hWnd);
                    ESRI.ArcGIS.Framework.IProgressDialog2 progressDialog2 = (ESRI.ArcGIS.Framework.IProgressDialog2)stepProgressor; // Explict Cast
                    progressDialog2.CancelEnabled = true;
                    progressDialog2.Description = "逆地理编码中...";
                    progressDialog2.Title = "逆地理编码";
                    progressDialog2.Animation = ESRI.ArcGIS.Framework.esriProgressAnimationTypes.esriProgressGlobe;
                    stepProgressor.Show();
                    execute();

                    //完成
                    trackCancel = null;
                    stepProgressor = null;
                    progressDialog2.HideDialog();
                    progressDialog2 = null;
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show("发生未知异常:"+ex.Message);
            }
        }

        string statusFd = "status";
        string infoFd = "info";

        private void execute()
        {
            //创建可能的消息状态字段
            try
            {
                GISCommonHelper.FieldHelper.AddStringField(iwp.Pftlyr.FeatureClass, new KeyValuePair<string, int>(statusFd, 10), 
                    new KeyValuePair<string, int>(infoFd, 70));
            }
            catch (Exception)
            {
                MessageBox.Show("创建标识字段出错");
            }

            stepProgressor.MinRange = 0;
            int featurecount = iwp.Pftlyr.FeatureClass.FeatureCount(null);
            if (isTest)
            {
                stepProgressor.MaxRange = featurecount > 30 ? 30 : featurecount;  //测试token,一次请求只能30
            }
            else
            {
                stepProgressor.MaxRange = featurecount;
            }
            stepProgressor.StepValue = 1;
            int n = 0;
            IFeatureCursor pftcursor = iwp.Pftlyr.FeatureClass.Search(null, false);
            IFeature pFeature= pftcursor.NextFeature();
            while(pFeature!=null )
            {
                if (isTest)
                {
                    if (n > 30)
                    {
                        break;
                    }
                }

                stepProgressor.Message = "正在处理要素,OId:" + pFeature.OID;
                System.Diagnostics.Debug.WriteLine("正在处理:"+pFeature.OID);
                double lng= (double)pFeature.getval(iwp.Xfdnm);
                double lat = (double)pFeature.getval(iwp.Yfdnm);
                RequestRes rr = getLocationStr(lng, lat);
                if(pFeature.Fields.FindField(statusFd)!=-1)
                    pFeature.setval(statusFd, rr.status);
                if (rr.status == "0")
                {
                    if(pFeature.Fields.FindField(infoFd)!=-1)
                        pFeature.setval(infoFd, rr.info);
                }
                else if (rr.status == "1")
                {
                    pFeature.setval(iwp.Locationfdnm, rr.address);
                }

                stepProgressor.Step();

                pFeature.Store();
                n++;
                pFeature = pftcursor.NextFeature();
            }
        }

        string bsurl = "https://restapi.amap.com/v3/geocode/regeo?parameters";

        private RequestRes getLocationStr(double lng,double lat)
        {
            RequestRes rr = new RequestRes();
            //https://restapi.amap.com/v3/geocode/regeo?output=xml&location=116.310003,39.991957&key=<用户的key>&radius=1000&extensions=all
            string location = "";
            string url = string.Format("https://restapi.amap.com/v3/geocode/regeo?location={0},{1}&key={2}&radius=1000&extensions=all",lng,lat,iwp.Gdtoken);
            string json = WebRequestAssist.GetRequestStr(url);
            var jRoot= JObject.Parse(json);
            int status= jRoot.Value<int>("status");
            rr.status = status.ToString();
            if (status == 1)
            {
                // 1 请求成功
                var regeocodeObj = jRoot.GetValue("regeocode") as JObject;
                string formatted_address = regeocodeObj.Value<string>("formatted_address");
                //北京市朝阳区望京街道方恒国际中心B座方恒国际
                //移除前缀
                var addressComponentObj = regeocodeObj.GetValue("addressComponent");
                string province = addressComponentObj.Value<string>("province");
                string district = addressComponentObj.Value<string>("district");
                string city = addressComponentObj.Value<string>("city");
                string township = addressComponentObj.Value<string>("township");
                rr.address = formatted_address;
                //return formatted_address;

                if (!iwp.IsPro)
                {
                    formatted_address=formatted_address.Replace(province, "");
                }

                if(!iwp.IsCity) 
                {
                    if (!string.IsNullOrEmpty(city))
                    {
                        formatted_address = formatted_address.Replace(city, "");
                    }
                }

                if (!iwp.IsCounty)
                {
                    formatted_address = formatted_address.Replace(district,""); 
                }

                if (!iwp.IsTown)
                {
                    formatted_address = formatted_address.Replace(township, "");
                }
                rr.address = formatted_address;
            }
            else 
            {
                //0 请求失败
                string info = jRoot.Value<string>("info");  //错误消息
                rr.info = info;
            }

            return rr;
        }

        protected override void OnUpdate()
        {
        }

        struct RequestRes
        {
            public string status { get; set; }
            public string info { get; set; }
            public string address { get; set; }
        }
    }
}

大体解析:(1)获取要素的经度、纬度字段值

(2)调用高德地图逆地理编码API,获取位置描述

(3)通过Newtonsoft.JSON解析返回的json对象,并按照要求,剔除省、市等前缀

(4)将结果写入要素

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

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

相关文章

6个步骤轻松实现 postman 接口压力测试(建议收藏)

这里讲是postman做接口并发测试&#xff0c;基础用法不做赘述 1、第一步接口可以通的情况下点击右上角save 2、将相应信息填入 3、如果是同一个接口修改不同的值如下图 现在我也找了很多测试的朋友&#xff0c;做了一个分享技术的交流群&#xff0c;共享了很多我们收集的技术文…

LevelDB总结

leveldb架构 顺序写&#xff1a;level db不需要在各个level中去修改位置&#xff0c;而是只要放到最新的memTable中插入&#xff0c;所以在读取数据时如果在上层找到了数据或者数据flag是已删除就不需要继续寻找了。所以其能够提供比读更好的性能。 一、memTable 1.1 LSM-Tre…

mavicat打开本地连接显示2002-Can‘t connnect to server on ‘localhost‘(10061)

报错如下&#xff1a;2002-Can’t connnect to server on ‘localhost’(10061)&#xff0c;原因是没有打开mysql 具体操作如下&#xff1a; 按键&#xff1a;CtrlAltDelete打开资源管理器 在服务里找到MySQL然右击“开始”&#xff0c;启动mysql 然后再点击连接&#xff0c;…

mysql备份数据库

目录 准备工作 写入密码至my.ini中 为了安全性&#xff0c;创建备份用户 1、在windows命令行的方式 2、在mysql中&#xff0c;使用定时计划自动执行。&#xff08;待研究&#xff09; 准备工作 写入密码至my.ini中 mysqldump如果直接明文显示密码&#xff0c;会报错&…

uni-app checkout(多选)radio(单选)选中之后样式不会出现钩子

前言 最近在实际开发过程中发现项目的多选和单选选中之后都是只有颜色&#xff0c;没有钩子&#xff0c;或者是另外图案 刚开始并不重视&#xff0c;猜测可能是微信基础库的bug&#xff0c;可能换个基础库就行了&#xff0c;或者是编辑器显示问题 最后在查阅之后才发现&#…

Python哪个版本最稳定好用2023.10.19

环境&#xff1a; win10 专业版 Python 问题描述&#xff1a; python哪个版本最稳定好用 解决方案&#xff1a; 目前&#xff0c;Python 的最新版本是 3.11.0。然而&#xff0c;对于大多数用户来说&#xff0c;Python 3.8 和 3.9 是最稳定和好用的版本&#xff0c;因为它们…

【LINUX】 LINUX | 提取U盘映像

LINUX | 提取U盘映像 时间&#xff1a;2023年10月19日10:57:18 参考&#xff1a; 怎么提取U盘映像文件 提取U盘映像的方法 (0451nkw.com) 实践

Maven的详细介绍(maven的全据配置以及idea中maven的配置)

maven的理解 Maven 是一个强大的项目管理和构建自动化工具&#xff0c;它通过抽象的项目对象模型(POM&#xff1a;Project Object Model)和构建生命周期模型(Project Lifecycle)来对项目及其构建过程进行管理(Dependency Management System)&#xff0c;Maven 最大化的消除了构…

跟我一起写个虚拟机 .Net 7(三)- 安装LC-3 模拟器和编译器

LC-3&#xff08;Little Computer 3&#xff09; 是一门教学用的虚拟计算机模型&#xff0c;主要是为了方便学生了解简单化的计算机结构。 主要想学习《计算机系统概论》上的案例&#xff0c;基本都是通过LC-3 模拟器和LC-3编译器来的&#xff0c;所以&#xff0c;把安装的方式…

Spring源码解析——事务的回滚和提交

正文 上一篇文章讲解了获取事务&#xff0c;并且通过获取的connection设置只读、隔离级别等&#xff0c;这篇文章讲解剩下的事务的回滚和提交。最全面的Java面试网站 回滚处理 之前已经完成了目标方法运行前的事务准备工作&#xff0c;而这些准备工作最大的目的无非是对于程…

【1024程序员节】代码写诗(C++版)

#include <bits/stdc.h> #include <sal.h> using namespace std;class Sky { //天上 public:_Success_(return false) bool Sea(_In_opt_ int* Run) { //不复回int sea *Run;return false;} private:str…

倒计时 2 天!本周六,Apache Doris 年度技术盛会相约北京!

峰会官网已上线&#xff0c;最新议程请关注&#xff1a;doris-summit.org.cn 即刻报名 Doris Summit 是 Apache Doris 社区一年一度的技术盛会&#xff0c;由飞轮科技联合 Apache Doris 社区的众多开发者、企业用户和合作伙伴共同发起&#xff0c;专注于传播推广开源 OLAP 与实…

简单了解一下:Node全局对象和事件监听和触发

Node的全局对象&#xff0c;就是整个应用都能引用的对象。Node本身内置了多个全局变量、全局对象和全局函数。 全局变量有两个&#xff1a;__filename和__dirname&#xff0c; __filename&#xff1a;表示当前正在执行的脚本文件名&#xff1b; __dirname&#xff1a;当前脚本…

【前端学习】—Promise基本知识(十六)

【前端学习】—Promise基本知识&#xff08;十六&#xff09; 一、class和function的区别 相同点&#xff1a;都可以用作构造函数不同点&#xff1a;class不可以使用call apply bind的方式来改变它的执行上下文 二、Promise 定义&#xff1a;Promise是异步编程的一种解决方案…

【OpenCV实现图片以及视频的读取、显示、保存以及绘图函数】

文章目录 图片视频从文件读取视频保存一个视频绘图函数 图片 OpenCV&#xff08;Open Source Computer Vision Library&#xff09;是一个广泛应用于计算机视觉和图像处理领域的开源库。它提供了丰富的图像处理工具和算法&#xff0c;使得开发者能够轻松实现各种图像处理任务。…

办鹿uniapp小程序(一)

一、项目初始化 1. appid 》 公司给你 wxc82730a0fc15e28a 2. 开发者身份 》 公司给你添加 小程序官网&#xff1a;小程序 管理》成员管理》项目成员 1、 uniapp ui组件 &#xff08;uView&#xff09; 如果采用npm安装方式在 小程序端不生效 1.1 采用插件的形式安装&#xf…

pycharm操作git、前后端项目上传到gitee

pycharm操作git 之前用命令做的所有操作&#xff0c;使用pychrm点点就可以完成 克隆代码 上方工具栏Git ⇢ \dashrightarrow ⇢ Clone ⇢ \dashrightarrow ⇢ 填写地址&#xff08;http、ssh&#xff09; 提交到暂存区&#xff0c;提交到版本库&#xff0c;推送到远程 直接…

Nmap端口服务 之 CentOS7 关于启动Apache(httpd)服务、telnet服务、smtp服务、ftp服务、sftp服务

Nmap端口服务 之 CentOS7 关于启动Apache(httpd)服务、telnet服务、smtp服务、ftp服务、sftp服务 一. CentOS7 安装配置SFTP服务器详解一、SFTP简介二、关闭防火墙三、安装SSH服务在CentOS7中,sftp只是ssh的一部分,所以采用yum来安装ssh服务即可1. 查看是否已经安装了ssh2.…

promise返回值多层嵌套

实际上打印的是promise的res不是api接口返回值 因为用apifox测试开发服务器的代理接口&#xff0c;和不加代理测试返回值相同&#xff1a; http://localhost:3030是vue开发代理。 "D:\code\jeecg\vue\job-app-master\manifest.json" "proxy" : {"/ap…

嵌入式实习难找怎么办?

今日话题&#xff0c;嵌入式实习难找怎么办&#xff1f;个人建议如果找不到实习机会&#xff0c;可以回归学习嵌入式所需的知识&#xff0c;积累项目经验或者回顾之前参与过的项目&#xff0c;将它们整理复盘。如果还有时间&#xff0c;可以再尝试找实习&#xff0c;如果找不到…