Модуль Bing Maps SpatialMath Пересечение не точное с несколькими выводами с одинаковыми координатами - PullRequest
0 голосов
/ 29 августа 2018

Я понял проблему, хотя у меня есть тысячи булавок на карте, я использую инструмент рисования, чтобы рисовать фигуры свободной рукой, а затем выполняю пересечение на событии «DrawingEnded», хотя я мог видеть, что пересечение должно возвращать больше, чем оно на самом деле возвращается,

Я что-то упустил? Например, если под новой нарисованной областью находится около 500 пинов, метод пересечения возвращает только 100 или несколько больше,

Конфигурация My Spider Cluster: Microsoft.Maps.loadModule (['SpiderClusterManager'], function () {

            spiderManager = new SpiderClusterManager(map, pinssame, {

                //clusteredPinCallback: function (cluster) {
                //    //Customize clustered pushpin.
                //    cluster.setOptions({
                //        color: 'red',
                //        icon:'https://www.bingmapsportal.com/Content/images/poi_custom.png'
                //    });
                //},
                pinSelected: function (pin, cluster) {
                    if (cluster) {
                        showInfobox(cluster.getLocation(), pin);
                    } else {
                        showInfobox(pin.getLocation(), pin);
                    }
                },
                pinUnselected: function () {
                    hideInfobox();
                },
                gridSize: 80

            });
        });

`

Код функции пересечения, который срабатывает после события «DrawingEnded»: `function findIntersectingData (searchArea) { // Убедитесь, что область поиска является допустимым многоугольником, в его кольце должно быть 4 местоположения, поскольку оно автоматически закрывается. if (searchArea && searchArea.getLocations (). length> = 4) {

            //Get all the pushpins from the pinLayer.
            //var pins = spiderManager._data;

            //Using spatial math find all pushpins that intersect with the drawn search area.
            //The returned data is a copy of the intersecting data and not a reference to the original shapes, 
            //so making edits to them will not cause any updates on the map.
            var intersectingPins = Microsoft.Maps.SpatialMath.Geometry.intersection(pins, searchArea);
            //The data returned by the intersection function can be null, a single shape, or an array of shapes. 
            if (intersectingPins) {
                //For ease of usem wrap individudal shapes in an array.
                if (intersectingPins && !(intersectingPins instanceof Array)) {
                    intersectingPins = [intersectingPins];
                }
                var selectedPins = [];
                //Loop through and map the intersecting pushpins back to their original pushpins by comparing their coordinates.
                for (var j = 0; j < intersectingPins.length; j++) {
                    for (var i = 0; i < pins.length; i++) {
                        if (Microsoft.Maps.Location.areEqual(pins[i].getLocation(), intersectingPins[j].getLocation())) {
                            selectedPins.push(pins[i]);
                            break;
                        }
                    }
                }
                //Return the pushpins that were selected.
                console.log(selectedPins);
                return selectedPins;
            }
        }
        return null;
    }

`

Функция не возвращает точные данные пина, Я что-то здесь упускаю?

Любая помощь оценена,

Спасибо и С уважением, Шохил Сетия

ОБНОВЛЕНИЕ:

Просто понял, это предположение, у меня есть несколько пинов с одинаковыми координатами над слоем. Это причина того, что он возвращает только пины, которые пересекаются с разными координатами по карте?,

Спасибо и С уважением, Шохил Сетия

Ответы [ 2 ]

0 голосов
/ 30 августа 2018

Я получил решение, так как Intersection API игнорирует несколько pushPins с одинаковыми координатами , поэтому существует другой API с именем , содержащий , который принимает два параметра, которые форма и метка, и она возвращает, содержится ли она в этой форме или нет в логической форме. Так верно, если кнопка в этой форме, и ложь в другом.

        function findIntersectingData(searchArea) {
        //Ensure that the search area is a valid polygon, should have 4 Locations in it's ring as it automatically closes.
        if (searchArea && searchArea.getLocations().length >= 4) {
            var selectedPins = [];
            for (var i = 0; i < pins.length; i++) {
                if (Microsoft.Maps.SpatialMath.Geometry.contains(searchArea, pins[i])) {
                    selectedPins.push(pins[i]);
                }
            }
            //Return the pushpins that were selected.
            console.log(selectedPins);
            //return updatePrescriberTerr(selectedPins);
            return selectedPins;
        }
        return null;
    }

Следовательно, в приведенной выше функции мы можем зациклить ее из массива pushPins и сформировать соответствующий набор пересечений на основе логических значений.

Надеюсь, это поможет тем, у кого похожий сценарий!

С уважением,

Шохил Сетия

0 голосов
/ 30 августа 2018

Метод возвращает объекты, которые представляют пересечение, а не точные копии входных фигур. Так что да, если в пределах области находятся несколько кнопок с одинаковыми координатами, в результате будет получен только один значок с этими координатами, поскольку он достаточно хорош для представления.

Вы можете попробовать образец ниже, возвращается только одна метка:

// Creates a polygon of current map bounds
var polygon = new Microsoft.Maps.SpatialMath.locationRectToPolygon(map.getBounds());

// Creates a bunch of the pushpins of the same coordinates(map center)
var pushpin1 = new Microsoft.Maps.Pushpin(map.getCenter());
var pushpin2 = new Microsoft.Maps.Pushpin(map.getCenter());
var pushpin3 = new Microsoft.Maps.Pushpin(map.getCenter());
var pushpin4 = new Microsoft.Maps.Pushpin(map.getCenter());
var pushpin5 = new Microsoft.Maps.Pushpin(map.getCenter());

// Adds the shapes to map for some visualization
map.entities.push([polygon, pushpin1, pushpin2, pushpin3, pushpin4, pushpin5]);

// Only one pushpin is returned as result
var intersectingPin = Microsoft.Maps.SpatialMath.Geometry.intersection([pushpin1, pushpin2, pushpin3, pushpin4, pushpin5], polygon);

Вы проверили, увеличивается ли количество результатов при учете дубликатов?

...