检测线与哪条折线网格交叉

时间:2016-12-20 19:34:08

标签: javascript google-maps-api-3

去年,我建立了一个广泛的多层系统,以创建一个qtr-mins网格。它运作良好。 我的客户现在想要传入行(LatLng的两个节点),并希望我返回它接触的Qtr Mins。 FWIW,QtrMin是一个1/60/4(1/4分钟)到1/60/4的多边形。

以下是精简版脚本。我有一个入口函数,我将传入行节点,我将编写一个外部函数来传递触及的QtrMins。

问题的一部分是我从折线绘制了我的Qtr Mins,但事实就是如此。

我将通过Delphi利用脚本并进行函数调用以传入Lat / Lng对。

function getQtrMinTouched(oLat,oLng, fLat,fLng){
    // Lost and confused here
}   

并根据结果的返回方式,我将通过com对象调用将QtrMin传递给我的程序。将参数传递给函数并传递结果已经解决了。包括这里的内容将贡献很少,但需要几个模块才能简单运行。 我的问题是:使用我在下面创建的网格,有没有办法确定哪些网格被一条线(LatLng,LatLng)触及?一条线可能跨越多个网格。一条线总是被定义为两个节点(LatLng,LatLng)。

<html>
<head>
    <title>Find your Qtr minute locator
    </title>
    <script type="text/javascript"
            src="https://maps.googleapis.com/maps/api/js?v=3.24&amp;libraries=geometry">
    </script>
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
</head>

<body>
<div id="map-canvas" style="HEIGHT: 100%; WIDTH: 100%" onclick=""></div>


<div id="map"></div>

<script type="text/javascript">
    var map;
    var llOffset = 1/60/4;
    var qtrNELatLngCode;
    var qtrNorth;
    var qtrEast;
    var qtrSWLatLngCode;
    var qtrSouth;
    var qtrWest;
    var latPolylines = [];
    var lngPolylines = [];
    var lngLabels = [];

    function initialize() {
        geocoder = new google.maps.Geocoder();
        map = new google.maps.Map(document.getElementById("map-canvas"), {
            center: new google.maps.LatLng(34.0, -84.0),
            zoom: 16,
            streetViewControl: true,
            mapTypeId: google.maps.MapTypeId.ROADMAP,
            scaleControl: true
        });

        google.maps.event.addListener(map, "idle", function () {
            var sLat = map.getCenter().lat();
            var sLng = map.getCenter().lng();

            //external.ShowMarker(sLat,sLng);
            createGridLines(map.getBounds());
        });
    }  // initialize

    google.maps.event.addDomListener(window, "load", initialize);

    function createGridLines(bounds) {
        for (var i = 0; i < latPolylines.length; i++) {
            latPolylines[i].setMap(null);
        }

        latPolylines = [];
        for (var j = 0; j < lngPolylines.length; j++) {
            lngPolylines[j].setMap(null);
        }
        lngPolylines = [];

        for (var k = 0; k < lngLabels.length; k++) {
            lngLabels[k].setMap(null);
        }
        lngLabels = [];

        if (map.getZoom() < 12) {
            return;
        }
        var north = bounds.getNorthEast().lat();
        var east = bounds.getNorthEast().lng();
        var south = bounds.getSouthWest().lat();
        var west = bounds.getSouthWest().lng();

        // define the size of the grid
        var topLat = Math.ceil(north / llOffset) * llOffset;
        var rightLong = Math.ceil(east / llOffset) * llOffset;

        var bottomLat = Math.floor(south / llOffset) * llOffset;
        var leftLong = Math.floor(west / llOffset) * llOffset;


        qtrNELatLngCode = ddToQM(topLat, rightLong);
        qtrNorth = qtrNELatLngCode.substring(0, 5);
        qtrEast = qtrNELatLngCode.substring(5, 12);
        qtrSWLatLngCode = ddToQM(bottomLat, leftLong);
        qtrSouth = qtrSWLatLngCode.substring(0, 5);
        qtrWest = qtrSWLatLngCode.substring(5, 12);

        for (var latitude = bottomLat; latitude <= topLat; latitude += llOffset) latPolylines.push(new google.maps.Polyline({
            path: [
                new google.maps.LatLng(latitude, leftLong), new google.maps.LatLng(latitude, rightLong)],
            map: map,
            geodesic: true,
            strokeColor: "#0000FF",
            strokeOpacity: 0.1,
            strokeWeight: 1
        }));
        for (var longitude = leftLong; longitude <= rightLong; longitude += llOffset) lngPolylines.push(new google.maps.Polyline({
            path: [
                new google.maps.LatLng(topLat, longitude), new google.maps.LatLng(bottomLat, longitude)],
            map: map,
            geodesic: true,
            strokeColor: "#0000FF",
            strokeOpacity: 0.1,
            strokeWeight: 1
        }));

        if ((map.getZoom() < 16)) {
            for (var l = 0; l < lngLabels.length; l++) {
                lngLabels[l].setMap(null);
            }
            lngLabels = [];
            return;
        }  // set lngLabels to null

        for (var x = 0; x < latPolylines.length; ++x) {
            for (var y = 0; y < lngPolylines.length; ++y) {
                var latLng = new google.maps.LatLng(latPolylines[x].getPath().getAt(0).lat(),
                        lngPolylines[y].getPath().getAt(0).lng());

                var qtrLatLng = ddToQM(latLng.lat(), latLng.lng());

线是否触摸此网格?我认为在绘制顶点时,我会测试是否该线(知道(latlng,latlng))。

                lngLabels.push(new google.maps.Marker({
                    map: map,
                    position: latLng,
                    icon: {
                        url: "https://chart.googleapis.com/chart?"
                        + "chst=d_bubble_text_small&chld=bbbr|"
                        + qtrLatLng
                        + "|FFFFFF|000000",
                        anchor: new google.maps.Point(126, 42)
                    }
                }));
            }
        }
    }  // end createGridLines

function getQtrMinTouched(oLat,oLng, fLat,fLng){
    // Lost and confused here
}   



    function ddToQM(alat, alng) {
        var latResult, lngResult, dmsResult;

        alat = parseFloat(alat);
        alng = parseFloat(alng);

        latResult = "";
        lngResult = "";

        latResult += getDms(alat);
        lngResult += getDms(alng);

        dmsResult = latResult + lngResult;

        // Return the resultant string.
        return dmsResult;
    }

    function getDms(val) {
        // Required variables
        var valDeg, valMin, valSec, interimResult;
        var qtrMin;
        val = Math.abs(val);

        // ---- Degrees ----
        valDeg = Math.floor(val);
        valMin = Math.floor((val - valDeg) * 60);
        valSec = Math.round((val - valDeg - valMin / 60) * 3600 * 1000) / 1000;

        if (valSec == 60) {
            valMin += 1;
            valSec = 0;
        }
        if (valMin == 60) {
            valMin += 1;
            valSec = 0;
        }
        interimResult = valDeg + "";

        if (valMin < 10) {
            valMin = "0" + valMin;
        }

        interimResult += valMin + "";

        switch (valSec) {
            case  0 :
                qtrMin = "D";
                break;
            case 15 :
                qtrMin = "C";
                break;
            case 30 :
                qtrMin = "B";
                break;
            case 45 :
                qtrMin = "A";
                break;
        }
        interimResult += qtrMin;
        return interimResult;
    }
</script>
</body>
</html>   

0 个答案:

没有答案