কীভাবে ST_ আন্তঃব্যবহার ব্যবহার করবেন?


15

আমি যা করার চেষ্টা করছি সে সম্পর্কে এখানে একটি দ্রুত সংক্ষিপ্তসার রয়েছে: পোস্টগ্র্রেসে আমার কাছে 3 টি টেবিল রয়েছে, 'এ' এবং 'বি', প্রত্যেকের একটি পলিগন কলাম এবং 'সি' তে একটি পয়েন্ট কলাম রয়েছে। আমি এখানে যা করার চেষ্টা করছি তা হ'ল 'ক', 'বি' এবং 'সি' এর মধ্যে জ্যামিতি ছেদ করা এবং একটি ওপেনলায়ার ভেক্টর স্তরতে এ জাতীয় জ্যামিতিগুলি প্রদর্শন করা।

আমি ওপেনলায়ার্সের কোনও স্ট্রিং থেকে যে কোনও ধরণের জ্যামিতি প্রদর্শন করতে হবে তা আমি ইতিমধ্যে জানি, তবে পোস্টজিআইএস এর এস এস ইনটেকশন ফাংশন নিয়ে আমার সমস্যা হচ্ছে, আমি এটি করছি:

SELECT ST_Intersection(a.geom, b.geom) as inter from a, b;

যেখানে a.geom এবং b.geom উভয় জ্যামিতি কলাম এবং আমি এই ত্রুটি বার্তাটি পেয়েছি:

NOTICE:  TopologyException: found non-noded intersection between 515172 2.14408e+06, 497067 2.13373e+06 and 501321 2.13546e+06, 471202 2.14843e+06 500621 2.13576e+06 
ERROR:  GEOS Intersection() threw an error!

এছাড়াও আমি এস.এসএএসটেক্সটটি এভাবে ব্যবহার করে ফলাফলের জ্যামিতিটিকে পাঠ্য হিসাবে প্রকাশ করার চেষ্টা করেছি:

SELECT ST_AsText(ST_Intersection(a.geom, b.geom)) as inter from a, b;

তবে এটি আমাকে এই ত্রুটি বার্তাটি প্রেরণ করে:

HINT: No function matches the given name and argument types. You might need to add explicit type casts.

আমি জানি না আমি কী ভুল করছি, আমি পলিগনসের ডাব্লুকেটি ওপেনলায়ার্সে এটি প্রদর্শন করতে চাই, এখানে আমি ডাব্লুকেটি থেকে জ্যামিতিটি কীভাবে প্রদর্শন করব:

                    var in_options = {
                        'internalProjection': new OpenLayers.Projection("EPSG:4326"),
                        'externalProjection': new OpenLayers.Projection("EPSG:4326")
                    }; 

                    var fea= new OpenLayers.Format.WKT(in_options).read(data); //data is the string with the WKT
                    vectorLayer.addFeatures([fea]); //this piece of code works great
                    map.zoomToExtent(bounds);

আপডেট: আমি পরবর্তী চেষ্টা:

SELECT ST_Intersection(a.geom, b.geom) as intersect_ab FROM a INNER JOIN b ON 
ST_Intersection(a,b) WHERE ST_Overlaps(a.geom, b.geom) 
AND ST_isvalid(a.geom)='t' AND ST_isvalid(b.geom)='t';

তবে আমি পরবর্তী ত্রুটি বার্তাটি পেয়েছি:

ERROR: Function st_intersection(a,b) does not exist.
HINT: No function matches the given name and argument types. You might need to add explicit type casts.

আমি যুক্ত করেছি যে বৈধ বহুভুজ যাচাই করা হচ্ছে তা বৈধতা যাচাই করা হচ্ছে, তবে এটি ত্রুটিটি বলছে এস এস ইনট্রেকশন (ক, খ), এ, বি এবং সি উভয়ই একই এসআরডি রয়েছে তাই আমি সত্যিই বিভ্রান্ত, দুঃখিত আমি যদি খুব বেশি জিজ্ঞাসা করছি, তবে পোস্টজিআইএসের সাথে আমি বেশ নতুন তাই আমি আশা করি আমি আপনাকে খুব বেশি বিরক্ত করছি না। ধন্যবাদ।


1
কি SELECT PostGIS_Full_Version();ফিরে আসে?
মাইক টি

POSTGIS = "1.4.0" GEOS = "3.1.0-CAPI-1.5.0" PROJ = "rel 4.7.1, 23 সেপ্টেম্বর 2009।" USE_STATS
ঊরীয়েল

উত্তর:


8

আমার অনুমানটি হ'ল এটি যদি ব্যর্থ হয় যদি চৌরাস্তাটি NULL ফেরত দেয়। সুতরাং আপনি ডাব্লুটিটি তৈরি করার চেষ্টা করার আগে একটি সংযোগ পরীক্ষা করা উচিত যেখানে আসলে কোনও ছেদ রয়েছে কিনা।


আমি এটি চেষ্টা করেছি: নির্বাচন করুন ST_Intersication (a.geom, b.geom) হিসাবে ছেদ করুন_নে SNInterક્શન (একটি, খ) যেখানে ST_Overlaps (a.geom, b.geom) এবং ST_is अवैध (a.geom) = 't 'এবং ST_is अवैध (b.geom) =' টি '; তবে এটি একই ত্রুটিটি ফিরিয়ে দিয়েছে: ** ত্রুটি: ফাংশন স্ট_ইন্টারশন (ক, খ) বিদ্যমান নেই। ইঙ্গিত: প্রদত্ত নাম এবং যুক্তির ধরণের কোনও ফাংশন মেলে না। আপনার স্পষ্টত ধরণের ক্যাসেট যুক্ত করার প্রয়োজন হতে পারে। ** আমি সত্যিই এটির জন্য আটকে আছি, আপনি যদি আমাকে সহায়তা করতে পারেন তবে আমি অবশ্যই এটির প্রশংসা করব।
উরিল

মানগুলি অনুসন্ধানের জন্য সারাংশ (a.geom) এবং সারাংশ (b.geom) ব্যবহার করে দেখুন।
আন্ডার ডার্ক

সংক্ষিপ্তসার -------------------------- 1 রিং রিং সহ বহুভুজ [BS] 0 এর 4 টি পয়েন্ট রয়েছে বহুভুজ [BS] 1 টি রিং রিং 0 টিতে 5 রয়েছে পয়েন্ট বহুভুজ [বিএস] 1 টি রিং রিং 0 এর 10 পয়েন্ট রয়েছে
উরিল

হ্যাঁ, এটি ST_ আন্তঃসংশ্লিষ্ট হওয়া উচিত (a.geom, b.geom) ST_Intersection (a, b) নয়
আন্ডার ডার্ক

6

ক্লু হল

ERROR: Function st_intersection(a,b) does not exist.
HINT: No function matches the given name and argument types. You might need to add explicit type casts.

ত্রুটি বার্তাটি যেমন বলেছে আপনি সেইভাবে st_intersication ব্যবহার করতে পারবেন না। অন্যান্য উত্তরগুলির সংক্ষিপ্তসার করে আপনার এমন কিছু ব্যবহার করা উচিত:

SELECT ST_Intersection(a.geom, b.geom) as intersect_ab 
FROM a INNER JOIN b ON ST_Intersects(a.geom,b.geom)
WHERE ST_isvalid(a.geom)='t' AND ST_isvalid(b.geom)='t';

আমি যতদূর জানি ব্যবহার করতে কোন অর্থে আছে st_overlaps এবং st_intersects একই বাক্যে যেমন তারা চমত্কার অনুরূপ


4

আমি বহুভুজগুলির বিভিন্ন স্তরের মধ্যে পরীক্ষা করেছি এবং যদি কোনও স্তরের কমপক্ষে একটি অবৈধ জ্যামিতি থাকে তবে তা ব্যর্থ হয়। আপনি কি ST_is अवैध (the_geom) ব্যবহার করে বহুভুজগুলির বৈধতা পরীক্ষা করেছেন? এটি চাবি হতে পারে।


আমি এটি চেষ্টা করেছি: নির্বাচন করুন ST_Intersication (a.geom, b.geom) হিসাবে ছেদ করুন_নে SNInterક્શન (একটি, খ) যেখানে ST_Overlaps (a.geom, b.geom) এবং ST_is अवैध (a.geom) = 't 'এবং ST_is अवैध (b.geom) =' টি '; তবে এটি একই ত্রুটিটি ফিরিয়ে দিয়েছে: ** ত্রুটি: ফাংশন স্ট_ইন্টারশন (ক, খ) বিদ্যমান নেই। ইঙ্গিত: প্রদত্ত নাম এবং যুক্তির ধরণের কোনও ফাংশন মেলে না। আপনার স্পষ্টত ধরণের ক্যাসেট যুক্ত করার প্রয়োজন হতে পারে। ** কেন এটি কাজ করছে না সে সম্পর্কে আমি সত্যিই হারিয়েছি
উরিয়েল

2

এরকম কিছু চেষ্টা করুন:

SELECT  ST_Intersection(a.geom, b.geom) As intersect_ab
    FROM a INNER JOIN b ON ST_Intersection(a,b)
    WHERE ST_Overlaps(a.geom, b.geom)
    ;

সূত্র


আমি এটিও চেষ্টা করেছি কিন্তু এটি একই ত্রুটি বার্তাটি দেয়: ইঙ্গিত: কোনও ফাংশন প্রদত্ত নাম এবং যুক্তির ধরণের সাথে মেলে না। আপনার স্পষ্টত ধরণের ক্যাসেট যুক্ত করার প্রয়োজন হতে পারে।
উরিল

আপনি কীভাবে "IN JERIN B ON ST_Intersection (a.geom, b.geom)" ব্যবহার করবেন?
ক্যাপ্ট্রাড্রাগন

এটি বলে: এআরআরআর: জিন / অন এর যুক্তি টাইপ বুলিয়ান হতে হবে, জ্যামিতি টাইপ করতে হবে না।
উরিল

শাইজার ... ডেটা বা কিছুতে অবশ্যই কিছু ভুল থাকতে হবে কারণ এই ধরণের ক্যোয়ারী আমার পক্ষে কাজ করে।
ক্যাপ্ট্রাড্রাগন

আমি যোগ করেছি এবং এস এসআইসিডিয়াল (a.geom) = 'টি' এবং এস এসআইসিলটিড (b.geom) = 't'; কেবলমাত্র বৈধ জ্যামিতিগুলি মূল্যায়ন করার জন্য তবে এটি আমাকে বলে দিচ্ছে যে ত্রুটিটি সেই স্তরের মধ্যে রয়েছে (ক, খ)
উরিল

1

আমি অবৈধ জ্যামিতিগুলি বাদ দেওয়ার চেষ্টা করেছি কিন্তু এটি কার্যকর হয়নি, সুতরাং শেষ পর্যন্ত আমাকে প্রতিটি অবৈধ জ্যামিতি মুছতে হবে এবং তারপরে এটি ব্যবহার করতে হবে:

SELECT ST_AsText(ST_Intersection(a.geom, b.geom)) as intersect_ab FROM a,b 
WHERE ST_Overlaps(a.geom, b.geom) AND ST_isvalid(a.geom)='t' AND ST_isvalid(b.geom)='t';

আপনি দেখতে পাচ্ছেন যে আমি ST_Intersication (a, b) অংশটি বাদ দিয়েছি, এবং এটি দুর্দান্ত কাজ করেছে, আমি একধরণের দুঃখজনক বীচুসুটকে আমার নির্বাচন থেকে কোনও অবৈধ জ্যামিতি বাদ দেওয়ার উপায় খুঁজে পাইনি, যাইহোক আমাকে ধন্যবাদ দেওয়ার জন্য প্রত্যেককে ধন্যবাদ এখানে।


0

আমি একবার এই সমস্যা ছিল।

<pre>NOTICE:  TopologyException: found non-noded intersection between xxx, xxxx and xxx, xxx  ERROR:  GEOS Intersection() threw an error!</pre>

আমি এই পদ্ধতিটি ব্যবহার করে এই ত্রুটিটি সমাধান করতে সক্ষম হয়েছি।
- কিউজিআইএস ব্যবহার করুন
- আপনার ডাটাবেস থেকে ভেক্টর স্তর যুক্ত করুন
- ত্রুটি বার্তাটি থেকে বিন্দুটি অনুসন্ধান করুন এবং এটি অনুসন্ধানের জন্য কিউজিআইএস
   "কুইকডাব্লুকিটি" (প্লাগইন) ব্যবহার করা যেতে পারে
- তারপরে আপনি সমস্যাটি লাইনস্ট্রিং দেখতে পাবেন
- সম্পাদনা মোডটি চালু করুন
- সবুজ নোড দেখানোর জন্য "নোড সরঞ্জাম" নির্বাচন করুন (নোড সমস্যা)
- ওভারল্যাপ নোড থেকে নোড দূরে সরান
- পরিবর্তনগুলি সংরক্ষণ করুন

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