2015-06-21 6 views
3

Вот проблема: у меня есть файлы geoJSON и topoJSON, которые дают мне полигоны для групп блоков переписи и участков для голосования. Я пытаюсь понять, насколько данная группа блоков переписи перекрывается с данным участком.Вычисление процентного перекрытия двух полигонов в JavaScript

Я видел пару примеров того, что мне нужно на других языках - т. Е. R и в некоторых инструментах GIS, но я пытаюсь записать это как скрипт Node.js. Несколько вопросов:

  1. Есть ли модуль NPM (я сделал много Googling, но я не нашел его), который может выплюнуть процентное совпадение?
  2. Есть ли алгоритм или exmaple, написанный на другом языке, о котором я должен знать (я смотрел, но у меня нет самого тупого, с чего начать), и что я мог бы переносить на JavaScript?
  3. Неудача, может кто-нибудь объяснить мне, как я будет задуматься о создании алгоритма для этого?

В конце концов, конечный продукт будет выглядеть примерно так-себе, что у меня есть массивы участков и blockgroups, и каждый из них представляет собой объект со свойством геометрии, которая содержит данные полигонов для участковых или групп блоков , а также полагая, что я функция называется overlap, что, когда прошло два полигона выплевывает процент перекрытия:

// Iterate over each precinct. 
_.each(precincts, function (precinct) { 

    // Iterate over each blockgroup. 
    _.each(blockgroups, function (blockgroup) { 

     // Get the overlap for the current precinct and blockgroup. 
     var o = overlap(precinct.geometry, blockgroup.geometry); 

     // If they overlap at all... 
     if (o > 0) { 

      // ...Add information about the overlap to the precinct. 
      precinct.overlaps.push({ 
       blockgroup: blockgroup.id, 
       overlap: o 
      }); 

     } 

    } 

} 

(я видел this module, но это только дает если полигоны перекрываются, а не сколько они делают.)

ответ

3

Для вычисления перекрывающихся в процентах

  1. вычислить пересечение двух полигонов

    Intersection = intersect(Precinct, Block) 
    
  2. Разделить область пересечения площадью родительского многоугольника, представляющего интерес.

    Overlap = area(Intersection)/area(Parent) 
    
  3. Немного непонятно, что вы подразумеваете под процентным перекрытием. Родитель полигон может быть один из нескольких возможных вариантов

    a) area(Intersection)/area(Precinct) 
    
    b) area(Intersection)/area(Block) 
    
    c) area(Intersection)/area(Precinct union Block) 
    

Что касается библиотеки JavaScript, это, кажется, есть то, что вам нужно Intersection.js

Там также JSTS Topology Suite, которые могут сделать геопространственную обработку в JavaScript. См. Примеры Node.js here.

+0

Это выглядит великолепно. Спасибо! И вы совершенно правы, что неясно, что я имел в виду, когда процент перекрывается. Я имел в виду что-то б). – jwest

0

Вы можете делать пространственные перекрытия с помощью Turf js. Он имеет особенности JSTS (и более), но очень модульный.

+0

Не полезно, если вы не описываете, как это сделать. – Gajus

2

turf-intersect принимает два полигона и возвращает многоугольник, представляющий пересечение.

geojson-area берет многоугольник и возвращает площадь в квадратных метрах.

npm install turf 
npm install geojson-area 

var turf = require('turf'); 
var geojsonArea = require('geojson-area'); 

var poly1 = { 
"type": "Feature", 
    "geometry": { 
    "type": "Polygon", 
    "coordinates": [[ 
     [-122.801742, 45.48565], 
     [-122.801742, 45.60491], 
     [-122.584762, 45.60491], 
     [-122.584762, 45.48565], 
     [-122.801742, 45.48565] 
    ]] 
    } 
} 
var poly2 = { 
"type": "Feature", 
    "geometry": { 
    "type": "Polygon", 
    "coordinates": [[ 
     [-122.520217, 45.535693], 
     [-122.64038, 45.553967], 
     [-122.720031, 45.526554], 
     [-122.669906, 45.507309], 
     [-122.723464, 45.446643], 
     [-122.532577, 45.408574], 
     [-122.487258, 45.477466], 
     [-122.520217, 45.535693] 
    ]] 
    } 
} 

var intersection = turf.intersect(poly1, poly2); 

var area_intersection = geojsonArea.geometry(intersection.geometry); 
var area_poly1  = geojsonArea.geometry(poly1.geometry); 

var percent_poly1_covered_by_poly2 = (area_intersection/area_poly1)*100;