如何检查选定区域的纬度/经度是不是在使用 Java 的数据库中定义的范围内
Posted
技术标签:
【中文标题】如何检查选定区域的纬度/经度是不是在使用 Java 的数据库中定义的范围内【英文标题】:How to check if the lat/lon of a selected area lies within the range defined in a database using Java如何检查选定区域的纬度/经度是否在使用 Java 的数据库中定义的范围内 【发布时间】:2014-05-30 06:13:35 【问题描述】:我有一张使用 OpenLayers 渲染地图的地图。通过在地图上选择一个区域,我们可以找到所选区域的纬度/经度值。我有一个数据库中的数据,它定义了某个车辆的纬度/经度值。我想检查车辆是否位于我在地图上选择的区域内。我将如何在 Java 中做到这一点?
(function ()
var map, drawControls, boxLayer;
function init()
map = new OpenLayers.Map('map');
var wmsLayer = new OpenLayers.Layer.WMS("OpenLayers WMS",
"http://vmap0.tiles.osgeo.org/wms/vmap0?",
layers: 'basic'
);
boxLayer = new OpenLayers.Layer.Vector("Box layer");
map.addLayers([wmsLayer, boxLayer]);
map.addControl(new OpenLayers.Control.LayerSwitcher());
map.addControl(new OpenLayers.Control.MousePosition());
var box = new OpenLayers.Control.DrawFeature(boxLayer,
OpenLayers.Handler.RegularPolygon,
handlerOptions:
sides: 4,
irregular: true
,
callbacks:
up: function (geom)
console.log(geom);
alert(geom);
);
map.addControl(box);
box.activate();
map.setCenter(new OpenLayers.LonLat(0, 0), 3);
init();
)();
Jsfiddle to select a region on map
上面的小提琴选择了地图上的一个区域,我有一个 Postgres 数据库,它有一个表 track_vehicle,其中包含车辆 ID、纬度和经度列。我想检查车辆的经纬度是否在使用Java在地图上选择的范围内。
【问题讨论】:
这将需要 a) 从 javascript 获取地图缩放区域 b) 将区域服务器端发送到 Java c) 在 DB 上执行查询 c) 将车辆位置发送回客户端(如果在区域) d) 使用 openLayers 将车辆显示回地图。你确定这是你想要的,因为它不会有效率 问题是什么?空间查询怎么做,数据怎么回传? 第二次阅读:您一直说“Java”,但您的代码看起来像“JavaScript”。您知道这些是不同的语言吗? @Alexandros :先生,我也想这样做。但如果车辆在所选区域内,我只想将车辆 ID 发送到我的 jsp 页面。不必像您在上一步中提到的那样将其发送到带有 openlayers 的地图。 @AngeloNeuschitzer:先生,是的,我知道它们是两种不同的语言。我刚刚在这里给出了地图代码。但是要检查 db 的纬度和经度,如果我没记错的话,我将需要 java。 【参考方案1】:纬度和经度是数字(正数表示东/南,负数表示西/北),因此您可以使用大于和小于运算来检查某个点是否位于区域内。
所以66° 33′ 39″ N
变为66033039
而66° 33′ 39″ S
变为-66033039
。只需将每一步写成三位整数,您将始终以九位数字结尾。
public int degreesToInt(int degrees, int minutes, int seconds)
NumberFormat nf = new DecimalFormat("000");
return Integer.valueOf(nf.format(degrees) +
nf.format(minutes) +
nf.format(seconds));
public boolean objectInArea(int vehicleLatitude, int vehicleLongitude,
int northLatitudeBorder, int southLatitudeBorder,
int westLongitudeBorder, int eastLongitudeBorder)
if(westLongitudeBorder > eastLongitudeBorder)
return objectInArea(vehicleLatitude, vehicleLongitude,
northLatitudeBorder, southLatitudeBorder,
-180000000,eastLongitudeBorder) ||
objectInArea(vehicleLatitude, vehicleLongitude,
northLatitudeBorder, southLatitudeBorder,
westLongitudeBorder,180000000);
return vehicleLongitude < eastLongitudeBorder &&
vehicleLongitude > westLongitudeBorder &&
vehicleLatitude < southLatitudeBorder &&
vehicleLatitude > northLatitudeBorder;
您可能会问:“为什么是三位而不是两位?”
-
它没有缺点。
您可以更轻松地读取数字,因为分钟和秒从来没有百位数字,所以总是有一个零,这使得调试更容易。
您也可以使用与分和秒相同的度数转换(东/西超过 100 度)。
【讨论】:
以上是关于如何检查选定区域的纬度/经度是不是在使用 Java 的数据库中定义的范围内的主要内容,如果未能解决你的问题,请参考以下文章
如何检查(在 php 或 cakephp 中)郊区的特定纬度/经度位于特定州?
检查纬度和经度的公式在没有 Google Maps Api 的区域内