计算JavaScript

时间:2015-06-21 22:51:29

标签: javascript node.js algorithm geojson topojson

问题在于:我有geoJSON和topoJSON文件,它们为人口普查区块组和投票区提供了多边形。我试图了解给定的Census区块组与给定区域重叠的程度。

我已经看过几个我用其他语言表达的例子 - 即。 R以及一些GIS工具 - 但我试图将其写为Node.js脚本。几个问题:

  1. 是否有NPM模块(我已经完成了相当数量的Google搜索,但我还没有找到)可以吐出重叠百分比?
  2. 我是否应该知道一种算法或用另一种语言编写的例子(我已经看过,但我还没有最开始的地方)并且我可以移植到JavaScript?
  3. 如果没有这些,有人可以向我解释我将如何考虑为此创建算法吗?
  4. 最后,最终产品看起来像这样 - 想象我有区域和块组的数组,每个都是一个具有几何属性的对象,该属性包含区域或块组的多边形数据,以及想象我有一个名为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 个答案:

答案 0 :(得分:5)

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;

答案 1 :(得分:4)

计算重叠百分比

  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)
    
  4. 至于javascript库,这个似乎有你需要的Intersection.js

    还有JSTS Topology Suite可以在JavaScript中进行地理空间处理。请参阅Node.js示例here

答案 2 :(得分:0)

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