2016-12-16 5 views
2

У меня есть 5000 + точек LatLng, и для каждого из них я хотел бы узнать, с какой функцией (областью) они принадлежат. Характеристики идут от a kmz layer by Philippe Ivaldi, преобразованных в GeoJSON.Лучший способ разделить много точек на несколько функций?

В настоящее время я делаю это с turfjs в двойном цикле for. Как и ожидалось, расчет замораживает браузер в течение десяти минут, что не очень удобно.

Вот мой код:

function countCeaByLayer(geoJsonLayer){ 
    jQuery.getJSON('http://localhost/server/retrieveData.php', function(data){ 
      var turfPoints = []; 
      for(var i = 0; i < data.length; i++){ 
       turfPoints.push(turf.point([data[i].longitudeWGS84, data[i].latitudeWGS84])); 
      } 

      var features = geoJsonLayer.toGeoJSON().features; 
      for(var i = 0; i < features.length; i++){ 
       var turfPointsNew = []; 
       for(var j = 0; j < turfPoints.length; j++){ 

        var isInside = turf.inside(turfPoints[j], features[i]); 
        if(!isInside) turfPointsNew.push(turfPoints[j]); 
       } 
       turfPoints = turfPointsNew; 
      } 

      console.log("done"); 
    }); 
} 

Что я могу сделать, чтобы избежать замораживания браузера?

  • Сделать его асинхронным?
  • Выполняют ли расчеты с node и turfjs на сервере?
  • Или развернуть leafletjs на сервере с node и leaflet-headless?

... или я должен только справиться с этим?

Спасибо!

ответ

1

Чтобы оптимизировать код, вы должны сделать что-то вроде этого.

Петля над точками.

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

Если это находится в пределах границ, пройдите проверку, если она находится внутри самого многоугольника.

Если это так, сломайте цикл, итерацию по полигонам, и перейдите к следующей точке.

Например, это может быть:

points.forEach(function(point) { 
    polygons.some(function(polygon) { 
     if (polygon.getBounds().contains(point)) { // or other method if you are not playing with Leaflet features 
      if (turf.isInside(polygon, point) { // for example, not sure this method actually exists but you get the concept 
       // point is within the polygon, do tuff 
       return true; // break the some loop 
      } 
     } 
    }); 
}); 

Я сам кое-что разработана именно делает то же самое и на основе торфа, я запускаю его на стороне клиента (и мои петли сделаны с .some , а не классический цикл for, поэтому он может даже пойти дальше с точки зрения производительности), и я никогда не сталкивался с замораживанием.

С моей точки зрения, 5000 точек - это peanut для обработки браузера, но если ваши многоугольники действительно сложны (десятки сотен тысяч вершин), это может замедлить процесс, конечно.

Br, Винсент

+0

* арахис * действительно.Я просто понял, что мой поставщик геокодирования дает мне LatLngs в 'string', который, по-видимому, замедляет турфьи значительно без предупреждения! Приведение их к 'float' делает расчет за несколько секунд. ** head slam ** Тем не менее, я вернусь к вам, как только я попробую ваш алгоритм, который действительно должен обеспечить хороший прирост скорости. Благодаря! –

+0

Это быстрее. Отличная работа. –

0

Если ответ Stranded Kid является излишеством для вас,

geoJsonLayer.eachLayer(function(layer){ 
    var within = turf.within(turf.featureCollection(turfPoints),turf.featureCollection([layer.toGeoJSON()])); 
    console.dir(within); 
}); 

И убедитесь, что ваши координаты поплавки и не строки, потому что это то, что привело к замедлению для меня.