gpt4 book ai didi

android - 在 Gmap 中绘制路线坐标(Google Maps Android API)

转载 作者:行者123 更新时间:2023-11-29 00:03:18 26 4
gpt4 key购买 nike

我目前正在开发一款使用 Google map 的 Android 应用程序。我的要求是在该路线上每隔 500 米在源-目的地和地 block 标记之间绘制一条路线。我画了一条路线,但不知道如何在每 500 米处绘制标记。是否有任何 Google API 可用于获取路线坐标,或者我必须实现任何其他逻辑?

最佳答案

目标

目标是获取沿路线的 LatLng 坐标列表,该路线由 Directions API 网络服务每隔 N 米返回一次。稍后我们可以为这个坐标列表创建标记。

解决方案

解决方案有两个步骤。第一个是获取构成由 Directions API 返回的路线的 LatLng 列表。您可以使用 Java Client for Google Maps Services执行 Directions API 请求并提取 LatLng 列表。看看private List<LatLng> getDirectionsPathFromWebService(String origin, String destination)我的例子中的方法。此方法调用 Directions API 并循环遍历路线对象的路段和路段,以获取构成路线的 LatLng 的完整列表。

第二步在方法private List<LatLng> getMarkersEveryNMeters(List<LatLng> path, double distance)中实现.它从第一步开始循环遍历所有 LatLng,并在每 N 米处创建一个 LatLng 列表,其中 N 是以米为单位的距离,作为该方法的第二个参数传递。此方法内部使用 SphericalUtil来自 Google Maps Android API Utility Library 的类(class).查看评论以了解此方法中发生了什么。

最后,我根据在第二步中获得的列表创建标记。

代码 fragment

public class MapsActivity extends FragmentActivity implements OnMapReadyCallback {

private GoogleMap mMap;
private String TAG = "so47784512";

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_maps);
// Obtain the SupportMapFragment and get notified when the map is ready to be used.
SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager()
.findFragmentById(R.id.map);
mapFragment.getMapAsync(this);
}

@Override
public void onMapReady(GoogleMap googleMap) {
mMap = googleMap;

String origin = "Avinguda Diagonal, 101, 08005 Barcelona, Spain";
String destination = "Carrer de París, 67, 08029 Barcelona, Spain";

LatLng center = new LatLng(41.391942,2.179413);

//Define list to get all latlng for the route
List<LatLng> path = this.getDirectionsPathFromWebService(origin, destination);

//Draw the polyline
if (path.size() > 0) {
PolylineOptions opts = new PolylineOptions().addAll(path).color(Color.BLUE).width(5);
mMap.addPolyline(opts);
}

List<LatLng> markers = this.getMarkersEveryNMeters(path, 500.0);

if (markers.size() > 0) {
for (LatLng m : markers) {
MarkerOptions mopts = new MarkerOptions().position(m);
mMap.addMarker(mopts);
}
}

mMap.getUiSettings().setZoomControlsEnabled(true);

mMap.moveCamera(CameraUpdateFactory.newLatLngZoom(center, 13));
}

private List<LatLng> getDirectionsPathFromWebService(String origin, String destination) {
List<LatLng> path = new ArrayList();


//Execute Directions API request
GeoApiContext context = new GeoApiContext.Builder()
.apiKey("AIzaSyBrPt88vvoPDDn_imh-RzCXl5Ha2F2LYig")
.build();
DirectionsApiRequest req = DirectionsApi.getDirections(context, origin, destination);
try {
DirectionsResult res = req.await();

//Loop through legs and steps to get encoded polylines of each step
if (res.routes != null && res.routes.length > 0) {
DirectionsRoute route = res.routes[0];

if (route.legs !=null) {
for(int i=0; i<route.legs.length; i++) {
DirectionsLeg leg = route.legs[i];
if (leg.steps != null) {
for (int j=0; j<leg.steps.length;j++){
DirectionsStep step = leg.steps[j];
if (step.steps != null && step.steps.length >0) {
for (int k=0; k<step.steps.length;k++){
DirectionsStep step1 = step.steps[k];
EncodedPolyline points1 = step1.polyline;
if (points1 != null) {
//Decode polyline and add points to list of route coordinates
List<com.google.maps.model.LatLng> coords1 = points1.decodePath();
for (com.google.maps.model.LatLng coord1 : coords1) {
path.add(new LatLng(coord1.lat, coord1.lng));
}
}
}
} else {
EncodedPolyline points = step.polyline;
if (points != null) {
//Decode polyline and add points to list of route coordinates
List<com.google.maps.model.LatLng> coords = points.decodePath();
for (com.google.maps.model.LatLng coord : coords) {
path.add(new LatLng(coord.lat, coord.lng));
}
}
}
}
}
}
}
}
} catch(Exception ex) {
Log.e(TAG, ex.getLocalizedMessage());
}

return path;
}

private List<LatLng> getMarkersEveryNMeters(List<LatLng> path, double distance) {
List<LatLng> res = new ArrayList();

LatLng p0 = path.get(0);
res.add(p0);
if (path.size() > 2) {
//Initialize temp variables for sum distance between points and
//and save the previous point
double tmp = 0;
LatLng prev = p0;
for (LatLng p : path) {
//Sum the distance
tmp += SphericalUtil.computeDistanceBetween(prev, p);
if (tmp < distance) {
//If it is less than certain value continue sum
prev = p;
continue;
} else {
//If distance is greater than certain value lets calculate
//how many meters over desired value we have and find position of point
//that will be at exact distance value
double diff = tmp - distance;
double heading = SphericalUtil.computeHeading(prev, p);

LatLng pp = SphericalUtil.computeOffsetOrigin(p, diff, heading);

//Reset sum set calculated origin as last point and add it to list
tmp = 0;
prev = pp;
res.add(pp);
continue;
}
}

//Add the last point of route
LatLng plast = path.get(path.size()-1);
res.add(plast);
}

return res;
}
}

结论

您可以在下面的屏幕截图中看到示例代码的结果

enter image description here

示例项目可以在 GitHub 上找到:

https://github.com/xomena-so/so47784512

不要忘记用您的替换 API key 。

希望对您有所帮助!

关于android - 在 Gmap 中绘制路线坐标(Google Maps Android API),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47784512/

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