2008-09-16 13 views
22

मैं मानचित्र (लेट/लांग) पर क्लस्टरिंग पॉइंट्स में देख रहा हूं। क्या एक उपयुक्त एल्गोरिदम के रूप में कोई सिफारिशें हैं जो तेज़ और मापनीय है?मैपिंग अनुप्रयोग के लिए क्लस्टरिंग एल्गोरिदम


@Gilligan: हाँ - मैं अक्षांश/lngs की एक श्रृंखला है, और एक नक्शा व्यूपोर्ट की है। मैं अव्यवस्था को हटाने के लिए एक साथ निकट बिंदुओं को क्लस्टर करने की कोशिश कर रहा हूं।

मुझे पहले से ही समस्या का समाधान है (see here), केवल मैं सोच रहा हूं कि कोई औपचारिक एल्गोरिदम है जो समस्या को कुशलतापूर्वक हल करता है।

+0

है आप अक्षांश और देशांतर द्वारा दिए गए भौतिक स्थानों के आधार पर क्लस्टरिंग रहे हैं? –

+0

आप शायद कुछ दिखा आप क्या हासिल करना चाहते हैं कोड पोस्ट कर सकते हैं? मैं उलझन में हूं कि आप "क्लस्टरिंग" से क्या मतलब रखते हैं। क्या आप उन्हें दुनिया के मानचित्र पर साजिश कर रहे हैं? – Gilligan

उत्तर

6

वर्चुअल धरती अनुप्रयोग के लिए मैंने क्लस्टरिंग का उपयोग here वर्णित किया है। यह बिजली तेज और आसानी से एक्स्टेंसिबल है।

4

आप QuadTile योजना का उपयोग कर अपने सभी बिंदुओं को अनुक्रमणित करने के लिए देख सकते हैं, और उसके बाद आप जिस क्वाड-स्प्लिट्स को आगे बढ़ाते हैं, उसके आधार पर स्केल के आधार पर। तब सभी समान स्थित बिंदु आपके सूचकांक में एक दूसरे के पास होंगे, जिससे क्लस्टरिंग प्रभावी ढंग से हो सकती है।

क्वाडटाइल्स Morton Codes का एक उदाहरण है, और उस विकिपीडिया आलेख से जुड़ा एक अजगर उदाहरण है जो मदद कर सकता है।

1

मैं विभिन्न पुस्तकालयों को देखा और उन्हें इतना जटिल एक शब्द नहीं समझ सकता है पाया तो मैं अपने ही एल्गोरिथ्म क्लस्टरिंग यह गणना करने के लिए

यहाँ जावा

में मेरी कोड चला जाता है
static int OFFSET = 268435456; 
    static double RADIUS = 85445659.4471; 
    static double pi = 3.1444; 

public static double lonToX(double lon) { 
     return Math.round(OFFSET + RADIUS * lon * pi/180); 
    } 

    public static double latToY(double lat) { 
     return Math.round(OFFSET 
       - RADIUS 
       * Math.log((1 + Math.sin(lat * pi/180)) 
         /(1 - Math.sin(lat * pi/180)))/2); 
    } 

// का निर्णय लिया एक विशेष ज़ूम स्तर

public static int pixelDistance(double lat1, double lon1, double lat2, 
      double lon2, int zoom) { 
     double x1 = lonToX(lon1); 
     double y1 = latToY(lat1); 

     double x2 = lonToX(lon2); 
     double y2 = latToY(lat2); 

     return (int) (Math 
       .sqrt(Math.pow((x1 - x2), 2) + Math.pow((y1 - y2), 2))) >> (21 - zoom); 
    } 

// मुख्य कार्य जो वास्तव में समूहों की गणना करता है पर लंबी अंक अक्षां टो के बीच पिक्सेल दूरी 1. लम्बे लंबे बिंदुओं के ऐरेलिस्ट लंबाई के लिए पुनरावृत्त है। 2. आंतरिक लूप एक ही सरणीसूची की एक प्रति i + 1 स्थिति से पुनरावृत्ति की जाती है यानी शीर्ष लूप की अनुक्रमणिका छोड़कर 3. 0 वें तत्व को सेंट्रॉइड के केंद्र के रूप में लिया जाता है और अन्य सभी बिंदुओं की तुलना की जाती है यदि उनकी पिक्सेल दूरी बहुत कम है यह क्लस्टर 4. निकालने में शीर्ष ArrayList से सभी तत्वों और ArrayList जो 0 से सूचकांक reinitializing द्वारा क्लस्टर 5 पुनः आरंभ करने की प्रक्रिया का गठन किया है कॉपी; 6 यदि केन्द्रक चयनित नहीं समूहों तो उस तत्व को हटाया नहीं जाता है

static ArrayList<Cluster> cluster(ArrayList<Marker> markers, int zoom) { 

     ArrayList<Cluster> clusterList = new ArrayList<Cluster>(); 

     ArrayList<Marker> originalListCopy = new ArrayList<Marker>(); 

     for (Marker marker : markers) { 
      originalListCopy.add(marker); 
     } 

     /* Loop until all markers have been compared. */ 
     for (int i = 0; i < originalListCopy.size();) { 

      /* Compare against all markers which are left. */ 

      ArrayList<Marker> markerList = new ArrayList<Marker>(); 
      for (int j = i + 1; j < markers.size();) { 
       int pixelDistance = pixelDistance(markers.get(i).getLatitude(), 
         markers.get(i).getLongitude(), markers.get(j) 
           .getLatitude(), markers.get(j).getLongitude(), 
         zoom); 

       if (pixelDistance < 40) { 

        markerList.add(markers.get(i)); 
        markerList.add(markers.get(j)); 

        markers.remove(j); 

        originalListCopy.remove(j); 
        j = i + 1; 
       } else { 
        j++; 
       } 

      } 

      if (markerList.size() > 0) { 
       Cluster cluster = new Cluster(clusterList.size(), markerList, 
         markerList.size() + 1, originalListCopy.get(i) 
           .getLatitude(), originalListCopy.get(i) 
           .getLongitude()); 
       clusterList.add(cluster); 
       originalListCopy.remove(i); 
       markers.remove(i); 
       i = 0; 

      } else { 
       i++; 
      } 

      /* If a marker has been added to cluster, add also the one */ 
      /* we were comparing to and remove the original from array. */ 

     } 
     return clusterList; 
    } 

Just pass in your array list here containing latitude and longitude 

then to display clusters 
here goes the function 


@Override 
    public void onTaskCompleted(ArrayList<FlatDetails> flatDetailsList) { 

     LatLngBounds.Builder builder = new LatLngBounds.Builder(); 

     originalListCopy = new ArrayList<FlatDetails>(); 
     ArrayList<Marker> markersList = new ArrayList<Marker>(); 
     for (FlatDetails detailList : flatDetailsList) { 

      markersList.add(new Marker(detailList.getLatitude(), detailList 
        .getLongitude(), detailList.getApartmentTypeString())); 

      originalListCopy.add(detailList); 

      builder.include(new LatLng(detailList.getLatitude(), detailList 
        .getLongitude())); 

     } 

     LatLngBounds bounds = builder.build(); 
     int padding = 0; // offset from edges of the map in pixels 
     CameraUpdate cu = CameraUpdateFactory.newLatLngBounds(bounds, padding); 

     googleMap.moveCamera(cu); 

     ArrayList<Cluster> clusterList = Utils.cluster(markersList, 
       (int) googleMap.getCameraPosition().zoom); 

     // Removes all markers, overlays, and polylines from the map. 
     googleMap.clear(); 

     // Zoom in, animating the camera. 
     googleMap.animateCamera(CameraUpdateFactory.zoomTo(previousZoomLevel), 
       2000, null); 

     CircleOptions circleOptions = new CircleOptions().center(point) // 
       // setcenter 
       .radius(3000) // set radius in meters 
       .fillColor(Color.TRANSPARENT) // default 
       .strokeColor(Color.BLUE).strokeWidth(5); 

     googleMap.addCircle(circleOptions); 

     for (Marker detail : markersList) { 

      if (detail.getBhkTypeString().equalsIgnoreCase("1 BHK")) { 
       googleMap.addMarker(new MarkerOptions() 
         .position(
           new LatLng(detail.getLatitude(), detail 
             .getLongitude())) 
         .snippet(String.valueOf("")) 
         .title("Flat" + flatDetailsList.indexOf(detail)) 
         .icon(BitmapDescriptorFactory 
           .fromResource(R.drawable.bhk1))); 
      } else if (detail.getBhkTypeString().equalsIgnoreCase("2 BHK")) { 
       googleMap.addMarker(new MarkerOptions() 
         .position(
           new LatLng(detail.getLatitude(), detail 
             .getLongitude())) 
         .snippet(String.valueOf("")) 
         .title("Flat" + flatDetailsList.indexOf(detail)) 
         .icon(BitmapDescriptorFactory 
           .fromResource(R.drawable.bhk_2))); 

      } 

      else if (detail.getBhkTypeString().equalsIgnoreCase("3 BHK")) { 
       googleMap.addMarker(new MarkerOptions() 
         .position(
           new LatLng(detail.getLatitude(), detail 
             .getLongitude())) 
         .snippet(String.valueOf("")) 
         .title("Flat" + flatDetailsList.indexOf(detail)) 
         .icon(BitmapDescriptorFactory 
           .fromResource(R.drawable.bhk_3))); 

      } else if (detail.getBhkTypeString().equalsIgnoreCase("2.5 BHK")) { 
       googleMap.addMarker(new MarkerOptions() 
         .position(
           new LatLng(detail.getLatitude(), detail 
             .getLongitude())) 
         .snippet(String.valueOf("")) 
         .title("Flat" + flatDetailsList.indexOf(detail)) 
         .icon(BitmapDescriptorFactory 
           .fromResource(R.drawable.bhk2))); 

      } else if (detail.getBhkTypeString().equalsIgnoreCase("4 BHK")) { 
       googleMap.addMarker(new MarkerOptions() 
         .position(
           new LatLng(detail.getLatitude(), detail 
             .getLongitude())) 
         .snippet(String.valueOf("")) 
         .title("Flat" + flatDetailsList.indexOf(detail)) 
         .icon(BitmapDescriptorFactory 
           .fromResource(R.drawable.bhk_4))); 

      } else if (detail.getBhkTypeString().equalsIgnoreCase("5 BHK")) { 
       googleMap.addMarker(new MarkerOptions() 
         .position(
           new LatLng(detail.getLatitude(), detail 
             .getLongitude())) 
         .snippet(String.valueOf("")) 
         .title("Flat" + flatDetailsList.indexOf(detail)) 
         .icon(BitmapDescriptorFactory 
           .fromResource(R.drawable.bhk5))); 

      } else if (detail.getBhkTypeString().equalsIgnoreCase("5+ BHK")) { 
       googleMap.addMarker(new MarkerOptions() 
         .position(
           new LatLng(detail.getLatitude(), detail 
             .getLongitude())) 
         .snippet(String.valueOf("")) 
         .title("Flat" + flatDetailsList.indexOf(detail)) 
         .icon(BitmapDescriptorFactory 
           .fromResource(R.drawable.bhk_5))); 

      } 

      else if (detail.getBhkTypeString().equalsIgnoreCase("2 BHK")) { 
       googleMap.addMarker(new MarkerOptions() 
         .position(
           new LatLng(detail.getLatitude(), detail 
             .getLongitude())) 
         .snippet(String.valueOf("")) 
         .title("Flat" + flatDetailsList.indexOf(detail)) 
         .icon(BitmapDescriptorFactory 
           .fromResource(R.drawable.bhk_2))); 

      } 
     } 

     for (Cluster cluster : clusterList) { 

      BitmapFactory.Options options = new BitmapFactory.Options(); 
      options.inMutable = true; 
      options.inPurgeable = true; 
      Bitmap bitmap = BitmapFactory.decodeResource(getResources(), 
        R.drawable.cluster_marker, options); 

      Canvas canvas = new Canvas(bitmap); 

      Paint paint = new Paint(); 
      paint.setColor(getResources().getColor(R.color.white)); 
      paint.setTextSize(30); 

      canvas.drawText(String.valueOf(cluster.getMarkerList().size()), 10, 
        40, paint); 

      googleMap.addMarker(new MarkerOptions() 
        .position(
          new LatLng(cluster.getClusterLatitude(), cluster 
            .getClusterLongitude())) 
        .snippet(String.valueOf(cluster.getMarkerList().size())) 
        .title("Cluster") 
        .icon(BitmapDescriptorFactory.fromBitmap(bitmap))); 

     } 

    } 




ANY QUESTIONS OR DOUBTS PLEASE ASK WILL CLEAR THEM ALL ...........THANKS 
+0

कृपया कोई भी पाठ्य व्याख्या? –

+0

कोड केवल जवाब आम तौर पर हतोत्साहित किया जाता है ... कैसे इस कोड को इस्तेमाल किया जा रहा है कि यह कैसे समस्या को हल करती है/के बारे में अधिक जानकारी शामिल करें। –

+0

हाय पराग और Coley Brigman कोड इनलाइन टिप्पणी है।क्या आप लोग कृपया मुझे बता सकते हैं कि आप मुझे किस भाग को समझाना चाहते हैं मैं – user1530779

संबंधित मुद्दे