Boris K
Boris K

Reputation: 3580

Checking if two GeoJSONs overlap

I've got two valid GeoJSONs. I'm trying to understand whether they overlap. I've been trying to use line-intersect from Turf.js, like this:

import { lineIntersect } from '@turf/turf';
if (lineIntersect(e.layer.toGeoJSON(), realGeoJSON)) 
    {
         console.log (lineIntersect(e.layer.toGeoJSON(), realGeoJSON));
    }

Unfortunately, this just brings back an empty feature collection.

For instance, here are two features which overlap (one contains the other,) yet when I run lineIntersect on them, I get an empty result:

{"type":"Feature","properties":{},"geometry":{"type":"Polygon","coordinates":[[[34.38151665119666,31.47890462548891,0],[34.24131053682105,31.39519970105964,0],[34.20391229566884,31.31046528984165,0],[34.31023972371427,31.12192885120737,0],[34.32238143660881,31.09608541854309,0],[34.32845010662197,31.08316227875504,0],[34.3399878573332,31.05111274029189,0],[34.3819736618827,30.87941536483305,0],[34.4625794738603,30.65469000345236,0],[34.46079897849552,30.63605651330755,0],[34.48093837332151,30.54064393834374,0],[34.48701144862344,30.52765539371588,0],[34.55491673915576,30.3971320487581,0],[34.57859864255086,30.33884544466566,0],[34.5841010709255,30.3195774836368,0],[34.59568048671346,30.28726986771069,0],[34.59452479274348,30.27479275329208,0],[34.62488304800757,30.20958854031441,0],[34.6387603290821,30.20222082678984,0],[34.71436347629015,30.07682031495306,0],[34.71259779426985,30.05809037881291,0],[34.71628915470217,30.02005342200006,0],[34.75076906620446,29.92290870131085,0],[34.75680680602306,29.90983473619655,0],[34.86200494951397,29.78080306661147,0],[34.86038824538134,29.76186588722682,0],[34.85985465965802,29.75554744508348,0],[34.87458404107667,29.67157102811895,0],[34.87967097237944,29.64566203932595,0],[34.88079268646108,29.57563973494665,0],[34.90538890070649,29.52945734421175,0],[34.98109436237601,29.5542870425272,0],[35.03949367509274,29.63847028614006,0],[35.09890268380539,29.73532624342861,0],[35.10662487673798,29.74108861079644,0],[35.15838643590403,29.83204001172806,0],[35.17581417200116,29.86220648447516,0],[35.17642201553415,29.86846832766622,0],[35.22752559603887,29.94641218538877,0],[35.23716690705381,29.97087168207232,0],[35.26672235396222,30.05048288346658,0],[35.27039417463298,30.08801137042606,0],[35.28897082403768,30.13071126439134,0],[35.18979861092051,30.25551467908188,0],[35.38491270168139,30.93027973988132,0],[35.45082126925127,31.06594264974105,0],[35.44722368690986,31.24990699939903,0],[35.39159459673273,31.49811901942546,0],[35.30663360486346,31.50514564876487,0],[35.22682220736229,31.51219288891959,0],[35.20182280376471,31.50399372918324,0],[35.20257232954722,31.51072084692123,0],[35.17845425556429,31.50456774949482,0],[35.17715019191054,31.5080912969423,0],[35.17584130839815,31.51161346815049,0],[35.17615545360398,31.51499006142148,0],[35.17634008732453,31.51701656989114,0],[35.19462720371881,31.51275211889307,0],[35.17373380395745,31.50634219008566,0],[35.17211642460078,31.50648424243521,0],[35.13663682917868,31.50923658211334,0],[35.10997231069795,31.50448491651967,0],[35.11045603614101,31.50175523199227,0],[35.10608104898849,31.49803734440621,0],[35.09319760456682,31.49631331040035,0],[35.0640867946593,31.4910299229135,0],[35.04236314932221,31.49608863302037,0],[35.02071025749389,31.50178829489378,0],[34.99360687527013,31.50914407573474,0],[34.98304638712193,31.51529139391714,0],[34.9607716570927,31.50874723841895,0],[34.96284549594341,31.51335157521662,0],[34.96554955203035,31.51652570530491,0],[34.96821565782273,31.51905477026719,0],[34.96915140126914,31.5203480011361,0],[34.95586297893289,31.50774103465133,0],[34.96594857172293,31.52806484995884,0],[34.96852953236886,31.53740852679276,0],[34.96525541695491,31.54445456073684,0],[34.96827302996868,31.55035702098375,0],[34.97157587431909,31.55896103778682,0],[34.97479844343971,31.56688530825338,0],[34.97513871614513,31.57026095463069,0],[34.97520672211002,31.57093623752663,0],[34.96206021732661,31.5910034931354,0],[34.96133836855449,31.591739276496,0],[34.94070502436983,31.60148403071715,0],[34.92241820431752,31.61106005296995,0],[34.89434374334633,31.60392503100067,0],[34.80687543628677,31.61045864537442,0],[34.79957082732486,31.61099992786523,0],[34.73003921185517,31.64144693398919,0],[34.63718286917748,31.65305512858577,0],[34.54700252433163,31.66989760698388,0],[34.52042121323742,31.61883522021243,0],[34.38151665119666,31.47890462548891,0]]]}}
,{"type":"Feature","properties":{},"geometry":{"type":"Polygon","coordinates":[[[34.928146,30.991737],[35.103928,30.982319],[35.005051,30.897511],[34.928146,30.991737]]]}}  ]

Upvotes: 1

Views: 3244

Answers (2)

Erik Hermansen
Erik Hermansen

Reputation: 2369

You can use intersect() (@turf/intersect) which returns a Feature representing all the shapes covering the intersection of your two GeoJSONs.

If you want to just know, true or false, if anything intersects between the two, any non-null response from the API will indicate intersection.

On the other hand, if you want to check for a case of overlapping instead of just intersection (the intersected shapes have area and are not just shared edges or points), the response needs to be parsed with an algorithm like this:

* If feature.geometry.type is "Polygon" or "MultiPolygon" then return true (it overlaps) * If feature.geometry.type is "GeometryCollection" then iterate through all members in the collection and return true if a "Polygon" or "MultiPolygon" is found. * Otherwise, return false. (no overlap)

Upvotes: 3

Boris K
Boris K

Reputation: 3580

Turns out that using Turf's booleanWithin function works. I'm also using booleanOverlaps for those edge cases. Like this:

if (
    booleanWithin(e.layer.toGeoJSON(), realGeoJSON) || booleanOverlaps(e.layer.toGeoJSON(), realGeoJSON)) 
      {this.props.setNewPlotRegion(a.RegionName);} 

Upvotes: 2

Related Questions