我正在Android中搜索附近的地方,例如银行,餐馆,ATM机在google地图上绘制的区域

我正在 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.

可以找到所有类型的地方类型here.

以下是一个简单的例子.首先,生成API的查询字符串:

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());

结果:

相关文章

这篇“android轻量级无侵入式管理数据库自动升级组件怎么实现...
今天小编给大家分享一下Android实现自定义圆形进度条的常用方...
这篇文章主要讲解了“Android如何解决字符对齐问题”,文中的...
这篇文章主要介绍“Android岛屿数量算法怎么使用”的相关知识...
本篇内容主要讲解“Android如何开发MQTT协议的模型及通信”,...
本文小编为大家详细介绍“Android数据压缩的方法是什么”,内...