'Why is this SQL Geometry invalid?
Edit - I provided the wtk of the poly I had made valid. Updated with the invalid string. Sorry this seems to have turned by mind to mush.
I have a python process using that cuts an input dataset by a quad tree grid so that there are no polygons with more than 400 vertices. It then pushes the records into my database. The process has been working well until I pushed this row into my SQL Server Database and it tells me it is invalid geography. The SRID of the geography is 7844 (GDA 2020)
QUADDED_ID QUAD_ID PFI wkt
23218 7023 30007035 MULTIPOLYGON (((144.56174022200003 -36.72412881799994, 144.56174022200003 -36.724121159999982, 144.51328705100002 -36.724121159999982, 144.51313968200009 -36.725504011999931, 144.50147243700007 -36.724121159999982, 144.50083983200011 -36.724121159999982, 144.50083983200011 -36.730858658999978, 144.50087837100011 -36.730936683999971, 144.50112464300003 -36.731100616999981, 144.50227852500007 -36.731738958999983, 144.50486807100003 -36.734654775999957, 144.50508163100005 -36.734664717999976, 144.505419167 -36.73462993499993, 144.50572273100011 -36.734631203999982, 144.505936291 -36.734641144999955, 144.50624993200006 -36.73482344599995, 144.50641840900005 -36.73485130499995, 144.50662201000011 -36.734662104999984, 144.50678180700004 -36.734291739999946, 144.50693174800006 -36.733704129999978, 144.50709020300008 -36.733541895999963, 144.5121397050001 -36.733345636999957, 144.51199355300002 -36.735109730999966, 144.5127053440001 -36.737877590999972, 144.51309263500002 -36.737859952999941, 144.51890573300011 -36.738540372999978, 144.51922570800002 -36.738297044999968, 144.51944567300006 -36.738041087999932, 144.52027184200006 -36.737544268999955, 144.52111774200011 -36.736574380999969, 144.52122055700011 -36.736250351999956, 144.52121145900003 -36.735020156999951, 144.52081514600002 -36.733937083999933, 144.52068924800005 -36.73258474499994, 144.52044409900009 -36.731502291999959, 144.51989732900006 -36.730310462999967, 144.51945193500012 -36.729024418999984, 144.51931859700005 -36.728861658999961, 144.51836438500004 -36.728371104999951, 144.51797981600009 -36.728099177999979, 144.51789695000002 -36.727923102999966, 144.51791639200007 -36.727504112999952, 144.5183066620001 -36.726870340999938, 144.51835882800003 -36.726586673999975, 144.51829386200006 -36.726234934999979, 144.51772661400003 -36.725637817999939, 144.52393433500004 -36.725621727999965, 144.52949935400011 -36.725616276999972, 144.53554647400006 -36.725612458999933, 144.54186909000009 -36.725609406999979, 144.54565718400011 -36.725601840999957, 144.55195207300005 -36.725625857999944, 144.56046184000002 -36.725614432999976, 144.55976377700006 -36.724121485999945, 144.56174022200003 -36.72412881799994)))
When I use the IsValidDetailed() function it returns "Not valid because some portion of polygon ring (1) lies in the interior of a polygon." I've plotted all the points and I can't see why it would be invalid. The only thing I can see is that there is a sliver that is only 4cm across, but I would have thought 4cm isn't small enough to cause an issue.
If I put it into a geometry it is valid, but I need the final result as a geography type.
Does anyone have any ideas of what the issue may be?
added code
DECLARE @g geography;
SET @g = geography::STGeomFromText('MULTIPOLYGON (((144.56174022200003 -36.72412881799994, 144.56174022200003 -36.724121159999982, 144.51328705100002 -36.724121159999982, 144.51313968200009 -36.725504011999931, 144.50147243700007 -36.724121159999982, 144.50083983200011 -36.724121159999982, 144.50083983200011 -36.730858658999978, 144.50087837100011 -36.730936683999971, 144.50112464300003 -36.731100616999981, 144.50227852500007 -36.731738958999983, 144.50486807100003 -36.734654775999957, 144.50508163100005 -36.734664717999976, 144.505419167 -36.73462993499993, 144.50572273100011 -36.734631203999982, 144.505936291 -36.734641144999955, 144.50624993200006 -36.73482344599995, 144.50641840900005 -36.73485130499995, 144.50662201000011 -36.734662104999984, 144.50678180700004 -36.734291739999946, 144.50693174800006 -36.733704129999978, 144.50709020300008 -36.733541895999963, 144.5121397050001 -36.733345636999957, 144.51199355300002 -36.735109730999966, 144.5127053440001 -36.737877590999972, 144.51309263500002 -36.737859952999941, 144.51890573300011 -36.738540372999978, 144.51922570800002 -36.738297044999968, 144.51944567300006 -36.738041087999932, 144.52027184200006 -36.737544268999955, 144.52111774200011 -36.736574380999969, 144.52122055700011 -36.736250351999956, 144.52121145900003 -36.735020156999951, 144.52081514600002 -36.733937083999933, 144.52068924800005 -36.73258474499994, 144.52044409900009 -36.731502291999959, 144.51989732900006 -36.730310462999967, 144.51945193500012 -36.729024418999984, 144.51931859700005 -36.728861658999961, 144.51836438500004 -36.728371104999951, 144.51797981600009 -36.728099177999979, 144.51789695000002 -36.727923102999966, 144.51791639200007 -36.727504112999952, 144.5183066620001 -36.726870340999938, 144.51835882800003 -36.726586673999975, 144.51829386200006 -36.726234934999979, 144.51772661400003 -36.725637817999939, 144.52393433500004 -36.725621727999965, 144.52949935400011 -36.725616276999972, 144.53554647400006 -36.725612458999933, 144.54186909000009 -36.725609406999979, 144.54565718400011 -36.725601840999957, 144.55195207300005 -36.725625857999944, 144.56046184000002 -36.725614432999976, 144.55976377700006 -36.724121485999945, 144.56174022200003 -36.72412881799994)))', 7844);
SELECT @g.IsValidDetailed();
returns 24409: Not valid because some portion of polygon ring (1) lies in the interior of a polygon. The problem occurs in entry (2) in a geometry collection.
Thanks
Solution 1:[1]
It appears that there isn't an answer to this using the GDA2020 SRID. If I change it to VicGrid2020 it will work, but that can't be used for the work I'm doing. As I sort of understand it, it is an issue with greater circles. It will work with a geometry as they use planar space rather than geodesic.
I have been able to convince the downstream team to convert there code into Geometry which doesn't seem to have caused them any issues.
Solution 2:[2]
Maybe try using parse? I'm unable to get the same error as it just loads on my side, tried on SQL Server 2019
edit ok parse didn't work, try the MakeValid() to gently nudge the poly to fit
DECLARE @g geography;
SET @g = geography::STGeomFromText('MULTIPOLYGON (((144.56174022200003 -36.72412881799994, 144.56174022200003 -36.724121159999982, 144.51328705100002 -36.724121159999982, 144.51313968200009 -36.725504011999931, 144.50147243700007 -36.724121159999982, 144.50083983200011 -36.724121159999982, 144.50083983200011 -36.730858658999978, 144.50087837100011 -36.730936683999971, 144.50112464300003 -36.731100616999981, 144.50227852500007 -36.731738958999983, 144.50486807100003 -36.734654775999957, 144.50508163100005 -36.734664717999976, 144.505419167 -36.73462993499993, 144.50572273100011 -36.734631203999982, 144.505936291 -36.734641144999955, 144.50624993200006 -36.73482344599995, 144.50641840900005 -36.73485130499995, 144.50662201000011 -36.734662104999984, 144.50678180700004 -36.734291739999946, 144.50693174800006 -36.733704129999978, 144.50709020300008 -36.733541895999963, 144.5121397050001 -36.733345636999957, 144.51199355300002 -36.735109730999966, 144.5127053440001 -36.737877590999972, 144.51309263500002 -36.737859952999941, 144.51890573300011 -36.738540372999978, 144.51922570800002 -36.738297044999968, 144.51944567300006 -36.738041087999932, 144.52027184200006 -36.737544268999955, 144.52111774200011 -36.736574380999969, 144.52122055700011 -36.736250351999956, 144.52121145900003 -36.735020156999951, 144.52081514600002 -36.733937083999933, 144.52068924800005 -36.73258474499994, 144.52044409900009 -36.731502291999959, 144.51989732900006 -36.730310462999967, 144.51945193500012 -36.729024418999984, 144.51931859700005 -36.728861658999961, 144.51836438500004 -36.728371104999951, 144.51797981600009 -36.728099177999979, 144.51789695000002 -36.727923102999966, 144.51791639200007 -36.727504112999952, 144.5183066620001 -36.726870340999938, 144.51835882800003 -36.726586673999975, 144.51829386200006 -36.726234934999979, 144.51772661400003 -36.725637817999939, 144.52393433500004 -36.725621727999965, 144.52949935400011 -36.725616276999972, 144.53554647400006 -36.725612458999933, 144.54186909000009 -36.725609406999979, 144.54565718400011 -36.725601840999957, 144.55195207300005 -36.725625857999944, 144.56046184000002 -36.725614432999976, 144.55976377700006 -36.724121485999945, 144.56174022200003 -36.72412881799994)))', 7844);
SELECT @g.MakeValid().IsValidDetailed();
SELECT @g
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
Solution | Source |
---|---|
Solution 1 | Harry Smiles |
Solution 2 |