在我的一项活动中,我需要能够进行地理编码(通过地址字符串搜索查找位置)。问题是我的结果太宽泛了。当我搜索“麦当劳”时,我会得到美国不同地区的结果。我怎样才能使用户可以搜索附近的餐馆(或任何位置)并且结果将在一定距离内?我的应用程序基本上需要更精确的结果。这是正在发生的事情的屏幕截图:
public class MainActivity extends MapActivity {
HelloItemizedOverlay itemizedOverlay;
List<Overlay> mapOverlays;
Drawable drawable;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
MapView myMap = (MapView) findViewById(R.id.mapview);
myMap.setBuiltInZoomControls(true);
MapController mc = myMap.getController();
mapOverlays = myMap.getOverlays();
drawable = this.getResources().getDrawable(R.drawable.androidmarker);
itemizedOverlay = new HelloItemizedOverlay(drawable, this);
//geopoints are cordinates in microdegrees or degrees * E6
GeoPoint point = new GeoPoint(34730300, -86586100);
//GeoPoint point2 = locatePlace("texas", mc); //HelloItemizedOverlay.locatePlace("Texas", mc, myMap);
//overlayitems are items that show the point of location to the user
OverlayItem overlayitem = new OverlayItem(point, "Hola, Mundo!", "im in huntsville");
//OverlayItem overlayitem2 = new OverlayItem(point2, "Texas", "hi");
//itemizedoverlay is used here to add a drawable to each of the points
itemizedOverlay.addOverlay(overlayitem);
//itemizedOverlay.addOverlay(overlayitem2);
//this adds the drawable to the map
//this method converts the search address to locations on the map and then finds however many you wish to see.
locatePlace("mcdonalds", mc, 5);
mapOverlays.add(itemizedOverlay);
//this animates to the point desired (i plan on having "point" = current location of the user)
mc.animateTo(point);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.activity_main, menu);
return true;
}
@Override
protected boolean isRouteDisplayed(){
return false;
}
public void locatePlace(String locName, MapController mc, int numberToDisplay)
{ // code to make the google search via string work
// i use the Geocoder class is used to handle geocoding and reverse-geocoding. So make an instance of this class to work with the methods included
Geocoder geoCoder1 = new Geocoder(this, Locale.getDefault());
try {
List<Address> searchAddresses = geoCoder1.getFromLocationName(locName, numberToDisplay); // gets a max of 5 locations
if (searchAddresses.size() > 0)
{
//iterate through using an iterator loop (for loop would have been fine too)
//Iterator<Address> iterator1 = searchAddresses.iterator();
for (int i=0; i < searchAddresses.size(); i++){
//while (iterator1.hasNext()){
//step1 get a geopoint
GeoPoint tempGeoP = new GeoPoint( (int) (searchAddresses.get(i).getLatitude()*1E6), (int) (searchAddresses.get(i).getLongitude()*1E6) );
//step2 add the geopoint to the Overlay item
OverlayItem tempOverlayItm = new OverlayItem(tempGeoP, locName, "this is " + locName);
//step3 add the overlay item to the itemized overlay
HelloItemizedOverlay tempItemizedOverlay = new HelloItemizedOverlay(drawable, this); // its breakking here.........
tempItemizedOverlay.addOverlay(tempOverlayItm);
//the itemized overlay is added to the map Overlay
mapOverlays.add(tempItemizedOverlay);
}
}
} catch (IOException e)
{
e.printStackTrace();
// Log.e("the error", "something went wrong: "+ e);
}//finally {}
}
}
// 这里是 Itemized 覆盖类的重要代码
public HelloItemizedOverlay(Drawable defaultMarker, Context context)
{
super(boundCenter(defaultMarker));
myContext = context;
}
public void addOverlay(OverlayItem overlay){
mOverlays.add(overlay);
populate();
}
谢谢,亚当
以下是根据 Vishwa 的评论调整后的一些代码:
// these 2 variables are my current location
latitudeCurrent = 34730300; // make this dynamic later
longitudeCurrent = -86586100; // make this dynamic later
LLlatitude = (latitudeCurrent - 100000)/(1E6); //lowerleft latitude = original lat - (1)*degree/10
LLlongitude = (longitudeCurrent+ 100000)/(1E6);//lowerleft longitude = original longitude - (1)*degree/10
URlatitude = (latitudeCurrent + 100000)/(1E6); //upperright latitude = original + (1)*degree/10
URlongitude = (longitudeCurrent+ 100000)/(1E6); //upperright longitude = original longitude + (1)*degree/10
try {
List<Address> searchAddresses = geoCoder1.getFromLocationName(locName, numberToDisplay, LLlatitude, LLlongitude, URlatitude, URlongitude);