Возвращает полигоны листовки GeoJSON, которые пересекают точку с библиотекой Turf JS

#javascript #leaflet #turfjs

#javascript #листовка #turfjs

Вопрос:

Листовка и дерн. Я пытаюсь найти все слои на карте листовки, которые пересекают точку, когда пользователь нажимает на карту. Я использую библиотеку turf для проверки этого. В консоли, когда я нажимаю на карту, возвращается эта ошибка:

 var c = new L.GeoJSON.AJAX("http://127.0.0.1:8000/childcare_buff_data/",{
        style: color(c, "orange", 0.8)})
        ;
    c.addTo(map);

    map.on('click',function(e){
        lat = e.latlng.lat;
        lon = e.latlng.lng;
        ProcessClick(lat,lon)
    });

    var theMarker;
    var a;

    function ProcessClick(lat,lon){
        theMarker = L.marker([lat,lon]).addTo(map);
        c.eachLayer(function(layer) {
            intersects=turf.intersect(theMarker.toGeoJSON(),layer.toGeoJSON());
            if (intersects){
                a=layer.feature.properties.buff
                console.log(a);
                }
            })};
  

Я получаю эту ошибку

 turf.min.js:1 Uncaught TypeError: Cannot read property 'length' of null
    at turf.min.js:1
    at turf.min.js:1
    at S (turf.min.js:1)
    at Pn (turf.min.js:1)
    at Object.Lo [as intersect] (turf.min.js:1)
    at js2.js:31
    at eachLayer (leaflet.js:5)
    at ProcessClick (js2.js:30)
    at e.<anonymous> (js2.js:22)
    at e.fire (leaflet.js:5)
  

введите описание изображения здесь

вот geojson http://www.mediafire.com/file/9fnbz32ib9n1aaj/childcare.geojson/file

Обновить

используя

turf.booleanWithin(theMarker.toGeoJSON(),geom.toGeoJSON());

я получаю

 turf.min.js:1 Uncaught Error: coordinates must only contain numbers
    at Y (turf.min.js:1)
    at Y (turf.min.js:1)
    at U (turf.min.js:1)
    at Pt (turf.min.js:1)
    at Object.Cn [as booleanWithin] (turf.min.js:1)
    at js2.js:33
    at eachLayer (leaflet.js:5)
    at ProcessClick (js2.js:31)
    at e.<anonymous> (js2.js:22)
    at e.fire (leaflet.js:5)
  

Ответ №1:

intersect ожидает два полигона в качестве своих параметров, но вы передаете ему точку, следовательно, отсутствует length свойство :

Берет два полигона и находит их пересечение

Попробуйте turf.booleanWithin(theMarker.toGeoJSON(), layer.toGeoJSON()) вместо:

Boolean-within возвращает true, если первая геометрия полностью находится внутри второй геометрии.

Комментарии:

1. Может быть, попробовать booleanPointInPolygon , кажется, это работает немного лучше с мультиполигонами. Вот простой пример jsfiddle.net/w6a3sogd/1

2. в итоге оказалось, что одна из строк в таблице postgresql имела полностью искаженную геометрию, поэтому, когда я преобразовывал ее в geojson, у нее не было никаких координат, поэтому я продолжал получать ошибку coordinates must only contain numbers

3. но вы говорите мне, что instersect — это неправильная функция, которая помогла мне. итак, я приму ваш ответ