计算JavaScript中两个多边形的重叠百分比

jwe*_*est 3 javascript algorithm geojson node.js topojson

问题出在这里:我有geoJSON和topoJSON文件,这些文件为我提供了人口普查区块组和投票区域的多边形。我正在尝试查看给定的人口普查区块组与给定的区域有多少重叠。

我已经看到了一些其他语言示例,例如R和某些GIS工具,但是我正在尝试将其编写为Node.js脚本。几个问题:

  1. 是否有可以吐出重叠百分比的NPM模块(我已经做了大量的Google搜索,但我还没有找到)。
  2. 是否有我应该了解的算法或用另一种语言编写的示例(我看过了,但是我从最模糊的地方开始)并且可以移植到JavaScript?
  3. 这些失败,能有人向我解释我怎么去想着创造这个算法?

最后,最终产品看起来像这样—想象我有一系列的区域和块组,每个对象都是一个具有geometry属性的对象,其中包含该区域或块组的多边形数据,并且还想象着我有一个称为的函数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
            });

        }

    }

}
Run Code Online (Sandbox Code Playgroud)

(我已经看到了这个模块,但只给出了如果多边形重叠的,而不是由他们做了多少事。)

Mik*_*ant 6

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;
Run Code Online (Sandbox Code Playgroud)


dpm*_*xvi 5

计算重叠百分比

  1. 计算两个多边形的交集

    Intersection = intersect(Precinct, Block)
    
    Run Code Online (Sandbox Code Playgroud)
  2. 将交集面积除以感兴趣的父多边形的面积。

    Overlap = area(Intersection) / area(Parent)
    
    Run Code Online (Sandbox Code Playgroud)
  3. 有点不清楚你所说的重叠百分比是什么意思。父多边形可能是多种可能性之一

    a) area(Intersection) / area(Precinct)
    
    b) area(Intersection) / area(Block)
    
    c) area(Intersection) / area(Precinct union Block)
    
    Run Code Online (Sandbox Code Playgroud)

至于javascript库,这个似乎有你需要的Intersection.js

还有JSTS Topology Suite,可以用 JavaScript 进行地理空间处理。请参阅此处的Node.js 示例。