雅虎财经api_带有Yahoo API的Android反向地理编码– PlaceFinder
雅虎财经api
在我之前的教程( 基于Android的基于位置的服务应用程序– GPS位置 )中,我向您展示了如何以经度和纬度坐标的形式检索用户的当前位置。 使用这些坐标,我们将提供有关用户位置的信息。 例如,我们将查找最接近特定点的街道地址。 该过程被称为反向地理编码 ,它是的逆过程地理编码 ,其中涉及找到相关联的地理坐标从其他地理数据,例如街道地址(通常表示为纬度和经度),或邮政编码(邮政代码)。
为此,我们将使用Yahoo!。 PlaceFinder,一个超酷的API,用于地理编码和反向地理编码。 从官方网站 :
“雅虎! PlaceFinder是一种地理编码Web服务,可通过将街道地址或地名转换为地理坐标(反之亦然)来帮助开发人员使其应用程序感知位置。”
为了使用API,您将需要一个密钥 (完全免费)。 但是,出于本教程的目的,不需要密钥。 我们将使用此处可以到达的示例请求。 响应为XML格式,因此将需要XML解析器。 不过请不要担心,因为Android在其核心API中包含了XML功能。
还要注意的另一件事是,PlaceFinder是一个Web API,因此,要被Android应用程序使用,该设备必须连接到……网络。 此外,我们的应用程序必须使用HTTP客户端。 同样,请不要担心,因为Android API为此包含了Apache的HTTP客户端 。
因此,让我们开始吧。 我们将从上一教程的开头继续。 如果您还没有阅读过,请检查一下。 您可以从此处下载Eclipse项目。
首先,我们添加一个新的Button ,它将触发反向地理编码过程。 因此,用于用户界面的“ 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="fill_parent"android:layout_height="fill_parent">
<Buttonandroid:id="@+id/retrieve_location_button" android:text="Retrieve Location"android:layout_width="wrap_content" android:layout_height="wrap_content" />
<Button android:id="@+id/reverse_geocoding_button" android:text="Reverse Geocoding"android:layout_width="wrap_content" android:layout_height="wrap_content" />
</LinearLayout>
新按钮与OnClickListener挂钩 ,当单击它时,将调用“ performReverseGeocodingInBackground”方法。 在该方法中,将检索当前位置(如上一教程中所示)。 为了存储用户的最新已知位置,使用了名为“ currentLocation”的Location实例对象。 然后,开始反向地理编码过程。
请注意,该操作将在后台进行,这意味着它将在除主UI线程之外的其他线程中执行。 这是因为Android在响应性问题上非常敏感。 从Internet上获取数据可能是一项耗时的操作,并且我们不想在HTTP客户端等待数据下载时暂停主线程。 还要注意,将主线程UI停顿五秒钟以上将触发“应用程序无响应”(ANR)对话框,在该对话框中,用户有机会杀死您的应用程序。 不是很好。
因此,我们将利用Android API在新线程中执行数据检索操作。 我们将使用的类扩展了AsyncTask,并将其命名为“ ReverseGeocodeLookupTask”。 在官方文档页面上,“ AsyncTask支持正确轻松地使用UI线程。 该类允许执行后台操作并在UI线程上发布结果,而无需操纵线程和/或处理程序。
我们将覆盖三种方法。 首先, onPreExecute ,它出现在主线程中,通常用于初始化目的。 在我们的实现中,我们使用ProgressDialog小部件让用户知道正在执行某些操作。 其次, 返回doInBackground方法,该方法在后台线程上执行计算,并返回结果对象(由此任务的子类定义)。 在我们的实现中,将检索和解析XML数据(稍后我将向您展示),然后我们传回一个名为“ GeoCodeResult”的域模型类,该类是位置数据的占位符。 第三, onPostExecute ,它也运行在UI线程上,用于清理目的。 在我们的案例中,取消了ProgressDialog ,并且Toast通知将检索到的数据呈现给用户。 结合以上所有内容,我们主要活动的代码如下:
package com.javacodegeeks.android.lbs;import android.app.Activity;
import android.app.ProgressDialog;
import android.content.Context;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.AsyncTask;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.Toast;import com.javacodegeeks.android.lbs.model.GeoCodeResult;
import com.javacodegeeks.android.lbs.services.GeoCoder;public class LbsGeocodingActivity extends Activity {private static final long MINIMUM_DISTANCE_CHANGE_FOR_UPDATES = 1; // in Metersprivate static final long MINIMUM_TIME_BETWEEN_UPDATES = 1000; // in Millisecondsprivate GeoCoder geoCoder = new GeoCoder();protected LocationManager locationManager;protected Location currentLocation;protected Button retrieveLocationButton;protected Button reverseGeocodingButton;@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.main);retrieveLocationButton = (Button) findViewById(R.id.retrieve_location_button);reverseGeocodingButton = (Button) findViewById(R.id.reverse_geocoding_button);locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, MINIMUM_TIME_BETWEEN_UPDATES, MINIMUM_DISTANCE_CHANGE_FOR_UPDATES,new MyLocationListener());retrieveLocationButton.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {showCurrentLocation();}});reverseGeocodingButton.setOnClickListener(new OnClickListener() { @Overridepublic void onClick(View v) { performReverseGeocodingInBackground();}});} protected void performReverseGeocodingInBackground() {showCurrentLocation();new ReverseGeocodeLookupTask().execute((Void[])null);}protected void showCurrentLocation() {currentLocation = locationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER);if (currentLocation != null) {String message = String.format("Current Location \n Longitude: %1$s \n Latitude: %2$s",currentLocation.getLongitude(), currentLocation.getLatitude());Toast.makeText(LbsGeocodingActivity.this, message,Toast.LENGTH_LONG).show();}} private class MyLocationListener implements LocationListener {public void onLocationChanged(Location location) {String message = String.format("New Location \n Longitude: %1$s \n Latitude: %2$s",location.getLongitude(), location.getLatitude());Toast.makeText(LbsGeocodingActivity.this, message, Toast.LENGTH_LONG).show();}public void onStatusChanged(String s, int i, Bundle b) {Toast.makeText(LbsGeocodingActivity.this, "Provider status changed",Toast.LENGTH_LONG).show();}public void onProviderDisabled(String s) {Toast.makeText(LbsGeocodingActivity.this,"Provider disabled by the user. GPS turned off",Toast.LENGTH_LONG).show();}public void onProviderEnabled(String s) {Toast.makeText(LbsGeocodingActivity.this,"Provider enabled by the user. GPS turned on",Toast.LENGTH_LONG).show();}}public class ReverseGeocodeLookupTask extends AsyncTask <Void, Void, GeoCodeResult> {private ProgressDialog progressDialog;@Overrideprotected void onPreExecute() {this.progressDialog = ProgressDialog.show(LbsGeocodingActivity.this,"Please wait...contacting Yahoo!", // title"Requesting reverse geocode lookup", // messagetrue // indeterminate);}@Overrideprotected GeoCodeResult doInBackground(Void... params) {return geoCoder.reverseGeoCode(currentLocation.getLatitude(), currentLocation.getLongitude());}@Overrideprotected void onPostExecute(GeoCodeResult result) {this.progressDialog.cancel();Toast.makeText(LbsGeocodingActivity.this, result.toString(), Toast.LENGTH_LONG).show(); }}}
为了使事情简单并分离应用程序的关注点,我们将使用多个小类。 主要活动使用GeoCoder服务,这是我们使用Yahoo API的自定义实现。 该类的代码如下:
package com.javacodegeeks.android.lbs.services;import com.javacodegeeks.android.lbs.model.GeoCodeResult;public class GeoCoder {private static final String YAHOO_API_BASE_URL = "http://where.yahooapis.com/geocode?q=%1$s,+%2$s&gflags=R&appid=[yourappidhere]";private HttpRetriever httpRetriever = new HttpRetriever();private XmlParser xmlParser = new XmlParser();public GeoCodeResult reverseGeoCode(double latitude, double longitude) {String url = String.format(YAHOO_API_BASE_URL, String.valueOf(latitude), String.valueOf(longitude)); String response = httpRetriever.retrieve(url);return xmlParser.parseXmlResponse(response);}}
稍后将描述名为GeoCodeResult的模型对象类。 GeoCoder服务使用其他两个服务。
首先,我们有一个“ HttpRetriever”类,该类使用Apache HTTP客户端API来执行GET请求并从Yahoo API URL检索数据。 代码如下:
package com.javacodegeeks.android.lbs.services;import java.io.IOException;import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.util.EntityUtils;import android.util.Log;public class HttpRetriever {private final String TAG = getClass().getSimpleName();private DefaultHttpClient client = new DefaultHttpClient();public String retrieve(String url) {HttpGet get = new HttpGet(url);try {HttpResponse getResponse = client.execute(get);HttpEntity getResponseEntity = getResponse.getEntity();if (getResponseEntity != null) {String response = EntityUtils.toString(getResponseEntity);Log.d(TAG, response);return response;}} catch (IOException e) {e.printStackTrace();}return null;}}
简单的东西在这里。 DefaultHttpClient实例用于HTTP请求。 HttpGet用于表示GET请求,并作为参数传递给客户端的execute方法。 结果(在成功的操作中)将获得HttpResponse,并从中获得HttpEntity对象。 最后,使用EntityUtils帮助器类将响应转换为String,并将该响应返回给调用方。 请注意,尚未实现对失败操作的控制,如果您想要更强大的功能,请注意这一点。
考试的下一项服务是“ XmlParser”类。 这使用现有的DOM操作类来执行XML响应的解析。 从API的响应( 此处为示例),我们将仅使用ResultSet / Result元素的“ line1”-“ line4”节点。 该实现是一种典型的DOM,因此我将不涉及很多细节。 这是代码:
package com.javacodegeeks.android.lbs.services;import java.io.StringReader;import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;import org.w3c.dom.Document;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.InputSource;import android.util.Log;import com.javacodegeeks.android.lbs.model.GeoCodeResult;public class XmlParser {private final String TAG = getClass().getSimpleName();public GeoCodeResult parseXmlResponse(String response) {try {DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();DocumentBuilder db = dbf.newDocumentBuilder();Document doc = db.parse(new InputSource(new StringReader(response)));NodeList resultNodes = doc.getElementsByTagName("Result"); Node resultNode = resultNodes.item(0); NodeList attrsList = resultNode.getChildNodes();GeoCodeResult result = new GeoCodeResult();for (int i=0; i < attrsList.getLength(); i++) {Node node = attrsList.item(i); Node firstChild = node.getFirstChild();if ("line1".equalsIgnoreCase(node.getNodeName()) && firstChild!=null) {result.line1 = firstChild.getNodeValue();}if ("line2".equalsIgnoreCase(node.getNodeName()) && firstChild!=null) {result.line2 = firstChild.getNodeValue();}if ("line3".equalsIgnoreCase(node.getNodeName()) && firstChild!=null) {result.line3 = firstChild.getNodeValue();}if ("line4".equalsIgnoreCase(node.getNodeName()) && firstChild!=null) {result.line4 = firstChild.getNodeValue();}}Log.d(TAG, result.toString());return result;}catch (Exception e) {e.printStackTrace();}return null;}}
简而言之,我们从根元素开始,向下移动到“结果”节点,然后获得该节点的所有子节点。 从这些中,我们使用getNodeName方法来筛选我们关心的元素,最后使用针对节点的第一个子节点执行的getNodeValue方法来检索节点值。 相应地填充模型类,然后返回。 该类的代码是:
package com.javacodegeeks.android.lbs.model;public class GeoCodeResult {public String line1;public String line2;public String line3;public String line4;@Overridepublic String toString() {StringBuilder builder = new StringBuilder();builder.append("Location:");if (line1!=null)builder.append("-"+line1);if (line2!=null)builder.append("-"+line2);if (line3!=null)builder.append("-"+line3);if (line4!=null)builder.append("-"+line4);return builder.toString();}}
最后一步是添加访问Internet所需的权限,即“ android.permission.INTERNET ”。 使用已经创建的 “运行配置”启动仿真器。 转到DDMS视图,然后将坐标设置为已知位置。 我使用了PlaceFinder 示例请求所使用的请求 ,以确保将生成有效的响应。 点击“发送”以更新用户的最后一个已知位置,然后单击我们应用程序的“反向地理编码”按钮。 首先,出现进度对话框,向我们通知发生的后台操作。 从API响应中检索并提取数据后,将显示Toast,让我们知道当前地址是什么,如下所示: 而已! 现在,您可以构建您的位置感知应用程序,并使用Android模拟器对其进行测试。 您可以在这里找到Eclipse项目的新版本。 快乐的手机编码!!!
- “ Android完整应用程序教程”系列
- Android文字转语音应用
- Android基于位置的服务应用程序– GPS位置
- 使用VirtualBox在PC上安装Android OS
- 拥抱Android的强大功能:快速概览
翻译自: https://www.javacodegeeks.com/2010/09/android-reverse-geocoding-yahoo-api.html
雅虎财经api
雅虎财经api_带有Yahoo API的Android反向地理编码– PlaceFinder相关推荐
- android谷歌反地理,Android反向地理编码显示不出来!
我用google 的Geocoding API 接口来处理反向地理编码 ,但是运行时是空白界面,显示不出位置 下面是代码 ,请告诉我怎么办 public class MainActivity ext ...
- 使用Python进行地理编码和反向地理编码
Geocoding is the process of taking input text, such as an address or the name of a place, and return ...
- Google Geocoding API---地理编码与反向地理编码
什么是地理编码 地理编码是将地址(如"1600 Amphitheatre Parkway, Mountain View, CA")转换为地理坐标(如纬度 37.423021 和经度 ...
- 谷歌地图JavaScript API第3版 地理编码服务
地理编码服务 概观 地理编码请求 地理编码响应 地理编码结果 地址组件类型 状态代码 反向地理编码 视口偏置 区码偏置 概观 地理编码地址(如"1600剧场百汇,山景,CA")转换 ...
- Elasticsearch:使用反向地理编码在地图上显示自定义区域统计数据
在实际的许多应用中,我们可能并不一定按照行政区来进行划分区域,比如我们常说江浙一代,我们可以理解江苏和浙江这两个省合在一起,而不是把它们分开.我们有时也说长江三角区,它可能是跨几个省市的一个区域,而不 ...
- 面向初学者的带有MVC API的Android 管理表CRUD MSSQL
目录 介绍 在Android中使用API进行表CRUD 屏幕截图示例 第一节 结论 介绍 我的上一篇文章面向初学者的带MVC API的Angular Js Table CRUD MSSQL和使用S ...
- python调用百度地图画轨迹图_[python]百度地图API,正/逆地理编码,路线规划接口的调用,实现输出出行的距离和......
[Python] 纯文本查看 复制代码''' 文件名:L17.py 作者:小饭团 创建时间:2019年1月11日15:17:03 文件描述:调用Web服务API接口,百度地图路线规划 正/逆地理编码 ...
- python调用百度地图实现导航pc_[python]百度地图API,正/逆地理编码,路线规划接口的调用,实现输出出行的距离和......
[Python] 纯文本查看 复制代码''' 文件名:L17.py 作者:小饭团 创建时间:2019年1月11日15:17:03 文件描述:调用Web服务API接口,百度地图路线规划 正/逆地理编码 ...
- python调用百度地图api定位_逆地理编码 rgc 反geo检索 | 百度地图API SDK
使用方法 如不访问境外POI,走以下服务使用流程 编码说明 API请求中需要用到中文或一些特殊字符的参数,如query.region等,为了避免提交到后台乱码,需要对这几个参数值进行编码处理,转换成U ...
最新文章
- Java 调用Oracle的存储过程
- XenApp_XenDesktop_7.6实战篇之十五:StoreFront的配置
- java bigdecimal语法_JAVA BigDecimal 小数点处理
- 给定有权无向图的邻接矩阵如下,求其最小生成树的总权重,代码。
- 深度剖析数据库国产化迁移之路
- java 图片旋转 翻转 镜像处理_Java OpenCV实现图像镜像翻转效果
- Python+socket完美实现TCP长连接保持存活
- 华为光伏usb适配器_华为P40无线充电手机壳拆解:1款配件补上22.5W无线快充
- SpringBoot启动流程原理+自动装配原理
- xml 解析库 msxml6.dll
- 【详解】为何三元一次方程可以表示一个平面
- 人工智能-----自然语言处理(NLP)基础理解
- 音视频技术开发周刊 | 247
- Java面向对象高级部分——通过Class类实例化对象(五十二)
- ACAD DWG to PDF Converter 9.8.2.4版本更新啦
- L9110 L9110S SOP8 马达驱动 IC 芯片 H桥全桥 贴片
- 非线性控制理论与模型预测控制MPC-知识总结
- 数据安全特点有哪些?现在企业如何保障数据安全?
- java-php-python-ssm旅游产品网络销售系统计算机毕业设计
- 如何用PowerBI做损益计算书