计算 JavaScript 中两个多边形的重叠百分比
Calculating the percent overlap of two polygons in JavaScript
问题是:我有 geoJSON 和 topoJSON 文件,它们为我提供了人口普查区块组和投票区的多边形。我正在尝试查看给定的人口普查区块组与给定的辖区有多少重叠。
我在其他语言中看到了几个我所追求的例子——即R 和一些 GIS 工具——但我试图将其编写为 Node.js 脚本。几个问题:
- 是否有一个 NPM 模块(我已经进行了大量的谷歌搜索,但我还没有找到)可以吐出重叠百分比?
- 是否有我应该知道的算法或用另一种语言编写的示例(我看过,但我不知道从哪里开始)并且我可以移植到 JavaScript?
- 做不到这些,谁能向我解释一下我会如何考虑为此创建一个算法?
最后,最终产品看起来像这样——假设我有选区和区块组数组,每个都是一个对象,其几何体 属性 包含选区的多边形数据或块组,并想象我有一个名为 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,但如果 多边形重叠,则只给出 ,而不是它们重叠的程度。)
计算重叠百分比
计算两个多边形的交集
Intersection = intersect(Precinct, Block)
用感兴趣的父多边形的面积除以交集的面积。
Overlap = area(Intersection) / area(Parent)
不太清楚你所说的重叠百分比是什么意思。父多边形可能是几种可能性之一
a) area(Intersection) / area(Precinct)
b) area(Intersection) / area(Block)
c) area(Intersection) / area(Precinct union Block)
至于 javascript 图书馆,这个似乎有你需要的 Intersection.js
还有 JSTS Topology Suite which can do geospatial processing in JavaScript. See Node.js examples here.
您可以使用 Turf js 进行空间重叠。它具有 JSTS(以及更多)的特性,但非常模块化。
turf-intersect 采用两个多边形和 returns 表示交叉点的多边形。
geojson-area 取多边形和 returns 面积(以平方米为单位)。
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;
问题是:我有 geoJSON 和 topoJSON 文件,它们为我提供了人口普查区块组和投票区的多边形。我正在尝试查看给定的人口普查区块组与给定的辖区有多少重叠。
我在其他语言中看到了几个我所追求的例子——即R 和一些 GIS 工具——但我试图将其编写为 Node.js 脚本。几个问题:
- 是否有一个 NPM 模块(我已经进行了大量的谷歌搜索,但我还没有找到)可以吐出重叠百分比?
- 是否有我应该知道的算法或用另一种语言编写的示例(我看过,但我不知道从哪里开始)并且我可以移植到 JavaScript?
- 做不到这些,谁能向我解释一下我会如何考虑为此创建一个算法?
最后,最终产品看起来像这样——假设我有选区和区块组数组,每个都是一个对象,其几何体 属性 包含选区的多边形数据或块组,并想象我有一个名为 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,但如果 多边形重叠,则只给出 ,而不是它们重叠的程度。)
计算重叠百分比
计算两个多边形的交集
Intersection = intersect(Precinct, Block)
用感兴趣的父多边形的面积除以交集的面积。
Overlap = area(Intersection) / area(Parent)
不太清楚你所说的重叠百分比是什么意思。父多边形可能是几种可能性之一
a) area(Intersection) / area(Precinct) b) area(Intersection) / area(Block) c) area(Intersection) / area(Precinct union Block)
至于 javascript 图书馆,这个似乎有你需要的 Intersection.js
还有 JSTS Topology Suite which can do geospatial processing in JavaScript. See Node.js examples here.
您可以使用 Turf js 进行空间重叠。它具有 JSTS(以及更多)的特性,但非常模块化。
turf-intersect 采用两个多边形和 returns 表示交叉点的多边形。
geojson-area 取多边形和 returns 面积(以平方米为单位)。
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;