OSMdroid 当前位置的自定义和旋转图标
OSMdroid Custom and rotating icon of current location
我正在使用 OSMdroid 显示带有用户当前位置的离线地图。
1) 首选 - 我想将显示当前位置的默认图标更改为自定义图标。我还需要它根据 GPS 返回的方位来改变它的旋转,比如说每 5 秒一次。图标的位置应该在屏幕中央。
或
2) 可能性 - 旋转地图,自定义当前位置图标固定在屏幕底部。
在 osmdroid 中有什么方法可以做到吗?
谢谢。
1) osmdroid 已经支持了一段时间。有几个我的位置类型叠加层和有关如何使用它们的示例。根据您使用的 osmdroid 版本,替换默认图标的机制会有所不同。
2) osmdroid 已打开一个拉取请求以支持此功能。我很确定它允许我的位置偏移量位于屏幕上的任何位置。
看来我找到了第一种可能。
我在地图上添加了一个标记,它会在调用 onLocationChanged() 时更改其位置。地图也会移动,因此标记位于中心。然后我做 marker.setRotation(bearing)。
myLocationOverlay = new DirectedLocationOverlay(this);
Drawable d = ResourcesCompat.getDrawable(getResources(), R.drawable.direction_arrow, null);
Bitmap bitmap = ((BitmapDrawable) d).getBitmap();
myLocationOverlay.setDirectionArrow(bitmap);
//code to change default location icon
map.getOverlays().add(myLocationOverlay);
需要实现onLocationChanged方法
@Override
public void onLocationChanged(final Location pLoc) {
long currentTime = System.currentTimeMillis();
if (mIgnorer.shouldIgnore(pLoc.getProvider(), currentTime))
return;
double dT = currentTime - mLastTime;
if (dT < 100.0) {
//Toast.makeText(this, pLoc.getProvider()+" dT="+dT, Toast.LENGTH_SHORT).show();
return;
}
mLastTime = currentTime;
GeoPoint newLocation = new GeoPoint(pLoc);
if (!myLocationOverlay.isEnabled()) {
//we get the location for the first time:
myLocationOverlay.setEnabled(true);
map.getController().animateTo(newLocation);
}
GeoPoint prevLocation = myLocationOverlay.getLocation();
myLocationOverlay.setLocation(newLocation);
myLocationOverlay.setAccuracy((int) pLoc.getAccuracy());
if (prevLocation != null && pLoc.getProvider().equals(LocationManager.GPS_PROVIDER)) {
mSpeed = pLoc.getSpeed() * 3.6;
long speedInt = Math.round(mSpeed);
TextView speedTxt = findViewById(R.id.speed);
speedTxt.setText(speedInt + " km/h");
//TODO: check if speed is not too small
if (mSpeed >= 0.1) {
mAzimuthAngleSpeed = pLoc.getBearing();
myLocationOverlay.setBearing(mAzimuthAngleSpeed);
}
}
if (mTrackingMode) {
//keep the map view centered on current location:
map.getController().animateTo(newLocation);
map.setMapOrientation(-mAzimuthAngleSpeed);
} else {
//just redraw the location overlay:
map.invalidate();
}
if (mIsRecordingTrack) {
recordCurrentLocationInTrack("my_track", "My Track", newLocation);
}
}
我正在使用 OSMdroid 显示带有用户当前位置的离线地图。
1) 首选 - 我想将显示当前位置的默认图标更改为自定义图标。我还需要它根据 GPS 返回的方位来改变它的旋转,比如说每 5 秒一次。图标的位置应该在屏幕中央。
或
2) 可能性 - 旋转地图,自定义当前位置图标固定在屏幕底部。
在 osmdroid 中有什么方法可以做到吗?
谢谢。
1) osmdroid 已经支持了一段时间。有几个我的位置类型叠加层和有关如何使用它们的示例。根据您使用的 osmdroid 版本,替换默认图标的机制会有所不同。
2) osmdroid 已打开一个拉取请求以支持此功能。我很确定它允许我的位置偏移量位于屏幕上的任何位置。
看来我找到了第一种可能。 我在地图上添加了一个标记,它会在调用 onLocationChanged() 时更改其位置。地图也会移动,因此标记位于中心。然后我做 marker.setRotation(bearing)。
myLocationOverlay = new DirectedLocationOverlay(this);
Drawable d = ResourcesCompat.getDrawable(getResources(), R.drawable.direction_arrow, null);
Bitmap bitmap = ((BitmapDrawable) d).getBitmap();
myLocationOverlay.setDirectionArrow(bitmap);
//code to change default location icon
map.getOverlays().add(myLocationOverlay);
需要实现onLocationChanged方法
@Override
public void onLocationChanged(final Location pLoc) {
long currentTime = System.currentTimeMillis();
if (mIgnorer.shouldIgnore(pLoc.getProvider(), currentTime))
return;
double dT = currentTime - mLastTime;
if (dT < 100.0) {
//Toast.makeText(this, pLoc.getProvider()+" dT="+dT, Toast.LENGTH_SHORT).show();
return;
}
mLastTime = currentTime;
GeoPoint newLocation = new GeoPoint(pLoc);
if (!myLocationOverlay.isEnabled()) {
//we get the location for the first time:
myLocationOverlay.setEnabled(true);
map.getController().animateTo(newLocation);
}
GeoPoint prevLocation = myLocationOverlay.getLocation();
myLocationOverlay.setLocation(newLocation);
myLocationOverlay.setAccuracy((int) pLoc.getAccuracy());
if (prevLocation != null && pLoc.getProvider().equals(LocationManager.GPS_PROVIDER)) {
mSpeed = pLoc.getSpeed() * 3.6;
long speedInt = Math.round(mSpeed);
TextView speedTxt = findViewById(R.id.speed);
speedTxt.setText(speedInt + " km/h");
//TODO: check if speed is not too small
if (mSpeed >= 0.1) {
mAzimuthAngleSpeed = pLoc.getBearing();
myLocationOverlay.setBearing(mAzimuthAngleSpeed);
}
}
if (mTrackingMode) {
//keep the map view centered on current location:
map.getController().animateTo(newLocation);
map.setMapOrientation(-mAzimuthAngleSpeed);
} else {
//just redraw the location overlay:
map.invalidate();
}
if (mIsRecordingTrack) {
recordCurrentLocationInTrack("my_track", "My Track", newLocation);
}
}