- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我一直在 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/
如何让div的中心点作为旋转的中心点。 我遇到了 this虽然我正在做一些研究,但我似乎无法将其融入我的研究。 这就是帖子所建议的。但不起作用。$(area).css('-webkit-transfo
您好,我正在做一个应用程序,在我的应用程序中有一个 map 页面,所以我实现了 Google Maps V2,我遇到了一个问题,当我滚动 map 时,我想获得 map 的中心点,如果我滚动 map ,
我正在玩一个简单的 2d 游戏,我正在尝试从级别 1(场景一)切换到级别 2(场景二)。为了测试,两个级别包含相同的内容。这是我的转换代码: let transition = SKTransi
我有一个覆盖大部分屏幕区域的 map 的 View 。 在 map 的顶部,我有一些图像、按钮、文本框。它们位于 map 的顶部,我在这里称其为“无用 map ”,而底部则用于实际查看 map 。这是
给定一个纯白色背景上的对象,有人知道 OpenCV 是否提供了从捕获的帧中轻松检测对象的功能吗? 我正在尝试定位对象(矩形)的角点/中心点。我目前这样做的方式是通过蛮力(扫描对象的图像)并且不准确。我
我试图确保我的 map 中心点位于 kml 层的边界内,我无法找到很多相关信息,但我修改了来自 here 的一些代码。这似乎可行,但当然行不通。 从 Google Maps API 中,我无法判断 .
我试图在用户滚动 UIScrollView 时创建一个非常简单的视差效果。我在我的 ScrollView 上使用 scrollViewDidScroll 方法,一切正常。我可以记录该方法的所有内容,因
我正在使用 svg.js 和出色的 svg-pan-zoom 插件 ( https://github.com/ariutta/svg-pan-zoom )。 现在我想要一个按钮,当我单击它时,它会在我
我是一名优秀的程序员,十分优秀!