当一个多边形位于另一个多边形之上时,无法触发点击事件

贻贝

首先,对于发布这么多代码,我深表歉意,但我想确保您可以看到所有影响逻辑的内容。

在编辑上。快速测试只需单击AddData,然后单击Trim Off按钮,直到显示“ Spot On”。现在,单击地图上的任意位置。Spot On将在“裸图”上创建一个黄色正方形,但不会在紫色块上绘制。我需要能够选择那些块。

我添加了一些位置数据和一些按钮,以便可以演示此问题。

运行脚本。

单击添加数据按钮。这将在屏幕中心绘制9个多边形。

单击“栅栏关闭”,使其显示“栅栏打开”。现在,单击屏幕上以前绘制的紫色多边形上没有的任何位置。这会将Fence工具放置在屏幕上。

拉伸“栅栏”多边形的手柄以封装大约一半的紫色多边形。使围栏比紫色多边形大4到5个正方形。

现在,再次单击围栏按钮以关闭围栏。

请注意,有一个黄色蒙版覆盖了一些紫色的多边形,还有一些黄色蒙版块,其中蒙版位于裸露的地图上。

单击一次“修剪关闭”按钮。现在应该说Nibble On。
单击黄色蒙版块之一。应该将其从地图上删除。单击遮盖紫色多边形的蒙版。没有什么!!那是个问题。
我希望我的用户能够随意取消选择“蒙版”块。

单击“按进位打开”按钮。现在应该说Spot On。在裸露的地图上单击任意位置,它将变为黄色,然后向蒙版添加另一个块。

单击紫色块,但未绘制任何蒙版。那是另一个(相同)问题。

遮罩的目的是识别要在现有区域中添加或删除的地图区域。这里没有显示很多,但是效果很好。唯一的缺陷是无法在现有的绘制数据上使用蒙版。

我已经放置了警报,它甚至没有引发点击。我认为数据多边形正在拦截它,但是有解决方法?

    <style>
    #map {
        height: 100%;
    }

    #floating-panel {
        position: absolute;
        top: 10px;
        left: 25%;
        z-index: 5;
        background-color: #fff;
        padding: 5px;
        border: 1px solid #999;
        text-align: center;
        font-family: 'Roboto', 'sans-serif';
        line-height: 30px;
        padding-left: 10px;
    }
</style>

<html>
<head>
    <title>Find your Qtr minute locator
    </title>
    <script type="text/javascript"
            src="https://maps.googleapis.com/maps/api/js?v=3.22&amp;libraries=geometry">
    </script>
</head>

<body><!-- Declare the div, make it take up the full document body -->
<div id="map-canvas" style="HEIGHT: 100%; WIDTH: 100%" onclick=""></div>

<div id="floating-panel">

    <input onclick="AddData();" id="divData" type=button value="AddData">
    <input onclick="AddGridOn();" id="divSpot" type=button value="Trim Off">
    <input onclick="DrawGridOn();" id="divFence" type=button value="Fence Off">
    <input onclick="ClearGrid();" id="divMask" type=button value="Clear Mask">

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

<script type="text/javascript">
    var map;
    var geocoder;
    var marker;
    var idx = 0;
    var streetAddress = '';
    var qtrArray = [];
    var dataLatArray = [];
    var dataLngArray = [];
    var userGridArray = [];
    var Startlatlng = "";
    var llOffset = 0.00416666666667;
    var babyOffset = (llOffset / 2);  // offsets gridSelector 1/2 qtr min
    var drawGridSelectBox = false;

    var noLabels = true;
    var addGridOn = false;
    var drawGridBox = false;
    var deSelectOn = false;
    var gridOverBox = new google.maps.Polygon();
    var gridSelectBox = new google.maps.Polygon();
    var gridUserArea = new google.maps.Polygon();
    var qtrNELatLngCode;
    var qtrSWLatLngCode;

    var gridline;
    var latPolylines = [];
    var lngPolylines = [];
    var lngLabels = [];
    var otherColor = "";
    var bounds = new google.maps.LatLngBounds();

    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: 14,
            streetViewControl: true,
            mapTypeId: google.maps.MapTypeId.ROADMAP,
            scaleControl: true
        });
       loadData();
        google.maps.event.addListener(map, "click", function (event) {
            if (addGridOn) { //spot on
                drawGridBox = true;//yellow box
                createGridBox(event.latLng);
                return;
            }

                if (drawGridSelectBox) createGridSelectBox(event.latLng);
        });


        google.maps.event.addListener(map, "idle", function () {
            var sLat = map.getCenter().lat();
            var sLng = map.getCenter().lng();
            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);
        qtrSWLatLngCode = ddToQM(bottomLat, leftLong);

        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() < 15)|| (noLabels==true)) {
            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 - 1; ++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());

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

    function createGridSelectBox(point) {
        // places the draggable, editable plumb colored box on the screen to select QtrMinutes


        var bottomLeftLat = (Math.floor(point.lat() / llOffset) * llOffset) - babyOffset;
        var bottomLeftLong = (Math.floor(point.lng() / llOffset) * llOffset) - babyOffset;

        var gridLineSquare = [
            new google.maps.LatLng(bottomLeftLat, bottomLeftLong),  //lwr left
            new google.maps.LatLng(bottomLeftLat, bottomLeftLong + llOffset),  //lwr right
            new google.maps.LatLng(bottomLeftLat + llOffset, bottomLeftLong + llOffset),  //upr right
            new google.maps.LatLng(bottomLeftLat + llOffset, bottomLeftLong)];  //upr left
        //auto-complete to lwr left

        if (drawGridSelectBox == true) {
            gridSelectBox = new google.maps.Polygon({
                path: gridLineSquare,
                draggable: true,
                geodesic: true,
                editable: true,
                fillColor: "#FF0000",
                fillOpacity: 0.35,
                strokeColor: "#CC0099",
                strokeOpacity: 0.1,
                strokeWeight: 1
            });

            gridSelectBox.setMap(map);
            drawGridSelectBox = false;
        }
    }

    function MarkArea(Lat, Lng, otherColor) {
        var latLng = new google.maps.LatLng(Lat, Lng);
        drawUserGrids(latLng, otherColor);
    }


    function DrawGridOn() {       //creates plumb GridSelectBox
//Fence On/Off
        if (document.getElementById("divFence").value=="Fence Off"){
            document.getElementById("divFence").value="Fence On";
            drawGridSelectBox = true;
        }
        else
        if (document.getElementById("divFence").value=="Fence On"){
            document.getElementById("divFence").value="Fence Off";
            CreateMask();
            gridSelectBox.setMap(null);
            drawGridSelectBox = false;
        }
        document.getElementById("divSpot").value="Trim Off";
        deSelectOn = false;
        addGridOn = false;
    }



    function CreateMask() {
        for (var xx = 0; xx < latPolylines.length; ++xx) {
            for (var yy = 0; yy < lngPolylines.length - 1; ++yy) {
                var latLng = new google.maps.LatLng(latPolylines[xx].getPath().getAt(0).lat(),
                        lngPolylines[yy].getPath().getAt(0).lng()); //

                if ((google.maps.geometry.poly.containsLocation(latLng, gridSelectBox))) {
                    createGridBox(latLng);
                }
            }
        }
    }

    function GotoLatLng(Lat, Lng) {
        var latlng = new google.maps.LatLng(Lat, Lng);
        map.setCenter(latlng);
    }


    function AddGridOn() {   // Allows adding 1 QtrMin Spot On
        if (document.getElementById("divSpot").value=="Trim Off"){
            document.getElementById("divSpot").value="Nibble On";
            addGridOn = false;
            deSelectOn = true;
        }
        else
        if (document.getElementById("divSpot").value=="Nibble On"){
            document.getElementById("divSpot").value="Spot On";
            deSelectOn = false;
            addGridOn = true;
        }
        else
        if (document.getElementById("divSpot").value=="Spot On"){
            document.getElementById("divSpot").value="Trim Off";
            deSelectOn = false;
            addGridOn = false;
        }
        //report status
    }

    function toggleButtons() {
        document.getElementById("divSpot").disabled=!document.getElementById("divSpot").disabled;
        document.getElementById("divFence").disabled=!document.getElementById("divFence").disabled;
        document.getElementById("divMask").disabled=!document.getElementById("divMask").disabled;
    }


    function NoLabelsOn() {
        noLabels = true;
    }

    function NoLabelsOff() {
        noLabels = false;
    }

    function ClearGrid() {
// removes entire yellow mask
        if (qtrArray) {
            for (var i in qtrArray) {
                qtrArray[i].setMap(null);
            }
        }
        qtrArray = [];
        idx = 0;
    }

    function ClearUserGrid() {
        // removes all mapped boxes
        if (userGridArray) {
            for (var i in userGridArray) {
                userGridArray[i].setMap(null);
            }
        }
        userGridArray = [];
    }


    function drawUserGrids(point, otherColor) {
        // Square limits
        //  these are QtrMinutes stored in the database and drawn


        var bottomLeftLat = (Math.floor(point.lat() / llOffset) * llOffset);
        var bottomLeftLong = (Math.floor(point.lng() / llOffset) * llOffset);

        var gridLineSquare = [
            new google.maps.LatLng(bottomLeftLat, bottomLeftLong),  //lwr left
            new google.maps.LatLng(bottomLeftLat, (bottomLeftLong + llOffset)),  //lwr right
            new google.maps.LatLng((bottomLeftLat + llOffset), (bottomLeftLong + llOffset)),  //upr right
            new google.maps.LatLng((bottomLeftLat + llOffset), bottomLeftLong)];  //upr left

            gridUserArea = new google.maps.Polygon({
                path: gridLineSquare,
                draggable: false,
                geodesic: true,
                editable: false,
                fillColor: otherColor,
                fillOpacity: 0.35,
                strokeColor: "#CC0099",
                strokeOpacity: 0.1,
                strokeWeight: 1
            });

            gridUserArea.setMap(map);
            userGridArray.push(gridUserArea);
    }

    function createGridBox(point) {
//creates the Yellow grid for New Qtr Minutes
        var arrayIdx = 0;
        var addListenersOnPolygon = function (polygon) {
            google.maps.event.addListener(polygon, 'click', function (event) {
                if (deSelectOn == true) {
                    arrayIdx = qtrArray.indexOf(polygon);
                    qtrArray.splice(arrayIdx, 1);
                    polygon.setMap(null);
                }
            });
        };

        var bottomLeftLat = (Math.floor(point.lat() / llOffset) * llOffset);
        var bottomLeftLong = (Math.floor(point.lng() / llOffset) * llOffset);

        var gridLineSquare = [
            new google.maps.LatLng(bottomLeftLat, bottomLeftLong),  //lwr left
            new google.maps.LatLng(bottomLeftLat, (bottomLeftLong + llOffset)),  //lwr right
            new google.maps.LatLng((bottomLeftLat + llOffset), (bottomLeftLong + llOffset)),  //upr right
            new google.maps.LatLng((bottomLeftLat + llOffset), bottomLeftLong)];  //upr left

        var maskQuarterMin = ddToQM(bottomLeftLat, bottomLeftLong);
        drawGridBox = true;
        if (qtrArray) {
            for (var i in qtrArray) {
                if (qtrArray[i].get("qtrMinute") == maskQuarterMin) {
                    drawGridBox = false;
                    break;
                }
            }
        }

        if (drawGridBox == true) {
            gridOverBox = new google.maps.Polygon({
                path: gridLineSquare,
                draggable: false,
                geodesic: true,
                editable: false,
                fillColor: "#EAED00",  //yellow
                fillOpacity: 0.35,
                strokeColor: "#CC0099",
                strokeOpacity: 0.1,
                strokeWeight: 1,
                qtrMinute: maskQuarterMin,
                indexID: ++idx
            });

            gridOverBox.setMap(map);
            addListenersOnPolygon(gridOverBox);
            qtrArray.push(gridOverBox);
        }
    }


    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 = "A";
                break;
            case 15 :
                qtrMin = "B";
                break;
            case 30 :
                qtrMin = "C";
                break;
            case 45 :
                qtrMin = "D";
                break;
        }
        interimResult += qtrMin;
        return interimResult;
    }

    function loadData(){
        dataLatArray.push("34.0020833333333");  dataLngArray.push("-84.0020833333333");
        dataLatArray.push("34.0020833333333");  dataLngArray.push("-84.00625");
        dataLatArray.push("34.0020833333333");  dataLngArray.push("-84.0104166666667");
        dataLatArray.push("34.00625");  dataLngArray.push("-84.0020833333333");
        dataLatArray.push("34.00625");  dataLngArray.push("-84.008333333");
        dataLatArray.push("34.00625");  dataLngArray.push("-84.012500000");
        dataLatArray.push("34.0104166666667");  dataLngArray.push("-84.0020833333333");
        dataLatArray.push("34.0104166666667");  dataLngArray.push("-84.00625");
        dataLatArray.push("34.0104166666667");  dataLngArray.push("-84.0104166666667");


    }
   function AddData(){
       var sLat = "";
       var sLng = "";

       for (var i = 0; i < dataLatArray.length; i++) {
           sLat = dataLatArray[i];
           sLng = dataLngArray[i];
           MarkArea(sLat, sLng, "#EE82EE");
       }


    }
</script>
</body>
</html>
贻贝

我都工作了。它需要两个解决方案。半字节正在添加zIndex值。需要发现我向用户数据添加了一个侦听器事件。

function drawUserGrids(point, otherColor) {
    // Square limits
    //  these are QtrMinutes stored in the database and drawn
    **var addListenersOnPolygon = function (polygon) {
        google.maps.event.addListener(polygon, 'click', function (event) {
            if (addGridOn) { //spot on
                drawGridBox = true;//yellow box
                createGridBox(event.latLng);
                return;
            }
        });
    };**

    var bottomLeftLat = (Math.floor(point.lat() / llOffset) * llOffset);
    var bottomLeftLong = (Math.floor(point.lng() / llOffset) * llOffset);

    var gridLineSquare = [
        new google.maps.LatLng(bottomLeftLat, bottomLeftLong),  //lwr left
        new google.maps.LatLng(bottomLeftLat, (bottomLeftLong + llOffset)),  //lwr right
        new google.maps.LatLng((bottomLeftLat + llOffset), (bottomLeftLong + llOffset)),  //upr right
        new google.maps.LatLng((bottomLeftLat + llOffset), bottomLeftLong)];  //upr left

    gridUserArea = new google.maps.Polygon({
        path: gridLineSquare,
        draggable: false,
        geodesic: true,
        editable: false,
        fillColor: otherColor,
        fillOpacity: 0.35,
        strokeColor: "#CC0099",
        strokeOpacity: 0.1,
        zIndex : 100,
        strokeWeight: 1
    });

    gridUserArea.setMap(map);
    **addListenersOnPolygon(gridUserArea);**
    userGridArray.push(gridUserArea);
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

用另一个多边形分割一个多边形

来自分类Dev

用另一个多边形分割一个多边形

来自分类Dev

传单绘制出多边形是否包含另一个多边形

来自分类Dev

检查一个多边形是否在PHP中的另一个多边形内

来自分类Dev

选择与另一个多边形相交(或完全在另一个多边形内)的多边形[R sf]

来自分类Dev

ShaderLab 偏移不渲染一个多边形在另一个上方

来自分类Dev

如何从R中的另一个shapefile中获取包含多边形质心的shapefile的多边形?

来自分类Dev

如何在python文件中从一个多边形移动到另一个多边形?

来自分类Dev

是否可以仅使用平行平移和比例缩放将一个多边形转换为另一个多边形?

来自分类Dev

剪辑路径多边形覆盖另一个

来自分类Dev

分割自相交多边形仅在Shapely中返回一个多边形

来自分类Dev

OpenCV Python将多边形从一个图像复制到另一个图像

来自分类Dev

jQuery和生成的SVG多边形-创建循环以给每个多边形一个唯一的类?

来自分类Dev

将许多小多边形组合成一个(一些)大多边形

来自分类Dev

Postgis得到一个最小面积的多边形,它将覆盖所有定义的多边形

来自分类Dev

绘制多边形时,Google Maps API v3在撤消按钮旁边添加另一个按钮

来自分类Dev

如何使用Leaflet一次仅编辑一个要素/多边形?

来自分类Dev

围绕一条线创建一个多边形

来自分类Dev

在Boost.Geometry中将两个多边形合并为一个多边形:仅外部点,无孔

来自分类Dev

Google地图绘制多边形并删除前一个

来自分类Dev

将相邻的梯形合并为一个多边形

来自分类Dev

ORACLE PL / SQL中是否有一个函数可以计算多边形的面积?

来自分类Dev

使用matplotlib-basemap将一个多边形添加到绘图中

来自分类Dev

在R或Matlab中绘制一个这样的多边形

来自分类Dev

如何找出一个点是否在Matlab中的固定多边形中?

来自分类Dev

在Qt中创建一个开放的多边形(线条)

来自分类Dev

使用ggplot在一个轴上的多个多边形

来自分类Dev

如果找到一个点是多边形内 - JAVA JTS / AWT / geotools

来自分类Dev

使用OpenCV检测拐角后绘制一个不相交的多边形

Related 相关文章

  1. 1

    用另一个多边形分割一个多边形

  2. 2

    用另一个多边形分割一个多边形

  3. 3

    传单绘制出多边形是否包含另一个多边形

  4. 4

    检查一个多边形是否在PHP中的另一个多边形内

  5. 5

    选择与另一个多边形相交(或完全在另一个多边形内)的多边形[R sf]

  6. 6

    ShaderLab 偏移不渲染一个多边形在另一个上方

  7. 7

    如何从R中的另一个shapefile中获取包含多边形质心的shapefile的多边形?

  8. 8

    如何在python文件中从一个多边形移动到另一个多边形?

  9. 9

    是否可以仅使用平行平移和比例缩放将一个多边形转换为另一个多边形?

  10. 10

    剪辑路径多边形覆盖另一个

  11. 11

    分割自相交多边形仅在Shapely中返回一个多边形

  12. 12

    OpenCV Python将多边形从一个图像复制到另一个图像

  13. 13

    jQuery和生成的SVG多边形-创建循环以给每个多边形一个唯一的类?

  14. 14

    将许多小多边形组合成一个(一些)大多边形

  15. 15

    Postgis得到一个最小面积的多边形,它将覆盖所有定义的多边形

  16. 16

    绘制多边形时,Google Maps API v3在撤消按钮旁边添加另一个按钮

  17. 17

    如何使用Leaflet一次仅编辑一个要素/多边形?

  18. 18

    围绕一条线创建一个多边形

  19. 19

    在Boost.Geometry中将两个多边形合并为一个多边形:仅外部点,无孔

  20. 20

    Google地图绘制多边形并删除前一个

  21. 21

    将相邻的梯形合并为一个多边形

  22. 22

    ORACLE PL / SQL中是否有一个函数可以计算多边形的面积?

  23. 23

    使用matplotlib-basemap将一个多边形添加到绘图中

  24. 24

    在R或Matlab中绘制一个这样的多边形

  25. 25

    如何找出一个点是否在Matlab中的固定多边形中?

  26. 26

    在Qt中创建一个开放的多边形(线条)

  27. 27

    使用ggplot在一个轴上的多个多边形

  28. 28

    如果找到一个点是多边形内 - JAVA JTS / AWT / geotools

  29. 29

    使用OpenCV检测拐角后绘制一个不相交的多边形

热门标签

归档