2012-12-19 41 views
6

एंड्रॉइड के लिए Google मानचित्र के वी 1 में मैंने ItemizedOverlay क्लास का उपयोग करके क्लस्टरिंग का एक रूप लागू किया। प्रत्येक क्लस्टर में केंद्र बिंदु (लेट/लॉन), त्रिज्या (मील में) और क्लस्टर में वस्तुओं की संख्या की गणना होती है। मैंने TextizedOverlay.draw (कैनवास, मैप व्यू, छाया) का उपयोग क्लस्टर को ड्रॉक्रैस ऑब्जेक्ट विधियों जैसे ड्रॉक्रिकल() और drawText() का उपयोग करने के लिए किया था। प्रत्येक क्लस्टर में एक भरे सर्कल (गिनती के लिए आवश्यक स्थान के अनुसार आकार) होता है जिसमें गिनती होती है और त्रिज्या दिखाते हुए एक चक्र होता है।एंड्रॉइड के लिए Google मानचित्र V2 में ItemizedOverlay के लिए प्रतिस्थापन?

वी 2 पर दस्तावेज़ पढ़ने और डेमो ऐप के साथ खेलने के बाद, मुझे ItemizedOverlay के बराबर नहीं दिखता है, और कोई स्पष्ट विकल्प नहीं है। मुझे संदेह है कि ऐसा करने का एकमात्र तरीका क्लस्टर की सूची बनाए रखना है, और उसके बाद मैप व्यू को उपclass और इसके ऑन ड्रा() विधि को कार्यान्वित करना है।

क्या मुझे वी 2 एपीआई में कुछ याद आया है जो मैप व्यू को उपclassing से बेहतर होगा?

धन्यवाद,

मार्क

+0

मैंने एक और अपेक्षाकृत बेहतर विकल्प के बारे में सोचा है: मार्कर वर्ग का उपयोग करें, लेकिन स्थिर छवि प्रदान करने के बजाय, आवश्यक आकार के बिटमैप ऑब्जेक्ट बनाकर और कैनवास ऑब्जेक्ट के साथ इसमें ड्राइंग करके फ्लाई पर छवि बनाएं। मार्क –

+0

उपर्युक्त विकल्प को क्लस्टर त्रिज्या को छोड़ने की आवश्यकता होती है, क्योंकि इससे हिट परीक्षण के अधीन पूरी चीज (गिनती वाले सर्कल के बजाय) होती है, इस प्रकार त्रिज्या सर्कल के नीचे की चीजों तक पहुंचने से नलियां रोकती हैं लेकिन बाहर गिनती सर्कल। –

+0

एक बिटमैप ऑब्जेक्ट का उपयोग करने से ड्रायरेबल का उपयोग करने पर प्रदर्शन लाभ होगा? –

उत्तर

4

कुछ शोध के बाद, मैं या तो मक्खी पर मार्कर के लिए बिटमैप बनाने के अलावा कोई बेहतर विकल्प नहीं मिली है। लेकिन मैं मानचित्र पर बहुभुज के साथ सर्कल भी बना रहा हूं। ध्यान रखें कि यह वास्तव में उच्च प्रदर्शन समाधान नहीं है, लेकिन मेरे मामले के लिए यह एक सभ्य विकल्प है। कोड का नमूना:

private static final int CIRCLE_POLYGON_VERTICES = 16; 
private static final double EARTH_RADIUS = 6378.1d; 


private List<LatLng> createCirclePolygon(LatLng center, double r) { 
    List<LatLng> res = new ArrayList<LatLng>(CIRCLE_POLYGON_VERTICES); 

    double r_latitude = MathUtils.rad2deg(r/EARTH_RADIUS); 
    double r_longitude = r_latitude/Math.cos(MathUtils.deg2rad(center.latitude)); 

    for (int point = 0; point < CIRCLE_POLYGON_VERTICES + 1; point++) { 
     double theta = Math.PI * ((double)point/(CIRCLE_POLYGON_VERTICES/2)); 
     double circle_x = center.longitude + (r_longitude * Math.cos(theta)); 
     double circle_y = center.latitude + (r_latitude * Math.sin(theta));  

     res.add(new LatLng(circle_y, circle_x)); 
    } 
    return res; 
} 

private Bitmap getClusteredLabel(String cnt, Context ctx) { 
    Resources r = ctx.getResources(); 
    Bitmap res = BitmapFactory.decodeResource(r, R.drawable.map_cluster_bg);   
    res = res.copy(Bitmap.Config.ARGB_8888, true); 
    Canvas c = new Canvas(res); 

    Paint textPaint = new Paint(); 
    textPaint.setAntiAlias(true); 
    textPaint.setTextAlign(Paint.Align.CENTER); 
    textPaint.setTypeface(Typeface.DEFAULT_BOLD); 
    textPaint.setColor(Color.WHITE); 
    textPaint.setTextSize(21);  

    c.drawText(String.valueOf(cnt), res.getWidth()/2, res.getHeight()/2 + textPaint.getTextSize()/3, textPaint); 

    return res; 
} 

public void createClusteredOverlay(MapPinData point, GoogleMap map, Context ctx) { 
    if (point.getCount() > 1) { 
     map.addMarker(new MarkerOptions().position(point.getLatLng()).anchor(0.5f, 0.5f).icon(BitmapDescriptorFactory.fromBitmap(getClusteredLabel(String.valueOf(point.getCount()), ctx)))); 

     map.addPolygon(new PolygonOptions()   
     .addAll(createCirclePolygon(point.getLatLng(), point.getRadius())) 
     .fillColor(Color.argb(50, 0, 0, 10))  
     .strokeWidth(0) 
     ); 
    } else { 
     map.addMarker(new MarkerOptions().position(point.getLatLng()).title(point.getTitle())); 
    } 
} 

मेरे MathUtils तरीके:

public static double deg2rad(double deg) { 
    return (deg * Math.PI/180.0); 
} 

public static double rad2deg(double rad) { 
    return (rad * 180.0/Math.PI); 
} 

आप मील में त्रिज्या है, तो आप EARTH_RADIUS मील की दूरी पर, 3963 AFAIK के लिए निरंतर बदलना चाहिए।

+0

ऐसा लगता है कि कुछ आकार के मार्कर के अंदर खींचे गए क्लस्टर गिनती और त्रिज्या का प्रतिनिधित्व करने वाले सर्कल के आस-पास के अनुमान के साथ मार्कर का उत्पादन होता है, ऐसे सभी मार्कर समान आयाम होते हैं? यह काम करने योग्य है यदि सभी मार्कर समान आकार रखते हैं और हर समय प्रत्येक त्रिज्या दिखाई दे रहा है, और यह सुनिश्चित करता है कि केवल मार्कर को टैप किया जा सके। मैं त्रिज्या को आकर्षित करने के लिए ट्रिगर के रूप में किसी ईवेंट का उपयोग करने का एक तरीका ढूंढने की उम्मीद कर रहा हूं, लेकिन आदर्श घटना (लंबी प्रेस) मार्करों के लिए अनुपलब्ध है। –

+0

आप रेड <-> डिग्री रूपांतरण के लिए इनबिल्ट विधियों का भी उपयोग कर सकते हैं। 1. Math.toDegrees (angrad) 2. Math.toRadians (angdeg) – rajankz