gpt4 book ai didi

Android:MapController.zoomToSpan:给定距离和中心点的跨度

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:52:27 26 4
gpt4 key购买 nike

我一直在 Google 和 SO 上对此进行研究,但我被卡住了,我想我遗漏了一些基本的东西。大多数examples我见过不处理任意 mapWidth 和单个点,只处理 Overlay 的跨度。

我有一个 map 点数据库、一个MapView 和一个Geocoder。我可以在我的应用程序中搜索邮政编码,并让我的 Geocoder 返回一个 Address

使用此 Address,我可以构建一个 GeoPoint 并搜索我的数据库并获取附近点的列表。问题来自尝试使用从返回的 Address 点和到数据库中最近点的距离构造的跨度来 zoomToSpan。

我只希望跨度包含最近的两点(如果可用)。这是相关代码:

Collections.sort(listingDisplay, mComparator);
listingDisplayAdapter.notifyDataSetChanged();

float spanWidth =0;

if (listingDisplay.size() > 1) {

spanWidth = (float) (2 * distanceFromPoint(listingDisplay.get(1),
current));

} else if (listingDisplay.size() == 1) {

spanWidth = (float) (2 * distanceFromPoint(listingDisplay.get(0),
current));

}

Log.v(TAG, "SpanWidth: " + spanWidth);

// Create span
int minLat = (int) (current.getLatitudeE6() - (spanWidth * 1E6) / 2);
int maxLat = (int) (current.getLatitudeE6() + (spanWidth * 1E6) / 2);
int minLong = (int) (current.getLongitudeE6() - (spanWidth * 1E6) / 2);
int maxLong = (int) (current.getLongitudeE6() + (spanWidth * 1E6) / 2);

// Zoom against span. This appears to create a very small region that doesn't encompass the points
mapController.setCenter(current);
mapController.zoomToSpan(Math.abs( minLat - maxLat ), Math.abs( minLong - maxLong ));

ListingDisplay 包含最近点的列表,带有比较器,mComparator 使用最接近我返回的 Address 的位置对列表进行排序( GeoPoint 名为:current) 在列表的顶部。

然后我根据最接近的值设置 spanWidth 的值,并尝试从中计算出跨度。

我的问题是,如何从给定的距离和中心点构建跨度

最佳答案

经过非常非常长的时间后,我终于意识到我没有考虑一些重要信息,其中主要是 Android 上的距离是使用 WGS84 椭球计算的。

我最终使用了 Jan Matuschek's excellent and simple GeoLocation class 中的辅助方法,其中对所涉及的概念进行了非常的详尽解释。

我的方法基本上可以归结为以下几点。它可能可以进行很多优化,直到一个简单的 SQL 查询,但这里是为了我的目的,其中 listingDisplay 是数据库检索的自定义 LocationNode 对象的数组,并且 GeoPoint 当前是直接从标准 Android Geocoder 返回的 Address 创建的。

public void setRegionForGeoPoint(GeoPoint current) {

// Earth radius in KM
final double EARTH_RADIUS = 6371.01;

// Dummy span distance in KM for initial search; distance buffer is in M
final double DISTANCE_BUFFER = 50;
final double dummyDistance = 100.0;
//Create a list to store distances
List<Double> distancesList = new ArrayList<Double>();


// Loop through and modify LocationNodes with distance from user
for (LocationNode location : listingDisplay) {
location.setDistance((float) distanceFromUser(location));

// Dynamically calculate distance from our current point (epicentre)
distancesList.add(distanceFromPoint(location, current));
}

// Sort distances
Collections.sort(distancesList);

// Calculate regional span
float spanWidth = (float) dummyDistance;
double distance = 0;

if (distancesList.size() > 0) {
if (distancesList.size() > 1) {

distance = distancesList.get(1);
spanWidth = (float) (distance + DISTANCE_BUFFER);

} else if (distancesList.size() == 1) {

distance = distancesList.get(0);
spanWidth = (float) (distance + DISTANCE_BUFFER);

}

//Obtain the spanwidth in metres.
double spanWidthInKM = (double) spanWidth / 1000;

// Create span
GeoLocation[] boundingBoxSpan = currentGeoLocation
.boundingCoordinates(spanWidthInKM, EARTH_RADIUS);

//Create min/max values for final span calculation
int minLatSpan = (int) (boundingBoxSpan[0].getLatitudeInDegrees() * 1E6);
int maxLatSpan = (int) (boundingBoxSpan[1].getLatitudeInDegrees() * 1E6);
int minLongSpan = (int) (boundingBoxSpan[0].getLongitudeInDegrees() * 1E6);
int maxLongSpan = (int) (boundingBoxSpan[1].getLongitudeInDegrees() * 1E6);

//Finally calculate span
int latSpanE6 = Math.abs(minLatSpan - maxLatSpan);
int lonSpanE6 = Math.abs(minLongSpan - maxLongSpan);

// Set center
mapController.setCenter(current);

// Zoom to span
mapController.zoomToSpan(latSpanE6, lonSpanE6);

} else {

//TODO: Handle the case when we have no distance values to use
}
}


public double distanceFromPoint(LocationNode location, GeoPoint point) {

// Calculate distance from user via result
Location locationA = new Location("point A");
locationA.setLatitude(location.getLatitude());
locationA.setLongitude(location.getLongitude());

Location locationB = new Location("point B");
locationB.setLatitude((double) (point.getLatitudeE6() / 1E6));
locationB.setLongitude((double) (point.getLongitudeE6() / 1E6));
double distance = locationA.distanceTo(locationB);
Log.v(TAG, "Calculated Distance: " + distance);
return distance;
}

关于Android:MapController.zoomToSpan:给定距离和中心点的跨度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9424406/

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