jwest - 3 months ago 13

Javascript Question

Here's the problem: I have geoJSON and topoJSON files that give me the polygons for Census block groups and voting precincts. I'm trying to see by how much a given Census block group overlaps with a given precinct.

I've seen a couple examples of what I'm after in other languages—i.e. R and in some GIS tools—but I'm trying to write this as a Node.js script. A few questions:

- Is there an NPM module (I've done a fair amount of Googling, but I haven't found one) that can spit out the percent overlap?
- Is there an algorithm, or an exmaple written in another language, that I should know about (I've looked, but I haven't the foggiest where to begin) and that I could port to JavaScript?
- Failing these, can someone explain to me how I
*would*go about thinking about creating an algorithm for this?

In the end, the final product would look something like this—imagining that I have arrays of precincts and blockgroups, and each one is an object with a geometry property that contains the polygon data for the precinct or block group, and also imagining that I have a function called

`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

});

}

}

}

(I've seen this module, but that only gives

Answer

To compute the overlapping percentage

Compute the intersection of the two polygons

`Intersection = intersect(Precinct, Block)`

Divide the area of Intersection by the area of the parent polygon of interest.

`Overlap = area(Intersection) / area(Parent)`

It is a little unclear what you mean by the percent overlap. The parent polygon could be one of several possibilities

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

As for a javascript library, this one seems to have what you need Intersection.js

There's also the JSTS Topology Suite which can do geospatial processing in JavaScript. See Node.js examples here.