自定义POI点,根据搜索半径进行POI搜索
2014-01-23 14:34
357 查看
接上一篇,即经纬度坐标文件已导入
最近这一个月才开始学习Java,所以拿到这个问题时从最基本的功能实现做起:
1. 实现txt文件的存入和读出;
2. 实现已知两点经纬度算出两点间距离;(这一步为了简单是把所有值存入数组做的)
3. 实现读入一组值就计算一组值;
MainActivity.java 文件代码
activity_main.xml 文件代码
最近这一个月才开始学习Java,所以拿到这个问题时从最基本的功能实现做起:
1. 实现txt文件的存入和读出;
2. 实现已知两点经纬度算出两点间距离;(这一步为了简单是把所有值存入数组做的)
3. 实现读入一组值就计算一组值;
MainActivity.java 文件代码
package com.example.distance; import java.io.BufferedReader; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStreamReader; import android.os.Bundle; import android.os.SystemClock; import android.R.integer; import android.R.string; import android.annotation.SuppressLint; import android.app.Activity; import android.util.Log; import android.view.Menu; import android.view.View; import android.widget.Button; import android.widget.EditText; public class MainActivity extends Activity { @SuppressLint("SdCardPath") String filepath = "/mnt/sdcard/android_txt1.txt"; //注意EditText初始化不要写在这里,会报unable to instantiate activity componentinfo nullpointerexception 错误 //EditText distanceEditText = (EditText)findViewById(R.id.distance); //EditText displaypoiText = (EditText)findViewById(R.id.displaypoi); //中心点 景山公园 double lat1 = 39.932221; double lon1 = 116.403007; String s1 = ""; //中心点 double lats = (Math.PI/180)*lat1; double lons = (Math.PI/180)*lon1; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Log.i("onCreat", "set"); } private void getpoi(double s,int i) { // TODO Auto-generated method stub String s2[] = {"北海","故宫博物院","东城区政府"}; //比较计算出的两点间距离和用户输入的搜索半径 EditText distanceEditText = (EditText)findViewById(R.id.distance); double searchdistance = Double.parseDouble(distanceEditText.getText().toString()); if (s < searchdistance) { s1=s1+s2[i]+'\t'+Double.toString(s)+'\t'; } } private double getdistance(double lon, double lat) { // TODO Auto-generated method stub //传入待计算的点 double latd = (Math.PI/180)*lat; double lond = (Math.PI/180)*lon; double a = lats-latd; double b = lons-lond; //地球半径 double R = 6378.137; //已知两点经纬度计算距离的公式 double s = 2 * Math.asin(Math.sqrt(Math.pow(Math.sin(a/2),2) + Math.cos(lats)*Math.cos(latd)*Math.pow(Math.sin(b/2),2))); s=s*R; s= s*1000; return s; } private void readF1(String filePath) throws IOException{ // TODO Auto-generated method stub BufferedReader br = new BufferedReader(new InputStreamReader( new FileInputStream(filepath))); int i =0; double d1,d2,spoi; String s1=""; for (String line = br.readLine(); line != null; line = br.readLine()) { //因为txt文件中经纬度是按行写的,所以这里按行读出 d1= Double.parseDouble(line); line = br.readLine(); d2= Double.parseDouble(line); spoi = getdistance(d1, d2); getpoi(spoi, i); i++; Log.i("d1",Double.toString(d1) ); Log.i("d2", Double.toString(d2)); } br.close(); } public void beginsearch(View v) { EditText displaypoiText = (EditText)findViewById(R.id.displaypoi); try { readF1(filepath); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } if (s1=="") { displaypoiText.setText("未找到结果"); } else { displaypoiText.setText(s1);} s1= ""; } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.main, menu); return true; } }
activity_main.xml 文件代码
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" tools:context=".MainActivity" > <!-- 搜索后text会被替换掉 --> <EditText android:id="@+id/displaypoi" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentLeft="true" android:layout_below="@+id/distance" android:layout_marginTop="27dp" android:cursorVisible="true" android:editable="true" android:ems="10" android:text="正在查找" /> <!-- 设定搜索半径 --> <EditText android:id="@+id/distance" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentLeft="true" android:layout_marginTop="32dp" android:cursorVisible="true" android:editable="true" android:ems="10" android:text="1000" /> </RelativeLayout>
相关文章推荐
- Lucene根据字段进行自定义搜索扩展
- Android开发实现选择城市界面,可根据拼音、首字母进行搜索
- 【“零起点”--百度地图手机SDK】如何进行三种POI搜索?
- 程序员面试金典——解题总结: 9.18高难度题 18.8给定一个字符串s和一个包含较短字符串的数组T,设计一个方法,根据T中的每一个较短字符串,对s进行搜索
- 【百度地图API】如何根据摩卡托坐标进行POI查询,和计算两点距离
- Lucene实战(三)多Field搜索,并且对搜索结果进行过滤和[自定义]排序
- 使用GeoHash解决根据经纬度和区域半径搜索商家
- 【“零起点”--百度地图手机SDK】如何进行三种POI搜索?
- autocomplete根据输入字符进行搜索
- 自定义之一个图片根据另一个图片形状进行裁剪
- js代码实现根据实际物理地址,进行 URL 跳转,并实现用户自定义 URL 跳转
- js代码实现根据实际物理地址,进行 URL 跳转,并实现用户自定义 URL 跳转
- poi-tl实现自定义RenderPolicy实现对表格进行列表
- 指定关键词,在一段文本中搜索并在关键词前后进行插入自定义字符串
- 小白和你一起做“根据公交线路的id对公交的详细信息进行搜索”也就是找公交线路
- Java编程之TreeSet排序两种解决方法(1)元素自身具备比较功能,元素需要实现Comparable接口覆盖compare(2)创建根据自定义Person类的name进行排序的Comparator
- postgresql根据指定序列进行自定义排序
- HashMap中的对象根据成员进行自定义排序
- java基于poi的excel表格处理(自定义注解、针对List与enum进行处理)
- struts2 在拦截器进行注入(根据Action是否实现自定义接口)