如何在定义的范围内显示标记?
How to show markers in a defined range?
该应用程序有一个带有标记的地图,标记的可见性设置为 false,我希望当设备位于任何标记的特定范围内时标记显示,结果将该标记设置为可见.我假设它与方法 location.distanceTo(anotherLocation) 有关,然后如果到的距离小于以米为单位的预定义距离,则显示位置。但是我没能完成这项工作。
这是将标记从数组列表添加到地图的方法。
for(MyLatLngData location : locations){
mMap.addMarker(new MarkerOptions()
.position(location.getLatLng())
.title(location.getTitle())
.visible(false));
}
以下是我如何使用 MyLatLngData 对象将数据存储在数据库中的数组中。
void storeDataInArrays() {
Cursor cursor = databaseHelper.readAllData();
if (cursor.getCount() == 0) {
Toast.makeText(this, "No data", Toast.LENGTH_SHORT).show();
} else {
while (cursor.moveToNext()) {
// remove all previous list adds.
locations.add(new MyLatLngData(
cursor.getString(0),
cursor.getString(1),
cursor.getDouble(2),
cursor.getDouble(3)));
}
}
}
如何使用 distanceTo 方法考虑所有位置以及如何将第一个位置设置为 fusedLocationProvider 的当前位置。
另外,我希望保存标记的状态,以便设置为可见的状态保持可见。
非常感谢任何感谢,我希望有人可以帮助解决这个问题,因为我的编程技能仍在完善中。
如果您使用 location.distanceTo(anotherLocation)
方法,您需要为 location
的每个新坐标重新计算距离。但是,您可以从具有条件的数据库行确定当前 location
和 select 附近区域的 lat/lon 边界(min_lat/min_lon - max_lat/max_lon)而不是 location.distanceTo(anotherLocation)
例如:
Cursor myCursor = db.rawQuery("SELECT * FROM markers WHERE lon >= min_lon AND lon <= max_lon AND lat >= min_lat AND lat <= max_lat", null);
要确定区域的 lat/lon 边界 (min_lat/min_lon - max_lat/max_lon),您可以使用 answer of :
private LatLng getDestinationPoint(LatLng source, double brng, double dist) {
dist = dist / 6371;
brng = Math.toRadians(brng);
double lat1 = Math.toRadians(source.latitude), lon1 = Math.toRadians(source.longitude);
double lat2 = Math.asin(Math.sin(lat1) * Math.cos(dist) +
Math.cos(lat1) * Math.sin(dist) * Math.cos(brng));
double lon2 = lon1 + Math.atan2(Math.sin(brng) * Math.sin(dist) *
Math.cos(lat1),
Math.cos(dist) - Math.sin(lat1) *
Math.sin(lat2));
if (Double.isNaN(lat2) || Double.isNaN(lon2)) {
return null;
}
return new LatLng(Math.toDegrees(lat2), Math.toDegrees(lon2));
}
...
LatLng northEast = getDestinationPoint(location, 45, your_distance);
LatLng southWest = getDestinationPoint(location, 225, your_distance);
min_lat = southWest.latitude;
min_lon = southWest.longitude;
max_lat = northEast.latitude;
max_lon = northEast.longitude;
该应用程序有一个带有标记的地图,标记的可见性设置为 false,我希望当设备位于任何标记的特定范围内时标记显示,结果将该标记设置为可见.我假设它与方法 location.distanceTo(anotherLocation) 有关,然后如果到的距离小于以米为单位的预定义距离,则显示位置。但是我没能完成这项工作。
这是将标记从数组列表添加到地图的方法。
for(MyLatLngData location : locations){
mMap.addMarker(new MarkerOptions()
.position(location.getLatLng())
.title(location.getTitle())
.visible(false));
}
以下是我如何使用 MyLatLngData 对象将数据存储在数据库中的数组中。
void storeDataInArrays() {
Cursor cursor = databaseHelper.readAllData();
if (cursor.getCount() == 0) {
Toast.makeText(this, "No data", Toast.LENGTH_SHORT).show();
} else {
while (cursor.moveToNext()) {
// remove all previous list adds.
locations.add(new MyLatLngData(
cursor.getString(0),
cursor.getString(1),
cursor.getDouble(2),
cursor.getDouble(3)));
}
}
}
如何使用 distanceTo 方法考虑所有位置以及如何将第一个位置设置为 fusedLocationProvider 的当前位置。
另外,我希望保存标记的状态,以便设置为可见的状态保持可见。
非常感谢任何感谢,我希望有人可以帮助解决这个问题,因为我的编程技能仍在完善中。
如果您使用 location.distanceTo(anotherLocation)
方法,您需要为 location
的每个新坐标重新计算距离。但是,您可以从具有条件的数据库行确定当前 location
和 select 附近区域的 lat/lon 边界(min_lat/min_lon - max_lat/max_lon)而不是 location.distanceTo(anotherLocation)
例如:
Cursor myCursor = db.rawQuery("SELECT * FROM markers WHERE lon >= min_lon AND lon <= max_lon AND lat >= min_lat AND lat <= max_lat", null);
要确定区域的 lat/lon 边界 (min_lat/min_lon - max_lat/max_lon),您可以使用
private LatLng getDestinationPoint(LatLng source, double brng, double dist) {
dist = dist / 6371;
brng = Math.toRadians(brng);
double lat1 = Math.toRadians(source.latitude), lon1 = Math.toRadians(source.longitude);
double lat2 = Math.asin(Math.sin(lat1) * Math.cos(dist) +
Math.cos(lat1) * Math.sin(dist) * Math.cos(brng));
double lon2 = lon1 + Math.atan2(Math.sin(brng) * Math.sin(dist) *
Math.cos(lat1),
Math.cos(dist) - Math.sin(lat1) *
Math.sin(lat2));
if (Double.isNaN(lat2) || Double.isNaN(lon2)) {
return null;
}
return new LatLng(Math.toDegrees(lat2), Math.toDegrees(lon2));
}
...
LatLng northEast = getDestinationPoint(location, 45, your_distance);
LatLng southWest = getDestinationPoint(location, 225, your_distance);
min_lat = southWest.latitude;
min_lon = southWest.longitude;
max_lat = northEast.latitude;
max_lon = northEast.longitude;