高德地图六:地址解析与逆地址解析

高德地图六:地址解析与逆地址解析

无论是百度LBS开放平台,还是高德LBS开放平台,其调用量最高的接口,必然是定位,其次就是地址解析了,又称为地理编码。地址解析,就是将地址转换为经纬度。而逆地址解析,就是将经纬度转换为地址。经纬度一般是由专业测绘机构用GPS采集,然后使用国测局接口加密,最后呈现在互联网地图上的。而地址,这里说的是结构化的带街道门牌号的地址,比如“北京市朝阳区阜通东大街6号”,这个地址是由公安局颁发的。而将地址和经纬度一一对应起来,这个就是高德地图做的事情了,也就是地址解析接口的功能了。地址解析功能,实用性强,调用频次高

实例效果图:、
在这里插入图片描述

代码实现

layout/activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<LinearLayout
    android:orientation="horizontal"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:gravity="center_horizontal">
    <TextView
        android:text="地址:"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"/>
    <!-- 定义输入地址的文本框 -->
    <EditText
        android:id="@+id/address"
        android:text="沣宏大厦"
        android:layout_width="180dp"
        android:layout_height="wrap_content" />
    <Button
        android:id="@+id/parse"
        android:text="解析"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_weight="4" />
</LinearLayout>
<LinearLayout
    android:orientation="horizontal"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:gravity="center_horizontal">
    <TextView
        android:text="经度:"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"/>
    <!-- 定义输入经度值的文本框 -->
    <EditText
        android:id="@+id/lng"
        android:text="113.396"
        android:layout_width="110dp"
        android:layout_height="wrap_content" />
    <TextView
        android:text="纬度:"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:paddingLeft="8dp" />
    <!-- 定义输入纬度值的文本框 -->
    <EditText
        android:id="@+id/lat"
        android:text="23.126"
        android:layout_width="110dp"
        android:layout_height="wrap_content" />
    <Button
        android:id="@+id/reverse"
        android:text="反向解析"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_weight="4" />
</LinearLayout>
<EditText
    android:id="@+id/result"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:gravity="top"
    android:editable="false"
    android:cursorVisible="false"/>

com/example/administrator/MainActivity.java

package com.example.administrator;

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;

import com.amap.api.services.core.LatLonPoint;
import com.amap.api.services.geocoder.GeocodeAddress;
import com.amap.api.services.geocoder.GeocodeQuery;
import com.amap.api.services.geocoder.GeocodeResult;
import com.amap.api.services.geocoder.GeocodeSearch;
import com.amap.api.services.geocoder.GeocodeSearch.OnGeocodeSearchListener;
import com.amap.api.services.geocoder.RegeocodeAddress;
import com.amap.api.services.geocoder.RegeocodeQuery;
import com.amap.api.services.geocoder.RegeocodeResult;


public class MainActivity extends Activity implements OnClickListener {
    Button parseBn, reverseBn;
    EditText etLng, etLat, etAddress, etResult;
    GeocodeSearch search;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        // 获取界面中的可视化组件
        parseBn = (Button) findViewById(R.id.parse);
        reverseBn = (Button) findViewById(R.id.reverse);
        etLng = (EditText) findViewById(R.id.lng);
        etLat = (EditText) findViewById(R.id.lat);
        etAddress = (EditText) findViewById(R.id.address);
        etResult = (EditText) findViewById(R.id.result);
        parseBn.setOnClickListener(this);
        reverseBn.setOnClickListener(this);
        // 创建GeocodeSearch对象
        search = new GeocodeSearch(this);
        // 设置解析监听器
        search.setOnGeocodeSearchListener(new OnGeocodeSearchListener() {
            @Override
            public void onRegeocodeSearched(RegeocodeResult regeocodeResult, int i) {
                RegeocodeAddress addr = regeocodeResult.getRegeocodeAddress();
                etResult.setText("经度:" + etLng.getText() + "、纬度:" + etLat.getText() + "的地址为:\n" + addr.getFormatAddress());
            }

            @Override
            public void onGeocodeSearched(GeocodeResult geocodeResult, int i) {
                GeocodeAddress addr = geocodeResult.getGeocodeAddressList().get(0);
                LatLonPoint latlng = addr.getLatLonPoint();
                etResult.setText(etAddress.getText() + "的经度是:" + latlng.getLongitude() + "、纬度是:" + latlng.getLatitude());
            }
        });
    }

    @Override
    public void onClick(View source) {
        switch (source.getId()) {
            // 单击了“解析”按钮
            case R.id.parse:
                String address = etAddress.getText().toString().trim();
                if (address.equals("")) {
                    Toast.makeText(this, "请输入有效的地址", Toast.LENGTH_LONG).show();
                } else {
                    GeocodeQuery query = new GeocodeQuery(address, "广州");
                    // 根据地理名称执行异步解析
                    search.getFromLocationNameAsyn(query);
                }
                break;
            // 单击了“反向解析”按钮
            case R.id.reverse:
                String lng = etLng.getText().toString().trim();
                String lat = etLat.getText().toString().trim();
                if (lng.equals("") || lat.equals("")) {
                    Toast.makeText(this, "请输入有效的经度、纬度!", Toast.LENGTH_LONG).show();
                } else {
                    // 根据经纬度执行异步查询
                    search.getFromLocationAsyn(new RegeocodeQuery(new LatLonPoint(Double.parseDouble(lat), Double.parseDouble(lng)), 20 // 区域半径
                            , GeocodeSearch.GPS));
                }
                break;
        }
    }
}
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值