有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

我有一张地图,其中OpenLayers用于渲染地图。通过在地图上选择一个区域,我们可以找到所选区域的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();

})();

Jsfiddle to select a region on map

上面的fiddle选择了地图上的一个区域,我有一个Postgres数据库,其中有一个表track_vehicle,其中包含vehicle_id、latitude和longitude列。我想用Java检查车辆的纬度和经度是否在地图上选择的范围内


共 (1) 个答案

  1. # 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;
    }
    

    你可能会问:“为什么是三位数而不是两位数?”

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