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

本工具调用高德地图逆地理编码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)将结果写入要素

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Go语言(也称为Golang)是由Google开发的一种静态强类型、编译型的编程语言。它旨在成为一门简单、高效、安全和并发的编程语言,特别适用于构建高性能的服务器和分布式系统。以下是Go语言的一些主要特点和优势: 简洁性:Go语言的语法简单直观,易于学习和使用。它避免了复杂的语法特性,如继承、重载等,转而采用组合和接口来实现代码的复用和扩展。 高性能:Go语言具有出色的性能,可以媲美C和C++。它使用静态类型系统和编译型语言的优势,能够生成高效的机器码。 并发性:Go语言内置了对并发的支持,通过轻量级的goroutine和channel机制,可以轻松实现并发编程。这使得Go语言在构建高性能的服务器和分布式系统时具有天然的优势。 安全性:Go语言具有强大的类型系统和内存管理机制,能够减少运行时错误和内存泄漏等问题。它还支持编译时检查,可以在编译阶段就发现潜在的问题。 标准库:Go语言的标准库非常丰富,包含了大量的实用功能和工具,如网络编程、文件操作、加密解密等。这使得开发者可以更加专注于业务逻辑的实现,而无需花费太多时间在底层功能的实现上。 跨平台:Go语言支持多种操作系统和平台,包括Windows、Linux、macOS等。它使用统一的构建系统(如Go Modules),可以轻松地跨平台编译和运行代码。 开源和社区支持:Go语言是开源的,具有庞大的社区支持和丰富的资源。开发者可以通过社区获取帮助、分享经验和学习资料。 总之,Go语言是一种简单、高效、安全、并发的编程语言,特别适用于构建高性能的服务器和分布式系统。如果你正在寻找一种易于学习和使用的编程语言,并且需要处理大量的并发请求和数据,那么Go语言可能是一个不错的选择。
Go语言(也称为Golang)是由Google开发的一种静态强类型、编译型的编程语言。它旨在成为一门简单、高效、安全和并发的编程语言,特别适用于构建高性能的服务器和分布式系统。以下是Go语言的一些主要特点和优势: 简洁性:Go语言的语法简单直观,易于学习和使用。它避免了复杂的语法特性,如继承、重载等,转而采用组合和接口来实现代码的复用和扩展。 高性能:Go语言具有出色的性能,可以媲美C和C++。它使用静态类型系统和编译型语言的优势,能够生成高效的机器码。 并发性:Go语言内置了对并发的支持,通过轻量级的goroutine和channel机制,可以轻松实现并发编程。这使得Go语言在构建高性能的服务器和分布式系统时具有天然的优势。 安全性:Go语言具有强大的类型系统和内存管理机制,能够减少运行时错误和内存泄漏等问题。它还支持编译时检查,可以在编译阶段就发现潜在的问题。 标准库:Go语言的标准库非常丰富,包含了大量的实用功能和工具,如网络编程、文件操作、加密解密等。这使得开发者可以更加专注于业务逻辑的实现,而无需花费太多时间在底层功能的实现上。 跨平台:Go语言支持多种操作系统和平台,包括Windows、Linux、macOS等。它使用统一的构建系统(如Go Modules),可以轻松地跨平台编译和运行代码。 开源和社区支持:Go语言是开源的,具有庞大的社区支持和丰富的资源。开发者可以通过社区获取帮助、分享经验和学习资料。 总之,Go语言是一种简单、高效、安全、并发的编程语言,特别适用于构建高性能的服务器和分布式系统。如果你正在寻找一种易于学习和使用的编程语言,并且需要处理大量的并发请求和数据,那么Go语言可能是一个不错的选择。
Go语言(也称为Golang)是由Google开发的一种静态强类型、编译型的编程语言。它旨在成为一门简单、高效、安全和并发的编程语言,特别适用于构建高性能的服务器和分布式系统。以下是Go语言的一些主要特点和优势: 简洁性:Go语言的语法简单直观,易于学习和使用。它避免了复杂的语法特性,如继承、重载等,转而采用组合和接口来实现代码的复用和扩展。 高性能:Go语言具有出色的性能,可以媲美C和C++。它使用静态类型系统和编译型语言的优势,能够生成高效的机器码。 并发性:Go语言内置了对并发的支持,通过轻量级的goroutine和channel机制,可以轻松实现并发编程。这使得Go语言在构建高性能的服务器和分布式系统时具有天然的优势。 安全性:Go语言具有强大的类型系统和内存管理机制,能够减少运行时错误和内存泄漏等问题。它还支持编译时检查,可以在编译阶段就发现潜在的问题。 标准库:Go语言的标准库非常丰富,包含了大量的实用功能和工具,如网络编程、文件操作、加密解密等。这使得开发者可以更加专注于业务逻辑的实现,而无需花费太多时间在底层功能的实现上。 跨平台:Go语言支持多种操作系统和平台,包括Windows、Linux、macOS等。它使用统一的构建系统(如Go Modules),可以轻松地跨平台编译和运行代码。 开源和社区支持:Go语言是开源的,具有庞大的社区支持和丰富的资源。开发者可以通过社区获取帮助、分享经验和学习资料。 总之,Go语言是一种简单、高效、安全、并发的编程语言,特别适用于构建高性能的服务器和分布式系统。如果你正在寻找一种易于学习和使用的编程语言,并且需要处理大量的并发请求和数据,那么Go语言可能是一个不错的选择。
Go语言(也称为Golang)是由Google开发的一种静态强类型、编译型的编程语言。它旨在成为一门简单、高效、安全和并发的编程语言,特别适用于构建高性能的服务器和分布式系统。以下是Go语言的一些主要特点和优势: 简洁性:Go语言的语法简单直观,易于学习和使用。它避免了复杂的语法特性,如继承、重载等,转而采用组合和接口来实现代码的复用和扩展。 高性能:Go语言具有出色的性能,可以媲美C和C++。它使用静态类型系统和编译型语言的优势,能够生成高效的机器码。 并发性:Go语言内置了对并发的支持,通过轻量级的goroutine和channel机制,可以轻松实现并发编程。这使得Go语言在构建高性能的服务器和分布式系统时具有天然的优势。 安全性:Go语言具有强大的类型系统和内存管理机制,能够减少运行时错误和内存泄漏等问题。它还支持编译时检查,可以在编译阶段就发现潜在的问题。 标准库:Go语言的标准库非常丰富,包含了大量的实用功能和工具,如网络编程、文件操作、加密解密等。这使得开发者可以更加专注于业务逻辑的实现,而无需花费太多时间在底层功能的实现上。 跨平台:Go语言支持多种操作系统和平台,包括Windows、Linux、macOS等。它使用统一的构建系统(如Go Modules),可以轻松地跨平台编译和运行代码。 开源和社区支持:Go语言是开源的,具有庞大的社区支持和丰富的资源。开发者可以通过社区获取帮助、分享经验和学习资料。 总之,Go语言是一种简单、高效、安全、并发的编程语言,特别适用于构建高性能的服务器和分布式系统。如果你正在寻找一种易于学习和使用的编程语言,并且需要处理大量的并发请求和数据,那么Go语言可能是一个不错的选择。
Go语言(也称为Golang)是由Google开发的一种静态强类型、编译型的编程语言。它旨在成为一门简单、高效、安全和并发的编程语言,特别适用于构建高性能的服务器和分布式系统。以下是Go语言的一些主要特点和优势: 简洁性:Go语言的语法简单直观,易于学习和使用。它避免了复杂的语法特性,如继承、重载等,转而采用组合和接口来实现代码的复用和扩展。 高性能:Go语言具有出色的性能,可以媲美C和C++。它使用静态类型系统和编译型语言的优势,能够生成高效的机器码。 并发性:Go语言内置了对并发的支持,通过轻量级的goroutine和channel机制,可以轻松实现并发编程。这使得Go语言在构建高性能的服务器和分布式系统时具有天然的优势。 安全性:Go语言具有强大的类型系统和内存管理机制,能够减少运行时错误和内存泄漏等问题。它还支持编译时检查,可以在编译阶段就发现潜在的问题。 标准库:Go语言的标准库非常丰富,包含了大量的实用功能和工具,如网络编程、文件操作、加密解密等。这使得开发者可以更加专注于业务逻辑的实现,而无需花费太多时间在底层功能的实现上。 跨平台:Go语言支持多种操作系统和平台,包括Windows、Linux、macOS等。它使用统一的构建系统(如Go Modules),可以轻松地跨平台编译和运行代码。 开源和社区支持:Go语言是开源的,具有庞大的社区支持和丰富的资源。开发者可以通过社区获取帮助、分享经验和学习资料。 总之,Go语言是一种简单、高效、安全、并发的编程语言,特别适用于构建高性能的服务器和分布式系统。如果你正在寻找一种易于学习和使用的编程语言,并且需要处理大量的并发请求和数据,那么Go语言可能是一个不错的选择。
要实现根据经纬度获取地址,可以使用地理编码的方式,常用的地理编码服务有百度地图、高德地图、腾讯地图等。以下以百度地图为例,介绍如何使用百度地图API实现根据经纬度获取地址信息。 1. 首先需要在百度地图开放平台申请一个开发者账号,并创建一个应用,获取该应用的AK(访问密钥)。 2. 调用百度地图地理编码API,传入经纬度参数,即可获取位置的地址信息。API的请求示例如下: ``` http://api.map.baidu.com/reverse_geocoding/v3/?ak=您的ak&output=json&coordtype=wgs84ll&location=纬度,经度 ``` 其中,ak为访问密钥,location为经纬度信息,示例请求如下: ``` http://api.map.baidu.com/reverse_geocoding/v3/?ak=your_ak&output=json&coordtype=wgs84ll&location=31.225696563611,121.49884033194 ``` 3. API返回的结果为JSON格式,包含了该位置的地址信息,例如: ``` { "status":0, "result":{ "location":{ "lng":121.49884033194, "lat":31.225696563611 }, "formatted_address":"上海市黄浦区南京东路街道南京东路", "addressComponent":{ "city":"上海市", "district":"黄浦区", "province":"上海市", "adcode":"310101" }, "business":"", "pois":[], "roads":[], "poiRegions":[], "sematic_description":"", "cityCode":289 } } ``` 可以从中提取出需要的地址信息,例如formatted_address为位置名称,addressComponent中的district为区,city为市,province为省,adcode为编码。 需要注意的是,不同的地理编码服务可能返回的结果格式和字段不同,需要根据具体的服务和API文档进行调用和解析

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值