পোস্টজিআইএস-এ জ্যামিতি পরিষ্কার করছেন?


12

আমি কয়েকটি খুব বড় বহুভুজ স্তরগুলিতে কিছু প্রক্রিয়াজাতকরণ করার চেষ্টা করছি। তবে আমি বিভিন্ন জ্যামিতির ত্রুটিগুলির মধ্যে দৌড়াচ্ছি যেমন:

NOTICE:  Ring Self-intersection at or near point 470396.52017068537 141300.52235257279
CONTEXT:  PL/pgSQL function st_intersection(geometry,raster,integer) line 10 at RETURN QUERY
SQL function "st_intersection" statement 1
NOTICE:  Ring Self-intersection at or near point 504154.61769969884 140782.04115761846
CONTEXT:  PL/pgSQL function st_intersection(geometry,raster,integer) line 10 at RETURN QUERY
SQL function "st_intersection" statement 1
NOTICE:  Ring Self-intersection at or near point 505255.50242871145 140803.34860398644
CONTEXT:  PL/pgSQL function st_intersection(geometry,raster,integer) line 10 at RETURN QUERY
SQL function "st_intersection" statement 1
NOTICE:  Ring Self-intersection at or near point 510312.46970004693 141215.29256710084
CONTEXT:  PL/pgSQL function st_intersection(geometry,raster,integer) line 10 at RETURN QUERY
SQL function "st_intersection" statement 1
NOTICE:  Ring Self-intersection at or near point 510312.46970004693 141215.29256710084
CONTEXT:  PL/pgSQL function st_intersection(geometry,raster,integer) line 10 at RETURN QUERY
SQL function "st_intersection" statement 1
NOTICE:  Ring Self-intersection at or near point 511839.50335641927 141115.85781738357
CONTEXT:  PL/pgSQL function st_intersection(geometry,raster,integer) line 10 at RETURN QUERY
SQL function "st_intersection" statement 1
NOTICE:  Ring Self-intersection at or near point 515064.03024010791 140895.68087158105
CONTEXT:  PL/pgSQL function st_intersection(geometry,raster,integer) line 10 at RETURN QUERY
SQL function "st_intersection" statement 1
NOTICE:  Ring Self-intersection at or near point 519233.18724611058 140881.47590733573
CONTEXT:  PL/pgSQL function st_intersection(geometry,raster,integer) line 10 at RETURN QUERY
SQL function "st_intersection" statement 1
NOTICE:  Ring Self-intersection at or near point 521072.73011588014 141044.83299615697
CONTEXT:  PL/pgSQL function st_intersection(geometry,raster,integer) line 10 at RETURN QUERY
SQL function "st_intersection" statement 1
NOTICE:  Ring Self-intersection at or near point 523331.31943088671 141144.26774587421
CONTEXT:  PL/pgSQL function st_intersection(geometry,raster,integer) line 10 at RETURN QUERY
SQL function "st_intersection" statement 1
NOTICE:  Ring Self-intersection at or near point 523331.31943088671 141144.26774587424
CONTEXT:  PL/pgSQL function st_intersection(geometry,raster,integer) line 10 at RETURN QUERY
SQL function "st_intersection" statement 1
NOTICE:  Ring Self-intersection at or near point 523395.24176999065 140725.22130063715
CONTEXT:  PL/pgSQL function st_intersection(geometry,raster,integer) line 10 at RETURN QUERY
SQL function "st_intersection" statement 1
NOTICE:  Ring Self-intersection at or near point 524531.63890961662 140810.45108610913
CONTEXT:  PL/pgSQL function st_intersection(geometry,raster,integer) line 10 at RETURN QUERY
SQL function "st_intersection" statement 1

আমি এখানে প্রস্তাবিত ফাংশনটি চেষ্টা করেছি: https://trac.osgeo.org/postgis/wiki/UserWikiCleanPolygons

জ্যামিতি পরিষ্কার করার জন্য, কোডটি আমি ব্যবহার করেছি:

UPDATE public.mytable
SET geom=cleangeometry(geom);

ফলাফল সহ:

ERROR:  GEOSisSimple: IllegalArgumentException: This method does not support GeometryCollection arguments

এবং আরো

UPDATE public.valid_mytable
SET geom=ST_MakeValid(geom);

এইটি কাজ করে তবে আমি যদি প্রথমে আমার জ্যামিতি কলামটি জ্যামিতিতে পরিবর্তন করি তবেই

ALTER TABLE public.mytable  ALTER COLUMN geom SET DATA TYPE geometry;

এরপরে যা আমাকে এমন একটি টেবিল দিয়ে রেখে দেয় যা আমার অন্যান্য ফাংশনগুলির সাথে আর কাজ করে না!

ERROR:  Relate Operation called with a LWGEOMCOLLECTION type.  This is unsupported.

আমি কলামগুলি জ্যামিতিতে ফিরে যাওয়ার চেষ্টা করেছি (মাল্টিপলিগন)

টেবিলটি সর্বজনীন করুন। আমার_সামগ্রী পরিবর্তক কলম জিওম সেট ডেটা টাইপ জ্যামিতি (মাল্টিপলিগন);

তবে এটি ব্যর্থ

ERROR:  Geometry type (GeometryCollection) does not match column type (MultiPolygon)

আমি পোস্টজিআইএস ইন অ্যাকশন (দ্বিতীয় এড) http://www.manning.com/obe/ এর মধ্য দিয়ে যাওয়ার চেষ্টা করেছি তবে আমি কেবল অবৈধ জ্যামিতিগুলি সন্ধানের জন্য ফাংশনগুলি খুঁজে পেতে পারি, তবে আমার ডেটা সেটটি নিজেই এটি ঠিক করতে এত বড়, আমি সত্যিই এমন কিছু দরকার যা এগুলি স্বয়ংক্রিয়ভাবে ঠিক করে দেবে।


আমি যখন এস-মেকভালিড () চেষ্টা করে চালিত হয়েছি তখন আমি ফলাফলটি বহুভুজকে আলাদা করতে সক্ষম হয়েছি:

ERROR:  Geometry type (GeometryCollection) does not match column type      (MultiPolygon)
 ********** Error **********

 ERROR: Geometry type (GeometryCollection) does not match column type      (MultiPolygon)
SQL state: 22023

আমি আমার জ্যামিতি কলামে একটি প্রকার পরীক্ষা করেছি, এবং এটি বলেছে যে "মাল্টিপলজিগন" টাইপটি ছিল


ST_MakeValid যতটা সম্ভব সংশোধন করে।
ব্যবহারকারী 30184

আমি দেখছি, ধন্যবাদ, আমি আমার প্রশ্নে আসলে একটি ভুল করেছি যেখানে আমি উল্লেখ করতে ভুলে গিয়েছিলাম যে এটি এসT_ মেক_ভালিড যা আমার কলামগুলির সাথে সমস্যা সৃষ্টি করে। আমি এস 07 মেকভালিড ব্যবহার করেছি তবে কাজ করার জন্য আমাকে আমার জিমের কলামটি জ্যামিতির ডেটা টাইপতে পরিবর্তন করতে হবে এবং আমি একবার এটি করার পরে আমি এটি জ্যামিতিতে ফিরিয়ে আনতে পারি না (মাল্টিপলিগন)
মার্ট

2
আপনি হ্যাক এস 07 বাফার (জিওম, 0) ব্যবহার করতে পারেন যা অনেকগুলি অবৈধ জ্যামিতির সাথে মোকাবেলা করবে। আপনি এস 07 মেকভালিডও ব্যবহার করতে পারেন। শেষ অবধি, আপনি একটি নতুন টেবিলের মধ্যে নির্বাচন করার চেষ্টা করতে পারেন এবং এস-এসআইআইএসভিডিয়াল (জিওম) যেখানে cla ধারাটিতে রেখেছেন।
জন পাওয়েল

ধন্যবাদ, আমি ইতিমধ্যে বাফার হ্যাক চেষ্টা করেছি, তবে এটি কার্যকর হয়নি, এটি জ্যামিতির (মাল্টিপলিগন) চেয়ে জ্যামিতির ইনপুট চেয়েছিল। আমি কেবলমাত্র বৈধ বহুভুজ নির্বাচন করার চেষ্টা করব এবং দেখব যে কতগুলি ফিল্টার করা হয়েছে।
মার্ট

1
ঠিক আছে. এটি বহুভুজগুলির সাথে st_makeમાન્ય উত্পাদক পয়েন্ট এবং লাইনস্ট্রিংগুলি থেকে আসে যা একটি জ্যামিতি সংগ্রহ সংগ্রহ করে। এটির জন্য একটি স্থিরতা রয়েছে যা আমি কয়েক ঘন্টার মধ্যে লিখব। আমি সার্ফিং করতে চলেছি :-)
জন পাওয়েল

উত্তর:


15

আপনি যদি কেবল এস এস মেকভালিড থেকে বহুভুজ বা মাল্টিপলিগন চান তবে আপনি উপাদান জ্যামিতিগুলি বের করতে ST_Dump ব্যবহার করতে পারেন এবং জ্যামিতির ধরণের জন্য পরীক্ষা করতে পারেন । এস 07 মেকভালিড কখনও কখনও পয়েন্ট বা লাইন স্ট্রিংস তৈরি করতে পারে যা জ্যামিতি সংগ্রহ থেকে আসে। এর মতো কিছু চেষ্টা করুন:

SELECT 
  g.geom, 
  row_number() over() AS gid,
FROM 
  (SELECT 
     (ST_DUMP(ST_MakeValid (geom))).geom FROM your_table
  ) AS g
WHERE ST_GeometryType(g.geom) = 'ST_MultiPolygon' 
   OR ST_GeometryType(g.geom) = 'ST_Polygon';

আপনি ও শর্তের পরিবর্তে একটি আইএন ক্লজ ব্যবহার করতে পারেন, যদিও ফলাফল এবং ক্যোয়ারী পরিকল্পনা একই হবে। আপনি শুধুমাত্র Multipolygons চান তাহলে আপনাকে মোড়ানো পারেন ST_Dump মধ্যে ST_Multi ফাংশন।

সারি_সংখ্যার () ওভার () ওপরে প্রতিটি জ্যামিতি এস এসডাম্প থেকে ফিরে আসার জন্য এক থেকে শুরু করে আপনাকে একটি অনন্য আইডি প্রদান করবে। আপনি একই ফলাফলের সাথে এস এসডাম্প দ্বারা ফিরে আসা পথের উপাদানটিও ব্যবহার করতে পারেন।

আপনি সম্ভবত এটি নির্বাচন করুন হিসাবে একটি তৈরি টেবিল ক্লিনড_জমসের সাথে একত্রিত করতে চাইবেন .... টাইপ স্টেটমেন্ট হিসাবে, সরাসরি আপডেট হিসাবে ST_MakeValid উইল নটল সাধারণত (বা সর্বদা) আমি আউটপুট থেকে রাখার জন্য এক থেকে এক ম্যাপিং উত্পাদন করার সম্ভাবনা নেই।

বর্তমানে এটির কোনও উপায় নেই বলে এটি অনির্দিষ্ট করা হয়েছে, সুতরাং এখানে একটি ভুল প্যারেন্টেসিস থাকতে পারে তবে সাধারণ নীতিটি যথাযথ। আশাকরি এটা সাহায্য করবে.


19

আপনি জ্যামিতিকরণ সংগ্রহ থেকে [ বহুগুণ ] বহুভুজ বের করতে ST_ Colલેક્EExtract চেষ্টা করতে পারেন । মুলিপলিগন হিসাবে তাদের জোর করতে ST_ মাল্টি ব্যবহার করুন।

UPDATE public.valid_lcmsouthshapefile
  SET geom=ST_Multi(ST_CollectionExtract(ST_MakeValid(geom), 3))
  WHERE NOT ST_IsValid(geom);

আপনার কাজ শেষ হওয়ার পরে, তারা বৈধ থাকবে তা নিশ্চিত করতে একটি চেক সীমাবদ্ধতা ব্যবহার করুন। বিস্তারিত এখানে দেখুন ।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.