2015-12-02 2 views
0

У меня есть одна география, состоящая из 17 отдельных полигонов. STNumGeometries() возвращает 17, как и должно. Однако на самом большом полигоне я видел некоторые узкие границы/трещины/зазоры в полигоне. Кажется, я могу скрыть их с помощью STBuffer (см. Ниже), но число геометрий увеличивается. Как я могу устранить пробелы, не делая сложнее географии?Устранение пробелов в географии

select 
    myGeography.STNumGeometries() --Result: 17 
    myGeography.STBuffer(+0.01).STBuffer(-0.01) --Result: I can no longer see lines within the largest polygon 
    myGeography.STBuffer(+0.01).STBuffer(-0.01).STNumGeometries() --Result: 26 

Оригинал:

Original Original zoomed

Исправлено:

Fixed Fixed zoomed

+0

Можете ли вы опубликовать изображение того, как выглядит ваш многоугольник, и что является результатом буфера? –

+0

Спасибо за ваш ответ, я добавил несколько фото – jumxozizi

+0

Что это за красные круги? –

ответ

0

Вот метод удаления «колец» из вашей географии, у которых очень мало площади. Вы можете установить чувствительность, изменив параметр для функции Reduce().

use myDB; 

SELECT 
    myTable.pk 
, geography::UnionAggregate(  --Union polygons into a single geography 
     geography::STGeomFromWKB( --Linestring --> polygon 
      0x01 + 0x03000000 + 0x01000000 + SUBSTRING(myTable.myGeography.STGeometryN(geometryN.number).RingN(ringN.number).STAsBinary(),6,2147483647) 
     , myTable.myGeography.STSrid 
     ) 
    )           as shapeClean 
FROM mySchema.myTable 
    inner join master.dbo.spt_values as geometryN 
     on geometryN."type" = 'P' --only integers 
     and geometryN.number between 1 and myTable.myGeography.STNumGeometries() --Number of geometries 
    inner join master.dbo.spt_values as ringN 
     on ringN."type"  = 'P' --only integers 
     and ringN.number  between 1 and myTable.myGeography.STGeometryN(geometryN.number).NumRings() --Number of rings 
where myTable.pk = 4722 
    and myTable.myGeography.STGeometryN(geometryN.number).RingN(ringN.number).Reduce(0.1).STNumPoints() > 2 --Keep only rings that have some area even after "reducing" slightly 
group by  myTable.pk 
; 
Смежные вопросы