如何检查选定区域的纬度/经度是不是在使用 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 变为6603303966° 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 的数据库中定义的范围内的主要内容,如果未能解决你的问题,请参考以下文章

在ionic 3中检查我的区域圈内的纬度和经度

如何在弹性搜索中使用纬度经度搜索位置附近的区域

如何检查(在 php 或 cakephp 中)郊区的特定纬度/经度位于特定州?

检查纬度和经度的公式在没有 Google Maps Api 的区域内

查找一个点(纬度,经度)是不是在 OpenStreetMaps“方式”(区域)内

CLLocationCoordinates 纬度/经度值是不是取决于区域设置?