如何检查所选区域的lat/lon是否在使用Java的数据库中定义的范围内

如何检查所选区域的lat/lon是否在使用Java的数据库中定义的范围内,java,postgresql,openlayers,Java,Postgresql,Openlayers,我有一个使用OpenLayers渲染地图的地图。通过在地图上选择一个区域,我们可以找到所选区域的lat/lon值。我有一个数据库中的数据,该数据库定义了特定车辆的lat/lon值。我想检查车辆是否位于我在地图上选择的区域内。在Java中如何实现这一点 (function () { var map, drawControls, boxLayer; function init() { map = new OpenLayers.Map('map');

我有一个使用OpenLayers渲染地图的地图。通过在地图上选择一个区域,我们可以找到所选区域的lat/lon值。我有一个数据库中的数据,该数据库定义了特定车辆的lat/lon值。我想检查车辆是否位于我在地图上选择的区域内。在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();

})();


上面的提琴选择了地图上的一个区域,我有一个Postgres数据库,它有一个表track\u vehicle,其中包含vehicle\u id、latitude和longitude列。我想使用Java检查车辆的纬度和经度是否在地图上选择的范围内。

纬度和经度是数字(正数表示东/南,负数表示西/北),因此您可以使用大于和小于运算检查点是否位于某个区域内

因此
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;
}
public int degreesToInt(int度、int分、int秒){
NumberFormat nf=新的十进制格式(“000”);
返回整数.valueOf(nf.格式(度)+
nf.格式(分钟)+
格式(秒);
}
公共布尔对象区域(int vehicleLatitude、int VehicleLength、,
内北向,内南向,
int西长订单、int东长订单){
if(西长订单>东长订单){
返回目标区域(车辆高度、车辆长度、,
北半球,南半球,
-180000000,东长订单)||
目标区域(车辆高度、车辆长度、,
北半球,南半球,
westLongitudeBorder,180000000);
}
返回车辆长度<东纵向订单&&
车辆长度>西部纵向订单&&
车辆高度<南纬度秩序&&
车辆高度>北纬度顺序;
}
你可能会问:“为什么是三位数而不是两位数?”

  • 它没有缺点
  • 您可以更容易地读取数字,因为分和秒从来没有百位数,所以总是有一个零,这使得调试更容易
  • 您可以采用与分和秒相同的度转换(东/西的度超过100度)

  • 这将需要a)从Javascript获取地图缩放区域b)将区域服务器端发送到Java c)在DB上执行查询c)将车辆位置发送回客户端(如果在区域内)d)使用openLayers将车辆显示回地图。你确定这就是你想要的,因为它不会有效吗?问题是什么?如何进行空间查询,如何发回数据?二读:你一直说“Java”,但你的代码看起来像“JavaScript”。你知道这些是不同的语言,是吗?@Alexandros:先生,我也想这么做。但如果车辆位于所选区域,我只想将车辆ID发送到我的jsp页面。您在最后一步中提到,没有必要将其发送到带有openlayers的map。@AngeloNeuschitzer:是的,我知道它们是两种不同的语言。我刚刚在这里给出了地图代码。但是要根据db检查纬度和经度,如果我没有错的话,我需要java。