通过地名获得经纬度并标识在地图上

[color=red]转载请注明出处[/color]

主要是调用Geocoder的getFromLocationName(),该方法可以传入地名。
在使用该方法前需要geo = new Geocoder(this, Locale.CHINA);
不然在地图上是查询不到的。

/**
*
*/
package com.decarta.demo;

import java.io.IOException;
import java.util.List;
import java.util.Locale;

import android.app.AlertDialog;
import android.app.Dialog;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Point;
import android.location.Address;
import android.location.Geocoder;
import android.os.Bundle;

import com.google.android.maps.GeoPoint;
import com.google.android.maps.MapActivity;
import com.google.android.maps.MapController;
import com.google.android.maps.MapView;
import com.google.android.maps.Overlay;
import com.google.android.maps.Projection;

/**
* @author Tony Shen
*
*/
public class Main extends MapActivity {

// 地图显示控制相关变量定义
private MapView map = null;
private MapController mapCon;
private Geocoder geo;

private static final int ERROR_DIALOG = 1;

/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);
setContentView(R.layout.main);
geo = new Geocoder(this, Locale.CHINA);
// 获取MapView
map = (MapView) findViewById(R.id.map);
// 设置显示模式
map.setTraffic(true);
map.setSatellite(false);
map.setStreetView(true);
// 设置可以缩放
map.setBuiltInZoomControls(true);

List<Address> addresses = null;
try {
addresses = geo.getFromLocationName("江苏省苏州市寒山寺", 1);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
if(addresses.size() == 0) {
showDialog(ERROR_DIALOG);
GeoPoint geoBeijing = new GeoPoint(
(int) (39.906033* 1000000),
(int) (116.397700 * 1000000));
mapCon = map.getController();
mapCon.setCenter(geoBeijing);
mapCon.setZoom(4);
} else {
Address address = addresses.get(0);
// 设置初始地图的中心位置
GeoPoint geoPoint = new GeoPoint(
(int) (address.getLatitude() * 1000000),
(int) (address.getLongitude() * 1000000));
mapCon = map.getController();
mapCon.setCenter(geoPoint);
mapCon.setZoom(16);
List<Overlay> overlays = this.map.getOverlays();
overlays.add(new PositionOverlay(geoPoint, this, R.drawable.ic_red_pin));
}
}

@Override
protected boolean isRouteDisplayed() {
return false;
}

@Override
protected Dialog onCreateDialog(int id) {
return new AlertDialog.Builder(this).setTitle("查询出错哦")
.setMessage("路名/地名出错,请重新输入!").create();
}

class PositionOverlay extends Overlay {
private GeoPoint geoPoint;
private Context context;
private int drawable;

public PositionOverlay(GeoPoint geoPoint, Context context, int drawable) {
super();
this.geoPoint = geoPoint;
this.context = context;
this.drawable = drawable;
}

@Override
public void draw(Canvas canvas, MapView mapView, boolean shadow) {

Projection projection = mapView.getProjection();
Point point = new Point();
projection.toPixels(geoPoint, point);

Bitmap bitmap = BitmapFactory.decodeResource(context.getResources(),
drawable);
canvas.drawBitmap(bitmap, point.x-bitmap.getWidth()/2 , point.y-bitmap.getHeight(), null);
super.draw(canvas, mapView, shadow);
}
}
}


效果图如下:

[img]http://dl.iteye.com/upload/attachment/333860/19802f0b-82f0-33cc-9d53-d45a5b7b27a9.png[/img]

程序就这么简单,作为demo我把地名写死了
在Java中,如果你想离线根据经纬度获取地名,通常会使用一些地理编码库,比如GeoTools、Apache Commons Geode或者Google的Geocoding API(现在更推荐的是OpenStreetMap Nominatim服务,它提供免费且离线可用的地理编码)。不过请注意,由于需要处理地理位置数据,这些操作通常涉及到网络请求,尽管可以在本地缓存结果来提高效率,但是完全离线的情况比较少见,因为地图数据库和地址信息通常是实时更新的。 下面是一个简单的例子,假设你有一个存储了经纬度地名映射文件: ```java import java.io.BufferedReader; import java.io.FileReader; import java.util.HashMap; import java.util.Map; public class OfflineGeocoding { private static final Map<String, String> map = loadOfflineDatabase(); // 假设loadOfflineDatabase()从本地文件加载地名数据 public static String getPlaceFromCoordinates(double latitude, double longitude) { String key = Double.toString(latitude) + "," + Double.toString(longitude); return map.getOrDefault(key, "Unknown Location"); } private static Map<String, String> loadOfflineDatabase() { Map<String, String> result = new HashMap<>(); try (BufferedReader br = new BufferedReader(new FileReader("geocodes.txt"))) { String line; while ((line = br.readLine()) != null) { String[] parts = line.split(","); if (parts.length == 2) { result.put(parts[0], parts[1]); } } } catch (Exception e) { e.printStackTrace(); } return result; } } ``` 在这个示例中,`loadOfflineDatabase()`函数假定存在一个名为"geocodes.txt"的文件,其中包含经纬度对,每行一个,如"51.5074,0.1278,伦敦"。当离线获取地名时,通过计算经纬度的字符串形式作为键(key),从预加载的map中查找对应的结果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值