Как написать оператор обновления PostGIS, который игнорирует недопустимую геометрию? - PullRequest
0 голосов
/ 07 августа 2020

Я написал быстрый сценарий PL / pg SQL, который создает два новых столбца для centroid_longitude и centroid_latitude и использует данные из столбца геометрии PostGIS и ST_X(), ST_Y() и ST_Centroid() Функции PostGIS для вычисления значений.

alter table nhd_hr_nhdwaterbody ADD COLUMN centroid_latitude numeric(19,11);
alter table nhd_hr_nhdwaterbody ADD COLUMN centroid_longitude numeric(19,11);
UPDATE nhd_hr_nhdwaterbody SET centroid_longitude=ST_X(ST_Centroid(geom)), centroid_latitude=ST_Y(ST_Centroid(geom));

Когда я запускаю сценарий для базы данных с несколькими миллионами записей, я получаю следующую ошибку:

ERROR:  lwgeom_centroid: GEOS Error: IllegalArgumentException: Invalid number of points in LinearRing found 3 - must be 0 or >= 4

Как ясно указано в ошибке , у скрипта возникла проблема, потому что ST_Centroid() требует, чтобы геометрия имела 0 точек или> = 4, но некоторые из моих данных не имеют такого количества точек. В моем текущем приложении я просто хотел бы пропустить записи, которые не соответствуют критериям наличия 0 или более или равных 4 баллам.

Есть ли способ изменить этот сценарий, чтобы недействительные геометрии просто их значение широты и долготы устанавливается в нуль

1016 * Пример геометрия: 1018 * "01060000A0E610000001000000010300008001000000090000002CCEE69D9E9151C0286E1A1F3E3C46400000000000000000682D06E09F9151C0C0E9DF28403C46400000000000000000A48D6E9F9F9151C078231061423C464000000000000000009C9D35FF9E9151C0B848616C433C46400000000000000000C88E061C9D9151C020568951433C4640000000000000000008A4F59B9C9151C0B8CFD508433C4640000000000000000060C4A6B09C9151C0004FD209423C464000000000000000003884B6DB9C9151C0088727EE3F3C464000000000000000002CCEE69D9E9151C0286E1A1F3E3C46400000000000000000"

1 Ответ

1 голос
/ 07 августа 2020

Просто добавьте предложение WHERE, которое проверяет количество точек (непроверенных):

UPDATE nhd_hr_nhdwaterbody SET 
   centroid_longitude=ST_X(ST_Centroid(geom)), 
   centroid_latitude=ST_Y(ST_Centroid(geom))
WHERE NOT ST_NumPoints(geom) between 1 and 3;

Коорды для тех, которые не обновляются, должны оставаться NULL.

...