精华内容
下载资源
问答
  • 很好的实现了IP地址反解析为域名、物理地址。也可以将域名解析为IP地址。
  • 一、什么是地址反解析 我们都知道手机定位服务,其本质是汇总各种信号得出一个经纬度坐标(x,y)(具体定位原理可以参考:LBS定位技术、基于朴素贝叶斯的定位算法),然而定位服务并未提供该坐标对应的实体地理信息...

    一、什么是地址反解析

           我们都知道手机定位服务,其本质是汇总各种信号得出一个经纬度坐标(x,y)(具体定位原理可以参考:LBS定位技术基于朴素贝叶斯的定位算法),然而定位服务并未提供该坐标对应的实体地理信息,比如街道、POI等,要知道这些信息就需要使用地址反解析服务,该服务就是由经纬度信息得到结构化地址信息(图1)。

    图1 地址反解析

          例如lat:30.252188, lng:120.120427,地址反解析得到的结果如表1所示。

     

    表1 地址反解析得到的结果

    {
      data: 
      {
        province: "杭州市",
        city: "杭州",
        district: "西湖区",
        detail: "灵隐路-灵溪南路",
        lat: 30.252188,
        lng: 120.120427
      }
    }

    二、基本思路

          一般现有的地图服务公司如高德、google、百度等都会提供地址反解析服务,当大家业务规模较小时可以选择调用他们提供的接口,但是如果业务规模较大时,再去直接调用显然不太合适。大家需要有自己的实现能力!

      实现地址反解析服务有矢量和栅格两种思路。

    1)矢量思路

          高德、google、百度等地图服务公司有自己的地图数据,包括矢量数据(比如点、线、面等几何数据)以及矢量对应的属性信息(比如某线对应的属性是“北京朝阳望京东路”),因此他们的地址反解析思路很直接,直接根据经纬度查找附近的矢量数据(POI、道路等数据),比如查找到一条道路,然后返回道路对应的属性信息即可(图2)。具体实现思路与地理围栏算法解析(Geo-fencing)一文相似。

    图2 矢量思路示意图

          

      这种方式的优点是数据存储量较小。缺点是要求有详细的地图矢量数据以及对应的属性数据,而对一般公司来说很难获得。

          尽管我们可以通过开源的openstreetmap拿到中国的矢量地图数据(如何获取、存储、管理、使用osm数据呢?可以参考:利用OpenStreetMap(OSM)数据搭建一个地图服务),但是openstreetmap中国地区的矢量地图数据很不详细,精度也较低,完全依赖于openstreetmap的地图数据来进行地址反解析还不太靠谱。

     2)栅格思路

           什么是栅格思路?如图3a所示,比如将北京划分成很多栅格(也称之为瓦片),当栅格比较精细时,比如为10米*10米时,我们可以假设一个栅格内部的地址是相同的。这种假设是合理的,如图3b虚线框栅格内的两点所示,尽管该两点经纬度坐标不同,但是其地址均为“中国北京市朝阳区北苑路”。基于上述假设,我们可以事先存储各个栅格对应的地址信息。每当一个用户请求过来,首先判断该用户经纬度所对应的栅格,然后将此栅格对应的地址信息返回即可。     

         栅格思路的优点是很简单很直观,缺点是数据量大。以北京为例,北京全市面积为 16,410.54平方千米,如果栅格大小为10米*10米,那么需要存储1.6亿个栅格对应的地址信息,如果放大到全国(约960万平方千米),数据量将更大。


     
    图3 栅格思路示意图

    三、方案设计

           在没有矢量数据的情况下一般应用可以采用栅格思路,因为简单直观易于上手,后期如果找到完备的矢量数据则可以借鉴矢量思路。

    1)如何降低栅格方案的数据存储量?

           栅格方案最大的缺点是存储量巨大,如何降低栅格方案的数据存储量呢?我们有两种思路。

           a)有效栅格方案。前面讲到如果栅格为10米*10米时,仅北京就会有1.6亿个栅格。但是我们知道一般应用的用户基本是在城区进行访问,鲜有用户会在山沟沟里使用大家的服务,因此这1.6亿个栅格有大部分是不会有被访问到的(某栅格被访问到是指用户请求的经纬度落在该栅格范围内),我们将被用户访问到的栅格称之为有效栅格。事实上我们无需存储所有栅格对应的地址信息,而仅需存储有效栅格对应的地址信息即可实现我们的地址反解析服务,从而大大降低数据存储量。如图4所示,黄色栅格代表是有用户访问到的栅格,即有效栅格,有效栅格数目<<全部栅格数目。

    图4 有效栅格方案(红点代表用户请求的经纬度,黄色栅格代表有效栅格)

     

           b)自适应粒度栅格方案。之前栅格粒度是不变的,比如都是10米*10米,由于大部分栅格用户不会访问到,这样较为浪费存储空间。我们可以采用四叉树对地理空间进行划分(图5),每次划分都对空间进行四等分,直到划分出的栅格内没有用户请求点或者栅格的粒度<=10米*10米为止。在用户访问密集区域,栅格的粒度较为精细,精度较高,在鲜有用户访问区域,栅格粒度较粗,地址反解析的结果也较粗,可以发现:自适应粒度栅格数目<<均等粒度栅格数目。

    图5 自适应粒度栅格方案

     

             从本质上讲有效栅格方案是key-value的存储结构,存储简单方便,并且更新也很简便,非常适合大数据环境。而自适应粒度栅格方案本质上是树存储结构(四叉树),涉及到树结构的节点分裂等操作,在大数据环境下实现逻辑较为复杂。简便起见我们采用有效栅格方案。

    2)数据存储方式?

           有效栅格方案本质是key-value的存储方式。1)这里的key指的是栅格的编号,一个用户请求过来,首先根据用户请求的经纬度判断其所在的栅格编号(key),然后查找该编号(key)对应的地址信息。栅格的编号方式有很多,可以采用geohash编码来进行编号(关于geohash可以查看GeoHash核心原理解析Geohash距离估算),一般来讲,geohash编码长度为8位时,其代表着20米*20米的栅格。2)value值指的是该栅格的中心点对应的地址信息。

         此外还需存储该记录的时间戳,以便我们知道数据的新旧,方便更新(表2)。

     

        表2 数据存储结构


    3)实现流程
     

           地址反解析服务实现流程分为预处理以及线上服务两个步骤(参见图6)。

    a)预处理

          1)利用已有用户的定位/地址反解析请求日志来确定有效栅格

                用户定位/地址反解析请求会携带有经纬度信息,可以计算该经纬度对应的geohash编码(key),并查询数据库,如果没有该key则进行插入,数据量较大时可以使用mapreduce进行处理,最后将数据写入Hbase以便线上实时查询;

          2)获取各个有效栅格对应的地址信息

                获取每个有效栅格对应的经纬度,去请求地图服务商google、baidu、高德、搜狗等的地址反解析服务接口,获得相应结构化地址信息并进行插入。

           上述两个步骤也可以合二为一,确定了有效栅格后即可请求地图服务商接口,并将geohash编码、结构化地址信息和时间戳信息插入到数据库中。

    b)线上服务

          对一个用户请求,首先得到经纬度,通过geohash对该经纬度编码,从而查找数据库,如果找到便直接返回,如果没找到或离上次更新时间与现在间隔超过一个月(具体时间可以动态设置)之内,则请求第三方地址反解析接口,并将更新任务放在任务队列里实现异步更新。

    图6 栅格思路的地址反解析方案

    展开全文
  • Google 地址反解析应用及问题

    千次阅读 2009-08-19 09:33:00
    google地址解析是根据地名得到对应的经纬度,反解析...google地址反解析服务的输出格式支持xml、csv、json。 请求及响应如下: xml请求: http://ditu.google.cn/maps/geo?output=xml&key=abcdef&q=39.924000,116.310

        google地址解析是根据地名得到对应的经纬度,反解析就是根据经纬度得到和经纬度相匹配的地名,可能有多个。google地址反解析服务的输出格式支持xml、csv、json。

     

        请求及响应如下:

     

        xml请求:

        http://ditu.google.cn/maps/geo?output=xml&key=abcdef&q=39.924000,116.310100,其中key的值随便给就行了甚至不给也没问题,q=39.924000,116.310100为要反解析的纬度和经度。

     

        xml响应:

    <?xml version="1.0" encoding="UTF-8" ?>
    <kml xmlns="http://earth.google.com/kml/2.0"><Response>
      <name>39.924000,116.310100</name>
      <Status>
        <code>200</code>
        <request>geocode</request>
      </Status>
      <Placemark id="p1">
        <address>中国北京市海淀区西三环中路3号</address>
        <AddressDetails Accuracy="8" xmlns="urn:oasis:names:tc:ciq:xsdschema:xAL:2.0"><Country><CountryNameCode>CN</CountryNameCode><CountryName>中国</CountryName><AdministrativeArea><AdministrativeAreaName>北京市</AdministrativeAreaName><DependentLocality><DependentLocalityName>海淀区</DependentLocalityName><Thoroughfare><ThoroughfareName>西三环中路3号</ThoroughfareName></Thoroughfare></DependentLocality></AdministrativeArea></Country></AddressDetails>
        <ExtendedData>
          <LatLonBox north="39.9271476" south="39.9208524" east="116.3132953" west="116.3070001" />
        </ExtendedData>
        <Point><coordinates>116.3101242,39.9240000,0</coordinates></Point>
      </Placemark>
      <Placemark id="p2">
        <address>中国北京市海淀区航天桥站 </address>
        <AddressDetails Accuracy="9" xmlns="urn:oasis:names:tc:ciq:xsdschema:xAL:2.0"><AddressLine>航天桥站</AddressLine></AddressDetails>
        <ExtendedData>
          <LatLonBox north="39.9271796" south="39.9208844" east="116.3135696" west="116.3072744" />
        </ExtendedData>
        <Point><coordinates>116.3104220,39.9240320,0</coordinates></Point>
      </Placemark>
      <Placemark id="p3">
        <address>中国北京市海淀区航天桥(109国道)</address>
        <AddressDetails Accuracy="4" xmlns="urn:oasis:names:tc:ciq:xsdschema:xAL:2.0"><Country><CountryNameCode>CN</CountryNameCode><CountryName>中国</CountryName><AdministrativeArea><AdministrativeAreaName>北京市</AdministrativeAreaName><DependentLocality><DependentLocalityName>海淀区</DependentLocalityName><AddressLine>航天桥(109国道)</AddressLine></DependentLocality></AdministrativeArea></Country></AddressDetails>
        <ExtendedData>
          <LatLonBox north="39.9270946" south="39.9207994" east="116.3139006" west="116.3076054" />
        </ExtendedData>
        <Point><coordinates>116.3107530,39.9239470,0</coordinates></Point>
      </Placemark>
      <Placemark id="p4">
        <address>中国北京市海淀区</address>
        <AddressDetails Accuracy="4" xmlns="urn:oasis:names:tc:ciq:xsdschema:xAL:2.0"><Country><CountryNameCode>CN</CountryNameCode><CountryName>中国</CountryName><AdministrativeArea><AdministrativeAreaName>北京市</AdministrativeAreaName><DependentLocality><DependentLocalityName>海淀区</DependentLocalityName></DependentLocality></AdministrativeArea></Country></AddressDetails>
        <ExtendedData>
          <LatLonBox north="40.1567397" south="39.8876256" east="116.3919132" west="116.0470104" />
        </ExtendedData>
        <Point><coordinates>116.2984190,39.9594050,0</coordinates></Point>
      </Placemark>
      <Placemark id="p5">
        <address>中国北京市北京市市辖区</address>
        <AddressDetails Accuracy="4" xmlns="urn:oasis:names:tc:ciq:xsdschema:xAL:2.0"><Country><CountryNameCode>CN</CountryNameCode><CountryName>中国</CountryName><Locality><LocalityName>北京市</LocalityName><AddressLine>北京市市辖区</AddressLine></Locality></Country></AddressDetails>
        <ExtendedData>
          <LatLonBox north="40.1785550" south="39.5078540" east="116.6333300" west="115.4138100" />
        </ExtendedData>
        <Point><coordinates>115.9467997,39.9229023,0</coordinates></Point>
      </Placemark>
      <Placemark id="p6">
        <address>中国北京市北京城区</address>
        <AddressDetails Accuracy="3" xmlns="urn:oasis:names:tc:ciq:xsdschema:xAL:2.0"><Country><CountryNameCode>CN</CountryNameCode><CountryName>中国</CountryName><AdministrativeArea><AdministrativeAreaName>北京市</AdministrativeAreaName><AddressLine>北京城区</AddressLine></AdministrativeArea></Country></AddressDetails>
        <ExtendedData>
          <LatLonBox north="41.0608685" south="39.4432527" east="117.3895952" west="115.4203742" />
        </ExtendedData>
        <Point><coordinates>116.4081980,39.9046670,0</coordinates></Point>
      </Placemark>
    </Response></kml>

     

        其中,每个Placemark为一个解析出的地址点,其描述为address元素内容,匹配程度为属性Accuracy的值说明,值越高说明匹配程度越高,这个地址点真正对应的经纬度为coordinates元素内容说明。这种输出格式有点烦杂,甚至有点错误,但不影响结果,下述。

     

        csv请求:

        http://ditu.google.cn/maps/geo?output=csv&key=abcdef&q=39.924000,116.310100

     

        csv响应:

        200,8,"中国北京市海淀区西三环中路3号"

     

        其中,200为响应码,620表明超出请求数量限制;8应该为匹配程度,后面的为地址描述。这种形式比较简洁,但是不一定是最临近请求点的匹配结果。从xml的响应中可以看到还有为9的响应匹配(中国北京市海淀区航天桥站 )。

     

     

        xml格式的响应最为全面,可以根据一定的规则挑选适合的Placemark,并可以利用实际经纬度和请求经纬度的差做进一步说明,比如距离、方位。

        google地址反解析xml服务可能推出时间不长,或者使用的较少,或者是其他原因。xml返回中说明是UTF-8编码,<?xml version="1.0" encoding="UTF-8" ?>,但是实际上是GBK的编码。说明和实际不一致,导致xml解析时出错,这可能算是google的一个疏忽了。不过可以强制指定要解析内容的编码,而不是根据文档的自身说明就可以了。

        另外,从测试结果看,能达到匹配值4以上的时候比较少,也就时说偏差比较大,这些服务还不够实用。

    展开全文
  • 公司要做邮件服务器 用的电信光纤 固定IP
  • Android地址解析反地址解析(谷歌)工具类。
  • 这是我在做百度地图相关项目时候的资源,百度地图地址解析与反解析,大家共同学习学习
  • 地址解析反地址解析(谷歌)地址解析 /** * 根据地址获取对应的经纬度 * * @param address * 地址字符串 * @return double[]{ 经度,纬度 } */ public static do...

    地址解析与反地址解析(谷歌)

    地址解析

    /**

            * 根据地址获取对应的经纬度

            *

            * @param address

            *                地址字符串

            * @return double[]{ 经度,纬度 }

            */

           public static double[] getLocationInfo(final String address) {

                  FutureTask<double[]> task = new FutureTask<double[]>(new Callable<double[]>() {

                         @Override

                         public double[] call() throws Exception {

                                // 定义一个HttpClient,用于向指定地址发送请求

                                HttpClient client = new DefaultHttpClient();

                                // 向指定地址发送GET请求

                                HttpGet httpGet = new HttpGet("http://maps.google.com/maps/api/geocode/json?address=" + address + "&sensor=false");

                                // 用于模拟该请求的区域来自于简体中文环境,保证返回的响应为简体中文地址

                                httpGet.addHeader("Accept-Charset", "GBK;q=0.7,*;q=0.3");

                                httpGet.addHeader("Accept-Language", "zh-CN,zh;q=0.8");

                                StringBuilder sb = new StringBuilder();

                                // 获取服务器响应

                                HttpResponse response = client.execute(httpGet);

                                HttpEntity entity = response.getEntity();

                                // 获取服务器响应的字符串

                                InputStreamReader br = new InputStreamReader(entity.getContent(), "utf-8");

                                int b;

                                while ((b = br.read()) != -1) {

                                       sb.append((char) b);

                                }

                                // 将服务器返回的字符串转换为JSONobject对象

                                JSONObject jsonObject = new JSONObject(sb.toString());

                                // JSONObject对象中取出代表位置的location属性

                                JSONObject location = jsonObject.getJSONArray("results").getJSONObject(0).getJSONObject("geometry").getJSONObject("location");

                                // 获取经度信息

                                double longitude = location.getDouble("lng");

                                // 获取纬度信息

                                double latitude = location.getDouble("lat");

                                // 将经度、纬度信息组成double[]数组

                                return new double[] { longitude, latitude };

                         }

                  });

                  new Thread(task).start();

                  try {

                         return task.get();

                  } catch (Exception e) {

                         e.printStackTrace();

                  }

                  return null;

           }

     

    反地址解析

    /**

            * 根据经纬度获取对应的地址

            *

            * @param longitude

            *                经度

            * @param latitude

            *                纬度

            * @return

            */

           public static String getAddress(final double longitude, final double latitude) {

                  FutureTask<String> task = new FutureTask<String>(new Callable<String>() {

     

                         @Override

                         public String call() throws Exception {

                                // 定义一个HttpClient,用于向指定地址发送请求

                                HttpClient client = new DefaultHttpClient();

                                // 向指定地址发送GET请求

                                HttpGet httpGet = new HttpGet("http://maps.google.com/maps/api/geocode/json?latlng=" + latitude + "," + longitude

                                              + "&sensor=false");

                                // 用于模拟该请求的区域来自于简体中文环境,保证返回的响应为简体中文地址

                                httpGet.addHeader("Accept-Charset", "GBK;q=0.7,*;q=0.3");

                                httpGet.addHeader("Accept-Language", "zh-CN,zh;q=0.8");

                                StringBuilder sb = new StringBuilder();

                                // 执行请求

                                HttpResponse response = client.execute(httpGet);

                                HttpEntity entity = response.getEntity();

                                // 获取服务器响应的字符串

                                InputStreamReader br = new InputStreamReader(entity.getContent(), "utf-8");

                                int b;

                                while ((b = br.read()) != -1) {

                                       sb.append((char) b);

                                }

                                // 将服务器返回的字符串转换为JSONobject对象

                                JSONObject jsonObject = new JSONObject(sb.toString());

                                return jsonObject.getJSONArray("results").getJSONObject(0).getString("formatted_address");

                         }

                  });

                  new Thread(task).start();

                  try {

                         return task.get();

                  } catch (Exception e) {

                         e.printStackTrace();

                  }

                  return null;

           }

     





    附件列表

     

    转载于:https://www.cnblogs.com/jinke5245/p/3690847.html

    展开全文
  • /*** 界面效果1 实现定位到输入的地址,并且提示出地址的经纬度*/ 2.viewcontroller.h #import <UIKit/UIKit.h>#import <MapKit/MapKit.h>@interface ViewController : UIViewController@proper...

    1.导入系统框架

     

    /**
     *  界面效果1 实现定位到输入的地址,并且提示出地址的经纬度
     */

          

    2.viewcontroller.h

    #import <UIKit/UIKit.h>
    #import <MapKit/MapKit.h>
    @interface ViewController : UIViewController

    @property (strong, nonatomic) IBOutlet UISearchBar *searchBar;
    @property (strong, nonatomic) IBOutlet MKMapView *mapView;
    @property (strong, nonatomic) CLGeocoder *geoCoder;
    @end

    3.viewcontroller.m


    @interface ViewController ()<UISearchBarDelegate>

    @end

    @implementation ViewController

    - (void)viewDidLoad {
        [super viewDidLoad];
        self.geoCoder = [[CLGeocoder alloc]init];
        self.mapView.zoomEnabled = YES;
        self.mapView.rotateEnabled = NO;
        self.mapView.scrollEnabled = YES;
        self.mapView.showsUserLocation = YES;
        self.mapView.mapType = MKMapTypeStandard;
        self.searchBar.text = @"天安门";
        self.searchBar.delegate = self;
    }
    //点击搜索
    -(void)searchBarSearchButtonClicked:(UISearchBar *)searchBar
    {
        //调用searchBar方法进行搜索
        [self startSearch:searchBar];
    }
    //点击取消
    -(void)searchBarCancelButtonClicked:(UISearchBar *)searchBar
    {
        //调用searchBar方法进行搜索
        [self startSearch:searchBar];

    }
    //执行搜索
    -(void)startSearch:(UISearchBar *)searchBar
    {
        //关闭searchBar的虚拟键盘
        [self.searchBar resignFirstResponder];
        NSString *searchText = self.searchBar.text;
        if (searchText != nil && searchText.length>0) {
            [self locateAt:searchText];
        }
    }
    //输入文本时
    -(void)searchBarTextDidBeginEditing:(UISearchBar *)searchBar
    {
        //显示取消按钮
        searchBar.showsCancelButton = YES;
        //通过遍历找到取消按钮,并将取消按钮的文本设为搜索
        for (id cc in [searchBar.subviews[0]subviews]) {
            if ([cc isKindOfClass:[UIButton class]]) {
                UIButton *btn = (UIButton *)cc;
                [btn setTitle:@"搜索" forState:UIControlStateNormal];
            }
        }
    }
    //将字符串地址转换为经纬度,并执行定位
    -(void)locateAt:(NSString *)add
    {
        [self.geoCoder geocodeAddressString:add completionHandler:^(NSArray<CLPlacemark *> * _Nullable placemarks, NSError * _Nullable error) {
            if ([placemarks count]>0 && error == nil) {
                NSLog(@"搜索到匹配%lu条地址数据",(unsigned long)placemarks.count);
                //处理第一个地址
                CLPlacemark *placemark = [placemarks objectAtIndex:0];
                NSLog(@"经度 = :%f",placemark.location.coordinate.longitude);
                NSLog(@"纬度 = :%f",placemark.location.coordinate.latitude);
                NSLog(@"国家 = %@",placemark.country);
                NSLog(@"邮编 = %@",placemark.postalCode);
                NSLog(@"位置 = %@",placemark.locality);
                NSString *msg = [NSString stringWithFormat:@"经度 = %f,纬度 = %f",placemark.location.coordinate.longitude,placemark.location.coordinate.latitude];
                [[[UIAlertView alloc]initWithTitle:@"信息" message:msg delegate:self cancelButtonTitle:@"确定" otherButtonTitles:  nil]show];
                //设置地图显示的范围
                MKCoordinateSpan span;
                //地图显示范围越小,细节越清楚
                span.latitudeDelta = 0.0001;
                span.longitudeDelta = 0.0001;
                MKCoordinateRegion region = {placemark.location.coordinate,span};
                //设置地图中心位置为搜索到的位置
                [self.mapView setRegion:region];
                //创建一个,该对象将作为地图描点
                MKPointAnnotation *point = [[MKPointAnnotation alloc]init];
                //设置地图锚点的坐标
                point.coordinate = placemark.location.coordinate;
                //设置地图锚点的标题
                point.title = placemark.name;
                //设置地图锚点的副标题
                point.subtitle = [NSString stringWithFormat:@"%@-%@-%@-%@",placemark.country,placemark.administrativeArea,placemark.locality,placemark.subLocality ];
                //将地图锚点添加到地图上
                [self.mapView addAnnotation:point];
                //选中指定锚点
                [self.mapView selectAnnotation:point animated:YES];
            }
            else
            {
                NSLog(@"无搜索结果");
            }
        }];
    }

    @end

    /**
     *  界面效果2 点击界面1的解析按钮跳转到界面2

     *         实现输入地址,解析到经纬度

     *         输入经纬度,显示详细地址
     */

        

    4.界面2的.h

    #import <UIKit/UIKit.h>
    #import <MapKit/MapKit.h>
    @interface jieXiViewController : UIViewController
    @property (strong, nonatomic) IBOutlet UITextField *dizhijiexi;
    @property (strong, nonatomic) IBOutlet UITextField *jingdu;
    @property (strong, nonatomic) IBOutlet UITextField *weidu;
    @property (strong, nonatomic) IBOutlet UITextView *showTV;
    - (IBAction)jiexi:(id)sender;
    - (IBAction)fanjeixi:(id)sender;
    @property (strong, nonatomic) CLGeocoder* geocoder;
    @end
    5.界面2的.m


    @interface jieXiViewController ()

    @end

    @implementation jieXiViewController

    - (void)viewDidLoad {
        [super viewDidLoad];
        //创建地址解析器
        self.geocoder = [[CLGeocoder alloc]init];
    }

    - (IBAction)jiexi:(id)sender {
        // 获取用户输入的地址字符串
        NSString *inputAdd = self.dizhijiexi.text;
        if (inputAdd != nil && inputAdd.length>0) {
            [self.geocoder geocodeAddressString:inputAdd completionHandler:^(NSArray<CLPlacemark *> * _Nullable placemarks, NSError * _Nullable error) {
                // 如果解析结果的集合元素的个数大于1,表明解析得到了经度、纬度信息
                if (placemarks.count > 0)
                {
                    // 只处理第一个解析结果,实际项目中可使用列表让用户选择
                    CLPlacemark* placemark = placemarks[0];
                    CLLocation* location = placemark.location;
                    self.showTV.text = [NSString stringWithFormat:
                                            @"%@的经度为:%g,纬度为:%g" , inputAdd ,
                                            location.coordinate.longitude ,
                                            location.coordinate.latitude ];
                }
                // 没有得到解析结果。
                else
                {
                    // 使用UIAlertView提醒用户
                    [[[UIAlertView alloc] initWithTitle:@"提醒"
                                                message:@"您输入的地址无法解析" delegate:nil
                                      cancelButtonTitle:@"确定" otherButtonTitles: nil]
                     show];
                }
     
            }];
        }
    }

    - (IBAction)fanjeixi:(id)sender {
        
        NSString* longitudeStr = self.jingdu.text;
        NSString* latitudeStr = self.weidu.text;
        if(longitudeStr != nil && longitudeStr.length > 0
           && latitudeStr != nil && latitudeStr.length > 0)
        {
            // 将用户输入的经度、纬度封装成CLLocation对象
            CLLocation* location = [[CLLocation alloc]
                                    initWithLatitude:[latitudeStr floatValue]
                                    longitude:[longitudeStr floatValue]];
            [self.geocoder reverseGeocodeLocation:location completionHandler:
             ^(NSArray *placemarks, NSError *error)
             {
                 // 如果解析结果的集合元素的个数大于1,表明解析得到了经度、纬度信息
                 if (placemarks.count > 0)
                 {
                     // 只处理第一个解析结果,实际项目可使用列表让用户选择
                     CLPlacemark* placemark = placemarks[0];
                     // 获取详细地址信息
                     NSArray* addrArray = [placemark.addressDictionary
                                           objectForKey:@"FormattedAddressLines"];
                     // 将详细地址拼接成一个字符串
                     NSMutableString* addr = [[NSMutableString alloc] init];
                     for(int i = 0 ; i < addrArray.count ; i ++)
                     {
                         [addr appendString:addrArray[i]];
                     }
                     self.showTV.text = [NSString stringWithFormat:
                                             @"经度:%g,纬度:%g的地址为:%@" ,
                                             location.coordinate.longitude ,
                                             location.coordinate.latitude , addr];
                 }
                 // 没有得到解析结果。
                 else
                 {
                     // 使用UIAlertView提醒用户
                     [[[UIAlertView alloc] initWithTitle:@"提醒"
                                                 message:@"您输入的地址无法解析" delegate:nil
                                       cancelButtonTitle:@"确定" otherButtonTitles: nil]
                      show];
                 }
             }];
        }
    }
    -(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
    {
        [self.view endEditing:YES];
    }
    @end

     

    转载于:https://www.cnblogs.com/Bo-tree/p/5095264.html

    展开全文
  • 批量反地址解析商圈

    2020-09-10 22:11:10
    <!DOCTYPE html> <html> <head> <...批量反地址解析商圈</title> <script type="text/javascript" src="http://api.map.baidu.com/api?v=1.3"></script> &
  • 摘要:  什么是地址解析?  什么是反地址解析?  如何运用地址解析,和反地址解析?  可以同时运用地址解析,和反地址解析麼?答案是,可以的。详见最后一个示例与代码。 ------------
  • Google 地理信息反解析

    千次阅读 2015-01-28 11:41:08
    Android 为地址反解析提供了标准的api 方案,但该方案并不是android sdk的一部分。手机用户要想 正常使用该功能,手机上必须安装 google map。但国内没有厂家默认内置google map, 手机用户也不可能 自动安装。反...
  • CLGeocoder反解析用户的地址

    千次阅读 2013-01-29 18:31:39
    //反解析 [geoCoder reverseGeocodeLocation:mycurLocaton completionHandler:^(NSArray *places,NSError *error){ CLPlacemark *aPlace=[places objectAtIndex:0]; if (aPlace.name==nil) { [lab_Area setText...
  • 【百度地图API】批量地址解析与批量反地址解析(带商圈数据) 原文:【百度地图API】批量地址解析与批量反地址解析(带商圈数据)摘要:因为地址解析的webserives方式还没有开通,所以先用JS版本的地址...
  • 地址解析 def geocoder(address, city= ' 北京市 ' ): query_args = { ' address ' :address, ' city ' :city, ' output ' : ' xml ' , ' ak ' :ak} encoded_args = urllib.urlencode(query_args) ...
  • 【百度地图API】如何进行地址解析反地址解析?——模糊地址能搜索到精确地理信息! 原文:【百度地图API】如何进行地址解析反地址解析?——模糊地址能搜索到精确地理信息!摘要:  什么是地址...
  • 根据经纬度反地址解析

    千次阅读 2016-11-04 23:30:44
    //lng,lat为要反解析地址的经纬度 var pont = new BMap.Point(lng,lat) function bdGEO(){ var pt = pont; geocodeSearch(pt); } function geocodeSearch(pt){ myGeo.getLocation(pt, function(rs){ ...
  • 首先,我们需要当用户输入具体接到地址后将具体街道的地址转化为经度和纬度,然后实现定位,因此,首先来讲解一下地址解析,百度地图API提供Geocode类进行地址解析,我们可以通过Geocoder.getPoint()方法将一段地址...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 754
精华内容 301
关键字:

地址反解析