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

Calculating the percent overlap of two polygons in JavaScript

本文关键字:多边形 两个 重叠 百分比 JavaScript 计算      更新时间:2023-09-26

问题是:我有geoJSON和topoJSON文件,它们为我提供了人口普查区块组和投票区的多边形。我试图通过一个特定的人口普查区块组与一个特定选区的重叠程度来观察。

我在其他语言中看到了一些我想要的例子,比如R和一些GIS工具,但我正试图将其作为Node.js脚本编写。几个问题:

  1. 有没有一个NPM模块(我在谷歌上搜索了很多,但还没有找到)可以吐出重叠百分比
  2. 有没有一种算法,或者用另一种语言编写的exmaple,我应该知道(我已经看过了,但我不知道从哪里开始),并且我可以移植到JavaScript
  3. 如果做不到这些,有人能向我解释一下我将如何考虑为此创建一个算法吗

最后,最终的产品看起来是这样的——想象我有分区和块组的阵列,每个分区和块都是一个具有几何属性的对象,其中包含分区或块组的多边形数据,还想象我有一个名为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
            });
        }
    }
}

(我看过这个模块,但它只给出如果多边形重叠,而不是它们重叠的程度。)

turf intersect获取两个多边形,并返回一个表示交集的多边形。

geojson区域获取一个多边形,并返回以平方米为单位的面积。

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;

计算重叠百分比

  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拓扑套件,它可以用JavaScript进行地理空间处理。请参阅此处的Node.js示例。

您可以使用Turf-js进行空间重叠。它具有JSTS(以及更多)的特性,但非常模块化。