【问题标题】:Mapbox autocomplete get Long and LatMapbox 自动完成获取 Long 和 Lat
【发布时间】:2018-06-25 08:49:56
【问题描述】:

我在一个 vue 组件中使用带有自动完成功能的 Mapbox:

<template>
    <div>
        <div id='geocoder'></div>
    </div>
</template>

<script>
    import mapboxgl from 'mapbox-gl';

    export default {
        data() {
            return {
                map: null
            }
        },

        created() {
            Event.$on('map-created', (map) => {
                this.map = map;

                let geocoder = new MapboxGeocoder({
                    accessToken: mapboxgl.accessToken,
                });

                document.getElementById('geocoder').appendChild(geocoder.onAdd(this.map));
            });
        }
    }
</script>

它可以工作,但是当用户点击结果时,我如何获得 long 和 lat?

有什么活动吗?在文档中找不到任何内容。

谢谢!

【问题讨论】:

    标签: javascript vue.js mapbox-gl-js


    【解决方案1】:

    试试这个:

    this.map.on('click', '[YOUR LAYER ID]', (event) => {
    
        console.log(event.features[0].geometry.coordinates);
    
    });
    

    当我添加自己的图层时,它对我有帮助。

    【讨论】:

    • 谢谢,但我不想点击地图。我有自动完成输入字段。当用户点击找到的位置时,我想从中获取经纬度。
    • 是否可以在没有地图的情况下使用自动完成输入字段?因为我不需要那个。
    【解决方案2】:

    没有地图的自动完成输入字段

    <!DOCTYPE html>
    <html>
    <head>
        <meta charset="utf-8"/>
        <title>Add a geocoder</title>
        <meta name="viewport" content="initial-scale=1,maximum-scale=1,user-scalable=no"/>
    
        <script src="https://code.jquery.com/jquery-3.4.1.js" type="text/javascript"></script>
        <script src="https://unpkg.com/@mapbox/mapbox-sdk/umd/mapbox-sdk.min.js"></script>
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <style>
            * {
                box-sizing: border-box;
            }
    
            body {
                font: 16px Arial;
            }
    
            /*the container must be positioned relative:*/
            .autocomplete {
                position: relative;
                display: inline-block;
            }
    
            input {
                border: 1px solid transparent;
                background-color: #f1f1f1;
                padding: 10px;
                font-size: 16px;
            }
    
            input[type=text] {
                background-color: #f1f1f1;
                width: 100%;
            }
    
            input[type=submit] {
                background-color: DodgerBlue;
                color: #fff;
                cursor: pointer;
            }
    
            .autocomplete-items {
                position: absolute;
                border: 1px solid #d4d4d4;
                border-bottom: none;
                border-top: none;
                z-index: 99;
                /*position the autocomplete items to be the same width as the container:*/
                top: 100%;
                left: 0;
                right: 0;
            }
    
            .autocomplete-items div {
                padding: 10px;
                cursor: pointer;
                background-color: #fff;
                border-bottom: 1px solid #d4d4d4;
            }
    
            /*when hovering an item:*/
            .autocomplete-items div:hover {
                background-color: #e9e9e9;
            }
    
            /*when navigating through the items using the arrow keys:*/
            .autocomplete-active {
                background-color: DodgerBlue !important;
                color: #ffffff;
            }
        </style>
    </head>
    <body>
    
    <h2>Autocomplete</h2>
    
    <p>Start typing:</p>
    
    <!--Make sure the form has the autocomplete function switched off:-->
    <form autocomplete="off" action="/action_page.php">
        <div class="autocomplete" style="width:300px;">
            <input id="myInput" type="text" name="myCountry" placeholder="Country">
        </div>
        <input type="submit">
    </form>
    
    <script>
    
        var geocodingClient = mapboxSdk({accessToken: 'ADD_YOUR_ACCESS_TOKEN_HERE'});
    
        function autocompleteSuggestionMapBoxAPI(inputParams, callback) {
            geocodingClient.geocoding.forwardGeocode({
                query: inputParams,
                countries: ['In'],
                autocomplete: true,
                limit: 5,
            })
                .send()
                .then(response => {
                    const match = response.body;
                    callback(match);
                });
        }
    
        function autocompleteInputBox(inp) {
            var currentFocus;
            inp.addEventListener("input", function (e) {
                var a, b, i, val = this.value;
                closeAllLists();
                if (!val) {
                    return false;
                }
                currentFocus = -1;
                a = document.createElement("DIV");
                a.setAttribute("id", this.id + "autocomplete-list");
                a.setAttribute("class", "autocomplete-items");
                this.parentNode.appendChild(a);
    
                // suggestion list MapBox api called with callback
                autocompleteSuggestionMapBoxAPI($('#myInput').val(), function (results) {
                    results.features.forEach(function (key) {
                        b = document.createElement("DIV");
                        b.innerHTML = "<strong>" + key.place_name.substr(0, val.length) + "</strong>";
                        b.innerHTML += key.place_name.substr(val.length);
                        b.innerHTML += "<input type='hidden' data-lat='" + key.geometry.coordinates[1] + "' data-lng='" + key.geometry.coordinates[0] + "'  value='" + key.place_name + "'>";
                        b.addEventListener("click", function (e) {
                            let lat = $(this).find('input').attr('data-lat');
                            let long = $(this).find('input').attr('data-lng');
                            inp.value = $(this).find('input').val();
                            $(inp).attr('data-lat', lat);
                            $(inp).attr('data-lng', long);
                            closeAllLists();
                        });
                        a.appendChild(b);
                    });
                })
            });
    
    
            /*execute a function presses a key on the keyboard:*/
            inp.addEventListener("keydown", function (e) {
                var x = document.getElementById(this.id + "autocomplete-list");
                if (x) x = x.getElementsByTagName("div");
                if (e.keyCode == 40) {
                    /*If the arrow DOWN key is pressed,
                    increase the currentFocus variable:*/
                    currentFocus++;
                    /*and and make the current item more visible:*/
                    addActive(x);
                } else if (e.keyCode == 38) { //up
                    /*If the arrow UP key is pressed,
                    decrease the currentFocus variable:*/
                    currentFocus--;
                    /*and and make the current item more visible:*/
                    addActive(x);
                } else if (e.keyCode == 13) {
                    /*If the ENTER key is pressed, prevent the form from being submitted,*/
                    e.preventDefault();
                    if (currentFocus > -1) {
                        /*and simulate a click on the "active" item:*/
                        if (x) x[currentFocus].click();
                    }
                }
            });
    
            function addActive(x) {
                /*a function to classify an item as "active":*/
                if (!x) return false;
                /*start by removing the "active" class on all items:*/
                removeActive(x);
                if (currentFocus >= x.length) currentFocus = 0;
                if (currentFocus < 0) currentFocus = (x.length - 1);
                /*add class "autocomplete-active":*/
                x[currentFocus].classList.add("autocomplete-active");
            }
    
            function removeActive(x) {
                /*a function to remove the "active" class from all autocomplete items:*/
                for (var i = 0; i < x.length; i++) {
                    x[i].classList.remove("autocomplete-active");
                }
            }
    
            function closeAllLists(elmnt) {
                /*close all autocomplete lists in the document,
                except the one passed as an argument:*/
                var x = document.getElementsByClassName("autocomplete-items");
                for (var i = 0; i < x.length; i++) {
                    if (elmnt != x[i] && elmnt != inp) {
                        x[i].parentNode.removeChild(x[i]);
                    }
                }
            }
    
            /*execute a function when someone clicks in the document:*/
            document.addEventListener("click", function (e) {
                closeAllLists(e.target);
            });
        }
    
        autocompleteInputBox(document.getElementById("myInput"));
    </script>
    
    
    </body>
    </html>
    

    【讨论】:

      【解决方案3】:

      以下代码将为您提供自动完成结果中所选结果的长纬度。这行得通。

      var geocoder = new MapboxGeocoder({
          accessToken: mapboxgl.accessToken,
          types : 'place',
          mapboxgl: mapboxgl
      });
      
      //Listen for the result event from the geocoder.
      //'result' event is triggered when the user makes a selection
      geocoder.on('result', function(e) {
          var latlong = e.result.center;
      });
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-05-20
        • 1970-01-01
        • 1970-01-01
        • 2018-09-06
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多