如果我有一个类来定义一个由经度和纬度定义的顶部/左边的地图,并且底部/右边也由经度和纬度定义,那么如何测试给定的纬度/经度是否在地图的范围内边界点? {这不是与Google地图有关的问题)。 例如(奥兰多在地图上覆盖Tallhasse到迈阿密)。
public class MapContext {
private Location mMapTop = null;
private Location mMapBottom = null;
public MapContext(String topLatitude,String topLongitude, String bottomLatitude, String bottomLongitude) {
double theTopLat = Location.convert(topLatitude);
double theTopLong = Location.convert(topLongitude);
mMapTop = new Location("private");
mMapTop.setLongitude(theTopLong);
mMapTop.setLatitude(theTopLat);
double theBottomLat = Location.convert(bottomLatitude);
double theBottomLong = Location.convert(bottomLongitude);
mMapBottom = new Location("private");
mMapBottom.setLongitude(theBottomLong);
mMapBottom.setLatitude(theBottomLat);
} public boolean testIfPointOnMap(Location location){ ? ? 返回TRUE或FALSE } }
答案 0 :(得分:4)
你能检查一下lat长度是否在界限之间吗?
/*
* top: north latitude of bounding box.
* left: left longitude of bounding box (western bound).
* bottom: south latitude of the bounding box.
* right: right longitude of bounding box (eastern bound).
* latitude: latitude of the point to check.
* longitude: longitude of the point to check.
*/
boolean isBounded(double top, double left,
double bottom, double right,
double latitude, double longitude){
/* Check latitude bounds first. */
if(top >= latitude && latitude >= bottom){
/* If your bounding box doesn't wrap
the date line the value
must be between the bounds.
If your bounding box does wrap the
date line it only needs to be
higher than the left bound or
lower than the right bound. */
if(left <= right && left <= longitude && longitude <= right){
return true;
} else if(left > right && (left <= longitude || longitude <= right)) {
return true;
}
}
return false;
}
答案 1 :(得分:1)
请发布您的代码 - 但假设您有类似的内容:
public class Map{
public int x1, y1, x2, y2;
}
你的支票很简单:
boolean isPointInMap(Map m, int x, int y){
return m.x1 <= x && x <= m.x2 && m.y1 <= y && y <= m.y2;
}
答案 2 :(得分:0)
没有找到完美的解决方案,但使用简单的边界检查是可以的,因为缩放级别越来越精确,位置的变化变得越来越不明显。不像我想要的那样精确,但在GPS精度范围内。
答案 3 :(得分:0)
这是一个完整的Java类,用于指定边界框并检查点是否位于其中。该箱由其西南和东北地理坐标(经度和纬度)定义。
class Bbox
{
public double swLatitude = 0.0;
public double swLongitude = 0.0;
public double neLatitude = 0.0;
public double neLongitude = 0.0;
/*************************************************************************
Constructor.
@param bboxSpecification A comma-separated string containing the
southwest latitude, soutwest longitude, northest latitude, and
northest longitude.
*************************************************************************/
public Bbox(String bboxSpecification)
{
String tokens[] = bboxSpecification.split("(?:,\\s*)+");
if (tokens.length != 4)
{
throw new IllegalArgumentException(
String.format("Expected 4 values in bbox string but found %d: %s\n",
tokens.length, bboxSpecification));
}
swLatitude = Double.parseDouble(tokens[0]);
swLongitude = Double.parseDouble(tokens[1]);
neLatitude = Double.parseDouble(tokens[2]);
neLongitude = Double.parseDouble(tokens[3]);
}
@Override
public String toString()
{
return String.format("swLatitude=%f, swLongitude=%f, neLatitude=%f, neLongitude=%f",
swLatitude, swLongitude, neLatitude, neLongitude);
}
/*************************************************************************
Checks if the bounding box contains the latitude and longitude. Note that
the function works if the box contains the prime merdian but does not
work if it contains one of the poles.
*************************************************************************/
public boolean contains(double latitude, double longitude)
{
boolean longitudeContained = false;
boolean latitudeContained = false;
// Check if the bbox contains the prime meridian (longitude 0.0).
if (swLongitude < neLongitude)
{
if (swLongitude < longitude && longitude < neLongitude)
{
longitudeContained = true;
}
}
else
{
// Contains prime meridian.
if ((0 < longitude && longitude < neLongitude) ||
(swLongitude < longitude && longitude < 0))
{
longitudeContained = true;
}
}
if (swLatitude < neLatitude)
{
if (swLatitude < latitude && latitude < neLatitude)
{
latitudeContained = true;
}
}
else
{
// The poles. Don't care.
}
return (longitudeContained && latitudeContained);
}
public static void test()
{
Bbox bbox;
double latitude = 0;
double longitude = 0;
bbox = new Bbox("37.43, -122.38, 37.89, -121.98");
latitude = 37.5;
longitude = -122.0;
System.out.printf("bbox (%s) contains %f, %f: %s\n",
bbox, latitude, longitude, bbox.contains(latitude, longitude));
bbox = new Bbox("50.99, -2.0, 54, 1.0");
latitude = 51.0;
longitude = 0.1;
System.out.printf("bbox (%s) contains %f, %f: %s\n",
bbox, latitude, longitude, bbox.contains(latitude, longitude));
}
}