gpt4 book ai didi

android - 我正在尝试在 android 的谷歌地图上的绘制区域内搜索附近的地方,如银行、餐馆、自动取款机

转载 作者:塔克拉玛干 更新时间:2023-11-01 21:37:17 27 4
gpt4 key购买 nike

我正在尝试在 android 的谷歌地图上的绘制区域内搜索附近的地方,例如银行、餐馆、ATM。我在一个数组中得到坐标(纬度和经度),但我无法通过该数组找到附近的地方。有人可以帮我吗?我试图搜索但没有找到任何结果。非常感谢您的帮助!

这是我绘制的区号:

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 服务 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;
}

ParserTask 用于解析 JSON 结果:

private class ParserTask extends AsyncTask<String, Integer, 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);

}
}
}

Place_JSON 用于 ParserTask 的类:

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

结果:

enter image description here

关于android - 我正在尝试在 android 的谷歌地图上的绘制区域内搜索附近的地方,如银行、餐馆、自动取款机,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30161395/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com