我正在
Android中搜索附近的地方,例如银行,餐馆,ATM机在google地图上绘制的区域.我在数组中获得坐标(纬度和经度),但是我无法通过该数组找到附近的地点.
有人可以帮我吗我试图搜索,但没有发现结果.
伟大的帮助将不胜感激!
有人可以帮我吗我试图搜索,但没有发现结果.
伟大的帮助将不胜感激!
这是我绘制的区号:
public class MainActivity extends FragmentActivity implements OnTouchListener { private static final String TAG = "polygon"; private GoogleMap mGoogleMap; private View mMapShelterView; private GestureDetector mGestureDetector; private ArrayList<LatLng> mLatlngs = new ArrayList<LatLng>(); private PolylineOptions mPolylineOptions; private PolygonOptions mPolygonOptions; // flag to differentiate whether user is touching to draw or not private boolean mDrawFinished = false; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mMapShelterView = (View) findViewById(R.id.drawer_view); mGestureDetector = new GestureDetector(this,new GestureListener()); mMapShelterView.setOnTouchListener(this); initilizeMap(); //Contains(null); } private final class GestureListener extends SimpleOnGestureListener { @Override public boolean onDown(MotionEvent e) { return true; } @Override public boolean onFling(MotionEvent e1,MotionEvent e2,float velocityX,float velocityY) { return false; } } /** * Ontouch event will draw poly line along the touch points * */ @Override public boolean onTouch(View v,MotionEvent event) { int X1 = (int) event.getX(); int Y1 = (int) event.getY(); Point point = new Point(); point.x = X1; point.y = Y1; LatLng firstGeoPoint = mGoogleMap.getProjection().fromScreenLocation( point); switch (event.getAction()) { case MotionEvent.ACTION_DOWN: break; case MotionEvent.ACTION_MOVE: if (mDrawFinished) { X1 = (int) event.getX(); Y1 = (int) event.getY(); point = new Point(); point.x = X1; point.y = Y1; LatLng geoPoint = mGoogleMap.getProjection() .fromScreenLocation(point); mLatlngs.add(geoPoint); mPolylineOptions = new PolylineOptions(); mPolylineOptions.color(Color.RED); mPolylineOptions.width(3); mPolylineOptions.addAll(mLatlngs); mGoogleMap.addPolyline(mPolylineOptions); **Log.d(TAG,"Latitude and longitude: " + mLatlngs);** } break; case MotionEvent.ACTION_UP: Log.d(TAG,"Poinnts array size " + mLatlngs.size()); mLatlngs.add(firstGeoPoint); mGoogleMap.clear(); mPolylineOptions = null; mMapShelterView.setVisibility(View.GONE); mGoogleMap.getUiSettings().setZoomGesturesEnabled(true); mGoogleMap.getUiSettings().setAllGesturesEnabled(true); mPolygonOptions = new PolygonOptions(); mPolygonOptions.fillColor(0x5500ff00); // mPolygonOptions.fillColor(Color.LTGRAY); mPolygonOptions.strokeColor(Color.RED); mPolygonOptions.strokeWidth(5); mPolygonOptions.addAll(mLatlngs); mGoogleMap.addPolygon(mPolygonOptions); mDrawFinished = false; break; } return mGestureDetector.onTouchEvent(event); } /** * Setting up map * */ private void initilizeMap() { int status = GooglePlayServicesUtil .isGooglePlayServicesAvailable(getApplicationContext()); if (status == ConnectionResult.SUCCESS) { if (mGoogleMap == null) { mGoogleMap = ((SupportMapFragment) getSupportFragmentManager() .findFragmentById(R.id.map)).getMap(); mGoogleMap.setMyLocationEnabled(true); } } else if (GooglePlayServicesUtil.isUserRecoverableError(status)) { // showErrorDialog(status); } else { Toast.makeText(this,"No Support for Google Play Service",Toast.LENGTH_LONG).show(); } } /** * Method gets called on tap of draw button,It prepares the screen to draw * the polygon * * @param view */ public void drawZone(View view) { mGoogleMap.clear(); mLatlngs.clear(); mPolylineOptions = null; mPolygonOptions = null; mDrawFinished = true; mMapShelterView.setVisibility(View.VISIBLE); mGoogleMap.getUiSettings().setScrollGesturesEnabled(false); } public synchronized boolean Contains(Location location) { boolean isInside = false; if (mLatlngs.size() > 0) { LatLng lastPoint = mLatlngs.get(mLatlngs.size() - 1); double x = location.getLongitude(); for (LatLng point : mLatlngs) { double x1 = lastPoint.longitude; double x2 = point.longitude; double dx = x2 - x1; if (Math.abs(dx) > 180.0) { if (x > 0) { while (x1 < 0) x1 += 360; while (x2 < 0) x2 += 360; } else { while (x1 > 0) x1 -= 360; while (x2 > 0) x2 -= 360; } dx = x2 - x1; } if ((x1 <= x && x2 > x) || (x1 >= x && x2 < x)) { double grad = (point.latitude - lastPoint.latitude) / dx; double intersectAtLat = lastPoint.latitude + ((x - x1) * grad); if (intersectAtLat > location.getLatitude()) isInside = !isInside; } lastPoint = point; } } return isInside; }
我在mLatlang上有数组,现在我想靠近那个坐标不在当前位置的地方
解决方法
以下是使用Places Web Service API的一些工作代码,这应该可以帮助您获得所需的功能.
可以找到所有类型的地方类型here.
public StringBuilder sbMethod() { //use your current location here double mLatitude = 37.77657; double mLongitude = -122.417506; StringBuilder sb = new StringBuilder("https://maps.googleapis.com/maps/api/place/nearbysearch/json?"); sb.append("location=" + mLatitude + "," + mLongitude); sb.append("&radius=5000"); sb.append("&types=" + "restaurant"); sb.append("&sensor=true"); sb.append("&key=******* YOUR API KEY****************"); Log.d("Map","api: " + sb.toString()); return sb; }
以下是用于查询Places API的AsyncTask:
private class PlacesTask extends AsyncTask<String,Integer,String> { String data = null; // Invoked by execute() method of this object @Override protected String doInBackground(String... url) { try { data = downloadUrl(url[0]); } catch (Exception e) { Log.d("Background Task",e.toString()); } return data; } // Executed after the complete execution of doInBackground() method @Override protected void onPostExecute(String result) { ParserTask parserTask = new ParserTask(); // Start parsing the Google places in JSON format // Invokes the "doInBackground()" method of the class ParserTask parserTask.execute(result); } }
这是downloadURL()方法:
private String downloadUrl(String strUrl) throws IOException { String data = ""; InputStream iStream = null; HttpURLConnection urlConnection = null; try { URL url = new URL(strUrl); // Creating an http connection to communicate with url urlConnection = (HttpURLConnection) url.openConnection(); // Connecting to url urlConnection.connect(); // Reading data from url iStream = urlConnection.getInputStream(); BufferedReader br = new BufferedReader(new InputStreamReader(iStream)); StringBuffer sb = new StringBuffer(); String line = ""; while ((line = br.readLine()) != null) { sb.append(line); } data = sb.toString(); br.close(); } catch (Exception e) { Log.d("Exception while downloading url",e.toString()); } finally { iStream.close(); urlConnection.disconnect(); } return data; }
用于解析JSON结果的ParserTask:
private class ParserTask extends AsyncTask<String,List<HashMap<String,String>>> { JSONObject jObject; // Invoked by execute() method of this object @Override protected List<HashMap<String,String>> doInBackground(String... jsonData) { List<HashMap<String,String>> places = null; Place_JSON placeJson = new Place_JSON(); try { jObject = new JSONObject(jsonData[0]); places = placeJson.parse(jObject); } catch (Exception e) { Log.d("Exception",e.toString()); } return places; } // Executed after the complete execution of doInBackground() method @Override protected void onPostExecute(List<HashMap<String,String>> list) { Log.d("Map","list size: " + list.size()); // Clears all the existing markers; mGoogleMap.clear(); for (int i = 0; i < list.size(); i++) { // Creating a marker MarkerOptions markerOptions = new MarkerOptions(); // Getting a place from the places list HashMap<String,String> hmPlace = list.get(i); // Getting latitude of the place double lat = Double.parseDouble(hmPlace.get("lat")); // Getting longitude of the place double lng = Double.parseDouble(hmPlace.get("lng")); // Getting name String name = hmPlace.get("place_name"); Log.d("Map","place: " + name); // Getting vicinity String vicinity = hmPlace.get("vicinity"); LatLng latLng = new LatLng(lat,lng); // Setting the position for the marker markerOptions.position(latLng); markerOptions.title(name + " : " + vicinity); markerOptions.icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_MAGENTA)); // Placing a marker on the touched position Marker m = mGoogleMap.addMarker(markerOptions); } } }
ParserTask中使用的Place_JSON类:
public class Place_JSON { /** * Receives a JSONObject and returns a list */ public List<HashMap<String,String>> parse(JSONObject jObject) { JSONArray jPlaces = null; try { /** Retrieves all the elements in the 'places' array */ jPlaces = jObject.getJSONArray("results"); } catch (JSONException e) { e.printStackTrace(); } /** Invoking getPlaces with the array of json object * where each json object represent a place */ return getPlaces(jPlaces); } private List<HashMap<String,String>> getPlaces(JSONArray jPlaces) { int placesCount = jPlaces.length(); List<HashMap<String,String>> placesList = new ArrayList<HashMap<String,String>>(); HashMap<String,String> place = null; /** Taking each place,parses and adds to list object */ for (int i = 0; i < placesCount; i++) { try { /** Call getPlace with place JSON object to parse the place */ place = getPlace((JSONObject) jPlaces.get(i)); placesList.add(place); } catch (JSONException e) { e.printStackTrace(); } } return placesList; } /** * Parsing the Place JSON object */ private HashMap<String,String> getPlace(JSONObject jPlace) { HashMap<String,String> place = new HashMap<String,String>(); String placeName = "-NA-"; String vicinity = "-NA-"; String latitude = ""; String longitude = ""; String reference = ""; try { // Extracting Place name,if available if (!jPlace.isNull("name")) { placeName = jPlace.getString("name"); } // Extracting Place Vicinity,if available if (!jPlace.isNull("vicinity")) { vicinity = jPlace.getString("vicinity"); } latitude = jPlace.getJSONObject("geometry").getJSONObject("location").getString("lat"); longitude = jPlace.getJSONObject("geometry").getJSONObject("location").getString("lng"); reference = jPlace.getString("reference"); place.put("place_name",placeName); place.put("vicinity",vicinity); place.put("lat",latitude); place.put("lng",longitude); place.put("reference",reference); } catch (JSONException e) { e.printStackTrace(); } return place; } }
最后,调用这个过程:
StringBuilder sbValue = new StringBuilder(sbMethod()); PlacesTask placesTask = new PlacesTask(); placesTask.execute(sbValue.toString());
结果: