PostGIS के लिए कम से कम दो अच्छे क्लस्टरिंग तरीके हैं: k -means ( kmeans-postgresql
एक्सटेंशन के माध्यम से ) या एक थ्रेसहोल्ड दूरी के भीतर क्लस्टरिंग ज्यामितीय (PostGIS 2.2)
1) k -means के साथkmeans-postgresql
स्थापना: आपको पोस्टग्रेएसक्यूएल 8.4 या पोसिक्स होस्ट सिस्टम पर अधिक होना चाहिए (मुझे नहीं पता कि एमएस विंडोज के लिए कहां से शुरू करना है)। यदि आपने इसे संकुल से स्थापित किया है, तो सुनिश्चित करें कि आपके पास विकास पैकेज (जैसे, postgresql-devel
CentOS के लिए) है। डाउनलोड करें और निकालें:
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
(नोट: मैंने उबंटू 10.10 के साथ भी यह कोशिश की, लेकिन कोई किस्मत नहीं है, क्योंकि इसमें पथ pg_config --pgxs
मौजूद नहीं है! यह शायद उबंटू पैकेजिंग है)
उपयोग / उदाहरण: आपके पास बिंदुओं की एक तालिका होनी चाहिए (मैंने QGIS में छद्म यादृच्छिक बिंदुओं का एक गुच्छा खींचा)। यहाँ एक उदाहरण है कि मैंने क्या किया:
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
खिड़की समारोह है कश्मीर पूर्णांक पाँच समूहों का निर्माण करने के। आप इसे अपने इच्छित पूर्णांक में बदल सकते हैं।
नीचे 31 छद्म यादृच्छिक बिंदु हैं जिन्हें मैंने आकर्षित किया है और प्रत्येक क्लस्टर में गिनती दिखाते हुए लेबल के साथ पांच सेंट्रोइड हैं। यह उपरोक्त SQL क्वेरी का उपयोग करके बनाया गया था।
आप यह भी स्पष्ट करने का प्रयास कर सकते हैं कि ये क्लस्टर ST_MinimumBoundingCircle के साथ कहाँ हैं :
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;
2) के साथ एक सीमा दूरी के भीतर क्लस्टरिंग ST_ClusterWithin
यह कुल फ़ंक्शन PostGIS 2.2 के साथ शामिल है, और ज्यामिति के एक सरणी को लौटाता है जहां सभी घटक एक दूसरे से कुछ दूरी पर हैं।
यहां एक उदाहरण का उपयोग किया गया है, जहां 100.0 की दूरी पर सीमा होती है, जिसके परिणामस्वरूप 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;
सबसे बड़े मध्य क्लस्टर में 65.3 यूनिट या लगभग 130 का एक संलग्न घेरा त्रिज्या है, जो दहलीज से बड़ा है। ऐसा इसलिए है क्योंकि सदस्य ज्यामितीयों के बीच की व्यक्तिगत दूरी थ्रेशोल्ड से कम है, इसलिए यह इसे एक बड़े क्लस्टर के रूप में एक साथ जोड़ता है।