পোস্টজিআইএস সহ স্থানিক গুচ্ছ?


97

পয়েন্ট বৈশিষ্ট্যগুলির জন্য PostGIS- সক্ষম ডাটাবেসের মধ্যে এটি ব্যবহারের জন্য আমি স্থানিক ক্লাস্টারিং অ্যালগরিদম খুঁজছি। আমি plpgsql ফাংশন লিখতে যাচ্ছি যে ইনপুট হিসাবে একই ক্লাস্টারের মধ্যে পয়েন্ট মধ্যে দূরত্ব লাগে। আউটপুট ফাংশনে ক্লাস্টারের অ্যারে প্রদান করে। সর্বাধিক সুস্পষ্ট সমাধান হ'ল বৈশিষ্ট্যের চারপাশে বাফার অঞ্চল নির্ধারিত দূরত্ব তৈরি করা এবং এই বাফারটিতে বৈশিষ্ট্যগুলি অনুসন্ধান করা। যদি এই ধরনের বৈশিষ্ট্য বিদ্যমান থাকে তবে তাদের চারপাশে একটি বাফার তৈরি করা চালিয়ে যান, ইত্যাদি If হয়তো কিছু চালাক সমাধান আছে?


4
বিভিন্ন ধরণের ক্লাস্টারিং পদ্ধতি রয়েছে কারণ উপাত্তের ভিন্নতা এবং ক্লাস্টারিংয়ের বিভিন্ন উদ্দেশ্য। কী আছে সে সম্পর্কে একটি পর্যালোচনা এবং দূরত্বের ম্যাট্রিকগুলি ক্লাস্টার করতে অন্যরা কী করছে সে সম্পর্কে কিছু সহজ পড়ার জন্য, সিভি @ এসই সাইটটি অনুসন্ধান করুন । প্রকৃতপক্ষে, "ক্লাস্টারিং পদ্ধতি নির্বাচন করা" এটি আপনার প্রায় একটি সঠিক নকল এবং এর ভাল উত্তর রয়েছে।
হোবার

8
প্রশ্নের উত্তর +1 কারণ অ্যালগোরিদমগুলির লিঙ্কগুলির পরিবর্তে একটি প্রকৃত পোস্টজিআইএস এসকিউএল উদাহরণ সন্ধান করা বেসিক গ্রিড ক্লাস্টারিং ব্যতীত অন্য কোনও কিছুর পক্ষে বিশেষত অসম্ভব মিশন, বিশেষত এমসিএলের
ওয়াইল্ডপিক্স

উত্তর:


112

পোস্টজিআইএস-এর জন্য কমপক্ষে দুটি ভাল ক্লাস্টারিং পদ্ধতি রয়েছে: কে- মিনস ( kmeans-postgresqlএক্সটেনশনের মাধ্যমে ) বা ক্লাস্টারিং জ্যামিতিগুলি একটি প্রান্তিক দূরত্বে (পোস্টজিআইএস ২.২)


1) কে- মানেkmeans-postgresql

ইনস্টলেশন: আপনার পসিক্স হোস্ট সিস্টেমে পোস্টগ্রিজ এসকিউএল 8.4 বা তার বেশি হওয়া দরকার (এমএস উইন্ডোজটির জন্য কোথা থেকে শুরু করতে হবে তা আমি জানতাম না)। আপনার যদি এটি প্যাকেজগুলি থেকে ইনস্টল করা থাকে তবে নিশ্চিত করুন যে আপনার কাছেও বিকাশ প্যাকেজ রয়েছে (যেমন, postgresql-develসেন্টোসের জন্য)। ডাউনলোড এবং নিষ্কাশন:

wget http://api.pgxn.org/dist/kmeans/1.1.0/kmeans-1.1.0.zip
unzip kmeans-1.1.0.zip
cd kmeans-1.1.0/

বিল্ডিংয়ের আগে, আপনাকে USE_PGXS পরিবেশের পরিবর্তনশীল সেট করতে হবে (আমার আগের পোস্টটি এই অংশটি মুছতে নির্দেশ দিয়েছে Makefile, যা বিকল্পগুলির মধ্যে সেরা ছিল না)। এই দুটি কমান্ডগুলির মধ্যে একটিতে আপনার ইউনিক্স শেলের জন্য কাজ করা উচিত:

# bash
export USE_PGXS=1
# csh
setenv USE_PGXS 1

এখন এক্সটেনশনটি তৈরি করুন এবং ইনস্টল করুন:

make
make install
psql -f /usr/share/pgsql/contrib/kmeans.sql -U postgres -D postgis

(দ্রষ্টব্য: আমি এটি উবুন্টু ১০.১০ দিয়েও চেষ্টা করেছি, তবে ভাগ্য নেই, কারণ পথটি pg_config --pgxsঅস্তিত্বহীন! এটি সম্ভবত উবুন্টু প্যাকেজিং বাগ))

ব্যবহার / উদাহরণ: আপনার কোথাও পয়েন্টের একটি সারণী থাকা উচিত (আমি কিউজিআইএসে সিউডো র্যান্ডম পয়েন্টগুলির একটি গুচ্ছ আঁকছি)। আমি যা করেছি তার একটি উদাহরণ এখানে দেওয়া হয়েছে:

SELECT kmeans, count(*), ST_Centroid(ST_Collect(geom)) AS geom
FROM (
  SELECT kmeans(ARRAY[ST_X(geom), ST_Y(geom)], 5) OVER (), geom
  FROM rand_point
) AS ksub
GROUP BY kmeans
ORDER BY kmeans;

5দ্বিতীয় যুক্তি দেওয়া আমি kmeansজানালা ফাংশন কে পূর্ণসংখ্যা পাঁচটি ক্লাস্টার উত্পাদন করতে। আপনি যা চান পূর্ণসংখ্যায় এটি পরিবর্তন করতে পারেন।

নীচে রয়েছে ৩১ টি সিউডো এলোমেলো পয়েন্ট এবং আমি আঁকা লেবেলযুক্ত পাঁচটি সেন্ট্রয়েড যা প্রতিটি ক্লাস্টারে গণনা দেখায়। এটি উপরের এসকিউএল কোয়েরি ব্যবহার করে তৈরি করা হয়েছিল।

Kmeans


এই ক্লাস্টারগুলি ST_MinimumBoundingCકલ সহ কোথায় রয়েছে তা আপনিও চিত্রিত করার চেষ্টা করতে পারেন :

SELECT kmeans, ST_MinimumBoundingCircle(ST_Collect(geom)) AS circle
FROM (
  SELECT kmeans(ARRAY[ST_X(geom), ST_Y(geom)], 5) OVER (), geom
  FROM rand_point
) AS ksub
GROUP BY kmeans
ORDER BY kmeans;

Kmeans2


2) সাথে একটি চৌম্বক দূরত্বে ক্লাস্টারিং ST_ClusterWithin

এই সামগ্রিক ফাংশনটি পোস্টজিআইএস ২.২ এর সাথে অন্তর্ভুক্ত রয়েছে এবং জ্যামিতি সংগ্রহের একটি অ্যারে প্রদান করে যেখানে সমস্ত উপাদান একে অপরের দূরত্বে থাকে।

এখানে একটি উদাহরণ ব্যবহার রয়েছে, যেখানে ১০০.০ এর একটি দূরত্ব হ'ল প্রান্তিকতা যার ফলস্বরূপ 5 টি বিভিন্ন ক্লাস্টার রয়েছে:

SELECT row_number() over () AS id,
  ST_NumGeometries(gc),
  gc AS geom_collection,
  ST_Centroid(gc) AS centroid,
  ST_MinimumBoundingCircle(gc) AS circle,
  sqrt(ST_Area(ST_MinimumBoundingCircle(gc)) / pi()) AS radius
FROM (
  SELECT unnest(ST_ClusterWithin(geom, 100)) gc
  FROM rand_point
) f;

ClusterWithin100

বৃহত্তম মাঝারি ক্লাস্টারে একটি ঘেরের বৃত্ত ব্যাসার্ধ রয়েছে 65.3 ইউনিট বা প্রায় 130, যা প্রান্তিকের চেয়ে বড়। এটি কারণ সদস্য জ্যামিতির মধ্যে পৃথক দূরত্ব প্রান্তিকের চেয়ে কম, সুতরাং এটি এটিকে বৃহত্তর ক্লাস্টার হিসাবে একত্রিত করে।


2
দুর্দান্ত, এই পরিবর্তনগুলি ইনস্টলেশনের জন্য সহায়তা করবে :-) তবে আমি আশঙ্কা করছি যে শেষ পর্যন্ত আমি এই এক্সটেনশনটি সত্যই ব্যবহার করতে পারি না কারণ (যদি আমি সঠিকভাবে বুঝতে পারি), এটির জন্য একটি হার্ডকোডযুক্ত যাদু সংখ্যার ক্লাস্টার প্রয়োজন, যা স্থির ডেটা যথাযথের সাথে ঠিক আছে আপনি আগেভাগে এটি সূক্ষ্ম-টিউন করতে পারেন তবে সালিসি (বিভিন্ন ফিল্টারের কারণে) ক্লাস্টারিং ডেটা সেটগুলির জন্য আমাকে ফিট করবেন না, যেমন শেষ চিত্রের 10-পয়েন্টের ক্লাস্টারে বড় ফাঁক। তবে এটি অন্যান্য লোককেও সহায়তা করবে কারণ (আফাইক), এই এক্সটেনশনের জন্য এটি কেবলমাত্র বিদ্যমান এসকিউএল উদাহরণ (এক্সটেনশনের হোমপেজের একটি লাইনার ব্যতীত)।
ওয়াইল্ডপিক্স

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

7
কামেন ক্লাস্টারিংয়ের জন্য আপনাকে আগে থেকে ক্লাস্টারের সংখ্যা নির্দিষ্ট করতে হবে; আমি আগ্রহী যদি সেখানে বিকল্প অ্যালগরিদম থাকে যেখানে ক্লাস্টারের সংখ্যা যদিও প্রয়োজন হয় না।
djq

1
সংস্করণ 1.1.0 এখন উপলভ্য: api.pgxn.org/dist/kmeans/1.1.0/kmeans-1.1.0.zip
ডিজেকি

1
@ ম্যাক্সড নং A = ²r² দেওয়া হয়েছে, তারপরে r = √ (A / π)।
মাইক টি

27

আমি ফাংশন লিখেছি যা তাদের মধ্যে দূরত্বের উপর ভিত্তি করে বৈশিষ্ট্যগুলির গুচ্ছ গণনা করে এবং এই বৈশিষ্ট্যগুলির উপর উত্তল হাল তৈরি করে:

CREATE OR REPLACE FUNCTION get_domains_n(lname varchar, geom varchar, gid varchar, radius numeric)
    RETURNS SETOF record AS
$$
DECLARE
    lid_new    integer;
    dmn_number integer := 1;
    outr       record;
    innr       record;
    r          record;
BEGIN

    DROP TABLE IF EXISTS tmp;
    EXECUTE 'CREATE TEMPORARY TABLE tmp AS SELECT '||gid||', '||geom||' FROM '||lname;
    ALTER TABLE tmp ADD COLUMN dmn integer;
    ALTER TABLE tmp ADD COLUMN chk boolean DEFAULT FALSE;
    EXECUTE 'UPDATE tmp SET dmn = '||dmn_number||', chk = FALSE WHERE '||gid||' = (SELECT MIN('||gid||') FROM tmp)';

    LOOP
        LOOP
            FOR outr IN EXECUTE 'SELECT '||gid||' AS gid, '||geom||' AS geom FROM tmp WHERE dmn = '||dmn_number||' AND NOT chk' LOOP
                FOR innr IN EXECUTE 'SELECT '||gid||' AS gid, '||geom||' AS geom FROM tmp WHERE dmn IS NULL' LOOP
                    IF ST_DWithin(ST_Transform(ST_SetSRID(outr.geom, 4326), 3785), ST_Transform(ST_SetSRID(innr.geom, 4326), 3785), radius) THEN
                    --IF ST_DWithin(outr.geom, innr.geom, radius) THEN
                        EXECUTE 'UPDATE tmp SET dmn = '||dmn_number||', chk = FALSE WHERE '||gid||' = '||innr.gid;
                    END IF;
                END LOOP;
                EXECUTE 'UPDATE tmp SET chk = TRUE WHERE '||gid||' = '||outr.gid;
            END LOOP;
            SELECT INTO r dmn FROM tmp WHERE dmn = dmn_number AND NOT chk LIMIT 1;
            EXIT WHEN NOT FOUND;
       END LOOP;
       SELECT INTO r dmn FROM tmp WHERE dmn IS NULL LIMIT 1;
       IF FOUND THEN
           dmn_number := dmn_number + 1;
           EXECUTE 'UPDATE tmp SET dmn = '||dmn_number||', chk = FALSE WHERE '||gid||' = (SELECT MIN('||gid||') FROM tmp WHERE dmn IS NULL LIMIT 1)';
       ELSE
           EXIT;
       END IF;
    END LOOP;

    RETURN QUERY EXECUTE 'SELECT ST_ConvexHull(ST_Collect('||geom||')) FROM tmp GROUP by dmn';

    RETURN;
END
$$
LANGUAGE plpgsql;

এই ফাংশনটি ব্যবহারের উদাহরণ:

SELECT * FROM get_domains_n('poi', 'wkb_geometry', 'ogc_fid', 14000) AS g(gm geometry)

'poi' - স্তরটির নাম, 'wkb_geometry' - জ্যামিতি কলামের নাম, 'ogc_fid' - সারণীর প্রাথমিক কী, 14000 - গুচ্ছ দূরত্ব।

এই ফাংশনটি ব্যবহারের ফলাফল:

এখানে চিত্র বর্ণনা লিখুন


গ্রেট! আপনি কীভাবে আপনার ফাংশনটি ব্যবহার করতে পারেন তার একটি উদাহরণ যোগ করতে পারেন? ধন্যবাদ!
আন্ডার ডার্ক

1
আমি কিছুটা সোর্স কোড পরিবর্তন করেছি এবং ফাংশন ব্যবহারের উদাহরণ যুক্ত করেছি added
drnextgis

স্রেফ এটি পোস্টারগেস 9.1 এবং লাইনটিতে "এক্সিকিউটে 'নির্বাচন' || গিড || 'এ ব্যবহার করার চেষ্টা করেছেন এএস গিড, '|| জিওম ||' যেহেতু dmn থেকে tmp থেকে জীম নীচের ত্রুটিটি পাওয়া যায় 'লুপ'। কোন ধারনা ? ত্রুটি: সেট-
মানযুক্ত

আমি আমার টেবিলের পিজি (PostGIS n00b) এ এই কোডটি কীভাবে ব্যবহার করব সে সম্পর্কে আমি নিশ্চিত নই। এই সিনট্যাক্সটি আমি কোথায় বুঝতে পারি? আমি ল্যাটস এবং Lons সঙ্গে একটি টেবিল যে আমি ক্লাস্টারে চাই
ডিপার্টমেন্ট

সবার আগে আপনাকে geometryনিজের টেবিলের মধ্যে কলাম তৈরি করতে হবে, আলাদাভাবে লনলট সংরক্ষণ করতে হবে না এবং অনন্য মান (আইডি) দিয়ে কলাম তৈরি করতে হবে।
drnextgis

10

এখনও অবধি, আমি যে প্রতিশ্রুতিশীল খুঁজে পেয়েছি তা হল উইন্ডো ফাংশন হিসাবে কে-মানে ক্লাস্টারিংয়ের জন্য এই এক্সটেনশন: http://pgxn.org/dist/kmeans/

তবে আমি এখনও এটি সফলভাবে ইনস্টল করতে সক্ষম হইনি।


অন্যথায়, বেসিক গ্রিড ক্লাস্টারিংয়ের জন্য, আপনি স্ন্যাপটোগ্রিড ব্যবহার করতে পারেন ।

SELECT
    array_agg(id) AS ids,
    COUNT( position ) AS count,
    ST_AsText( ST_Centroid(ST_Collect( position )) ) AS center,
FROM mytable
GROUP BY
    ST_SnapToGrid( ST_SetSRID(position, 4326), 22.25, 11.125)
ORDER BY
    count DESC
;

2

@ মাইকটি উত্তর সম্পূর্ণ করছে ...

এমএস উইন্ডোজের জন্য:

প্রয়োজনীয়তা:

  • যেমন কোন ভিসুয়াল সি ++ এক্সপ্রেস সংস্করণ এই
  • Kmeans-PostgreSQL মডিউল।

তুমি কি করবে:

  • Kmeans ফাংশনটি একটি DLL এ রফতানি করতে উত্স কোডটি টুইঙ্ক করুন।
  • ফাংশন cl.exeসহ একটি ডিএলএল উত্পাদন করতে সংকলক সহ উত্স কোডটি সংকলন করুন kmeans
  • উত্পাদিত ডিএলএল পোস্টগ্র্রেএসকিউএল \ lib ফোল্ডারে রাখুন।
  • তারপরে আপনি এসকিউএল কমান্ডের মাধ্যমে ইউডিএফকে পোস্টগ্রাইএসকিউএলে "তৈরি" (লিঙ্ক) করতে পারেন।

পদক্ষেপ:

  1. প্রয়োজনীয়তাগুলি ডাউনলোড করুন এবং ইনস্টল করুন / এক্সট্রাক্ট করুন।
  2. যে kmeans.cকোনও সম্পাদক এ খুলুন :

    1. #includeলাইনগুলি এর সাথে ডিএলএলএক্সপোর্ট ম্যাক্রো সংজ্ঞায়িত করার পরে :

      #if defined(_WIN32)
          #define DLLEXPORT __declspec(dllexport)
      #else
         #define DLLEXPORT
      #endif
    2. DLLEXPORTএই প্রতিটি লাইন আগে রাখুন :

      PG_FUNCTION_INFO_V1(kmeans_with_init);
      PG_FUNCTION_INFO_V1(kmeans);
      
      extern Datum kmeans_with_init(PG_FUNCTION_ARGS);
      extern Datum kmeans(PG_FUNCTION_ARGS);
  3. ভিজ্যুয়াল সি ++ কমান্ড লাইনটি খুলুন।

  4. কমান্ড লাইনে:

    1. নিষ্ক্রিয় যাও যান kmeans-postgresql
    2. আপনার পোষ্টগ্রিপথ সেট করুন, আমার উদাহরণস্বরূপ: SET POSTGRESPATH=C:\Program Files\PostgreSQL\9.5
    3. চালান

      cl.exe /I"%POSTGRESPATH%\include" /I"%POSTGRESPATH%\include\server" /I"%POSTGRESPATH%\include\server\port\win32" /I"%POSTGRESPATH%\include\server\port\win32_msvc" /I"C:\Program Files (x86)\Microsoft SDKs\Windows\v7.1A\Include" /LD kmeans.c "%POSTGRESPATH%\lib\postgres.lib"
  5. কপি kmeans.dllকরার জন্য%POSTGRESPATH%\lib

  6. ফাংশনটি "তৈরি" করতে আপনার ডাটাবেসে এসকিউএল কমান্ডটি চালান।

    CREATE FUNCTION kmeans(float[], int) RETURNS int
    AS '$libdir/kmeans'
    LANGUAGE c VOLATILE STRICT WINDOW;
    
    CREATE FUNCTION kmeans(float[], int, float[]) RETURNS int
    AS '$libdir/kmeans', 'kmeans_with_init'
    LANGUAGE C IMMUTABLE STRICT WINDOW;

2

কিউআইজিআইএস-এ প্রদর্শিত পোস্টের এই উপায়টি এখানে 2 এ দেওয়া পোস্টজিআইএস ক্যোয়ারির ফলাফল)

যেহেতু কিউজিআইএস একই জ্যামিতি কলামে জ্যামিতিকরণগুলি বা বিভিন্ন ডেটাটাইপগুলি পরিচালনা করে না, তাই আমি দুটি স্তর তৈরি করেছি, একটি ক্লাস্টারের জন্য এবং একটি ক্লাস্টার পয়েন্টের জন্য।

ক্লাস্টারগুলির জন্য প্রথমে আপনার কেবল বহুভুজগুলির প্রয়োজন, অন্যান্য ফলাফলগুলি নিঃসঙ্গ পয়েন্ট:

SELECT id,countfeature,circle FROM (SELECT row_number() over () AS id,
  ST_NumGeometries(gc) as countfeature,
  ST_MinimumBoundingCircle(gc) AS circle
FROM (
  SELECT unnest(ST_ClusterWithin(the_geom, 100)) gc
  FROM rand_point
) f) a WHERE ST_GeometryType(circle) = 'ST_Polygon'

তারপরে ক্লাস্টার পয়েন্টগুলির জন্য, আপনাকে জ্যামিতিকরণগুলি মাল্টিপয়েন্টে রূপান্তর করতে হবে:

SELECT row_number() over () AS id,
  ST_NumGeometries(gc) as countfeature,
  ST_CollectionExtract(gc,1) AS multipoint
FROM (
  SELECT unnest(ST_ClusterWithin(the_geom, 100)) gc
  FROM rand_point
) f

কিছু পয়েন্ট একই স্থানাঙ্কে থাকে যাতে লেবেল বিভ্রান্ত হতে পারে।

কিউজিসে ক্লাস্টারিং


2

আপনি ২.৩ থেকে পোস্টজিতে উপলভ্য এস এস ক্লসটার কে মীন পদ্ধতি সহ কমিয়ানস সমাধানটি আরও সহজে ব্যবহার করতে পারেন উদাহরণ:

SELECT kmean, count(*), ST_SetSRID(ST_Extent(geom), 4326) as bbox 
FROM
(
    SELECT ST_ClusterKMeans(geom, 20) OVER() AS kmean, ST_Centroid(geom) as geom
    FROM sls_product 
) tsub
GROUP BY kmean;

বৈশিষ্ট্যগুলির সীমানা বাক্সটি উপরের উদাহরণে ক্লাস্টার জ্যামিতি হিসাবে ব্যবহৃত হয়। প্রথম চিত্রটি আসল জ্যামিতিগুলি দেখায় এবং দ্বিতীয়টি উপরের নির্বাচনের ফলাফল।

আসল জ্যামিতি বৈশিষ্ট্য গুচ্ছ


1

পোস্টজিমে সর্বাধিক ব্যাসের সাথে ক্লাউডিং পয়েন্টের একক ক্লাস্টার থেকে নীচের দিকে ক্লাস্টারিং সমাধান পান যা কোনও গতিশীল প্রশ্নের সাথে জড়িত না।

CREATE TYPE pt AS (
    gid character varying(32),
    the_geom geometry(Point))

এবং ক্লাস্টার আইডি সহ একটি টাইপ

CREATE TYPE clustered_pt AS (
    gid character varying(32),
    the_geom geometry(Point)
    cluster_id int)

অ্যালগরিদম ফাংশন পরবর্তী

CREATE OR REPLACE FUNCTION buc(points pt[], radius integer)
RETURNS SETOF clustered_pt AS
$BODY$

DECLARE
    srid int;
    joined_clusters int[];

BEGIN

--If there's only 1 point, don't bother with the loop.
IF array_length(points,1)<2 THEN
    RETURN QUERY SELECT gid, the_geom, 1 FROM unnest(points);
    RETURN;
END IF;

CREATE TEMPORARY TABLE IF NOT EXISTS points2 (LIKE pt) ON COMMIT DROP;

BEGIN
    ALTER TABLE points2 ADD COLUMN cluster_id serial;
EXCEPTION
    WHEN duplicate_column THEN --do nothing. Exception comes up when using this function multiple times
END;

TRUNCATE points2;
    --inserting points in
INSERT INTO points2(gid, the_geom)
    (SELECT (unnest(points)).* ); 

--Store the srid to reconvert points after, assumes all points have the same SRID
srid := ST_SRID(the_geom) FROM points2 LIMIT 1;

UPDATE points2 --transforming points to a UTM coordinate system so distances will be calculated in meters.
SET the_geom =  ST_TRANSFORM(the_geom,26986);

--Adding spatial index
CREATE INDEX points_index
ON points2
USING gist
(the_geom);

ANALYZE points2;

LOOP
    --If the smallest maximum distance between two clusters is greater than 2x the desired cluster radius, then there are no more clusters to be formed
    IF (SELECT ST_MaxDistance(ST_Collect(a.the_geom),ST_Collect(b.the_geom))  FROM points2 a, points2 b
        WHERE a.cluster_id <> b.cluster_id
        GROUP BY a.cluster_id, b.cluster_id 
        ORDER BY ST_MaxDistance(ST_Collect(a.the_geom),ST_Collect(b.the_geom)) LIMIT 1)
        > 2 * radius
    THEN
        EXIT;
    END IF;

    joined_clusters := ARRAY[a.cluster_id,b.cluster_id]
        FROM points2 a, points2 b
        WHERE a.cluster_id <> b.cluster_id
        GROUP BY a.cluster_id, b.cluster_id
        ORDER BY ST_MaxDistance(ST_Collect(a.the_geom),ST_Collect(b.the_geom)) 
        LIMIT 1;

    UPDATE points2
    SET cluster_id = joined_clusters[1]
    WHERE cluster_id = joined_clusters[2];

    --If there's only 1 cluster left, exit loop
    IF (SELECT COUNT(DISTINCT cluster_id) FROM points2) < 2 THEN
        EXIT;

    END IF;

END LOOP;

RETURN QUERY SELECT gid, ST_TRANSFORM(the_geom, srid)::geometry(point), cluster_id FROM points2;
END;
$BODY$
LANGUAGE plpgsql

ব্যবহার:

WITH subq AS(
    SELECT ARRAY_AGG((gid, the_geom)::pt) AS points
    FROM data
    GROUP BY collection_id)
SELECT (clusters).* FROM 
    (SELECT buc(points, radius) AS clusters FROM subq
) y;
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.