कुछ शोध के बाद, मैं या तो मक्खी पर मार्कर के लिए बिटमैप बनाने के अलावा कोई बेहतर विकल्प नहीं मिली है। लेकिन मैं मानचित्र पर बहुभुज के साथ सर्कल भी बना रहा हूं। ध्यान रखें कि यह वास्तव में उच्च प्रदर्शन समाधान नहीं है, लेकिन मेरे मामले के लिए यह एक सभ्य विकल्प है। कोड का नमूना:
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 के लिए निरंतर बदलना चाहिए।
मैंने एक और अपेक्षाकृत बेहतर विकल्प के बारे में सोचा है: मार्कर वर्ग का उपयोग करें, लेकिन स्थिर छवि प्रदान करने के बजाय, आवश्यक आकार के बिटमैप ऑब्जेक्ट बनाकर और कैनवास ऑब्जेक्ट के साथ इसमें ड्राइंग करके फ्लाई पर छवि बनाएं। मार्क –
उपर्युक्त विकल्प को क्लस्टर त्रिज्या को छोड़ने की आवश्यकता होती है, क्योंकि इससे हिट परीक्षण के अधीन पूरी चीज (गिनती वाले सर्कल के बजाय) होती है, इस प्रकार त्रिज्या सर्कल के नीचे की चीजों तक पहुंचने से नलियां रोकती हैं लेकिन बाहर गिनती सर्कल। –
एक बिटमैप ऑब्जेक्ट का उपयोग करने से ड्रायरेबल का उपयोग करने पर प्रदर्शन लाभ होगा? –