рдореБрдЭреЗ рд╣рд╛рд▓ рд╣реА рдореЗрдВ Google рдорд╛рдирдЪрд┐рддреНрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХрд░рдиреЗ рдХрд╛ рдореМрдХрд╛ рдорд┐рд▓рд╛ред рдПрдХ рдмрд┐рдВрджреБ рдкрд░, рдореИрдВрдиреЗ рдпрд╣ рдЪрд┐рддреНрд░ рджреЗрдЦрд╛:


рдРрд╕рд╛ рд╣реБрдЖ, рдЖрдкрдиреЗ рдЗрд╕рдХрд╛ рдЕрдиреБрдорд╛рди рд▓рдЧрд╛рдпрд╛, рдЬрдм рдЖрд╕-рдкрд╛рд╕ рдмрд╣реБрдд рд╕рд╛рд░реЗ рд╕реНрдерд╛рди рдереЗ рдЬрд┐рдиреНрд╣реЗрдВ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдереАред рдареАрдХ рд╣реИ, рдХреБрдЫ рднреА рдирд╣реАрдВ - рд╕рдорд╕реНрдпрд╛ рдПрдХ рддрд░рд╣ рдХрд╛ рдорд╛рдирдХ рд╣реИ - рдмрд╣реБрдд рд╕рд╛рд░реЗ рд▓реЛрдЧреЛрдВ рдХреЛ рдпрд╣ рдорд┐рд▓рдирд╛ рдЪрд╛рд╣рд┐рдП, рд╢рд╛рдпрдж рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЛ рдЧреНрд░реБрдкрд┐рдВрдЧ рдФрд░ рдлрд╝рд┐рд▓реНрдЯрд░рд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдкреНрд░рджрд╛рди рдХрд┐рдпрд╛ рдЧрдпрд╛ ... рд╣рд╛рдБ, рдпрд╣ рд╡рд╣рд╛рдБ рдирд╣реАрдВ рдерд╛! рджрд╕реНрддрд╛рд╡реЗрдЬрд╝реАрдХрд░рдг рдХреА рд╕рдореАрдХреНрд╖рд╛ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж (рдореИрдВ рддреБрд░рдВрдд рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддрд╛ рд╣реВрдВ рдХрд┐ рдореИрдВ рдХреЗрд╡рд▓ рдзрд╛рд░рд╛рдкреНрд░рд╡рд╛рд╣ - рд╢рд╛рдпрдж рдореБрдЭреЗ рдпрд╛рдж рдЖрдпрд╛ рдХрд┐ рдореБрдЭреЗ рдХреНрдпрд╛ рдЪрд╛рд╣рд┐рдП) рдФрд░ Google рд╕реЗ рдкреВрдЫрд╛ - рдЕрдкрдиреЗ рдЖрд╢реНрдЪрд░реНрдп рдХреЗ рд▓рд┐рдП, рдореБрдЭреЗ рдЬрд▓реНрджреА рд╕реЗ рдХреБрдЫ рднреА рдирд╣реАрдВ рдорд┐рд▓рд╛ред рдЦреИрд░, рдХреБрдЫ рднреА рдирд╣реАрдВ - рджреЗрд╡рддрд╛рдУрдВ рдиреЗ рдмрд░реНрддрдиреЛрдВ рдХреЛ рдирд╣реАрдВ рдЬрд▓рд╛рдпрд╛ - рдлрд┐рд░ рд╣рдо рдЗрд╕реЗ рд╕реНрд╡рдпрдВ рд▓рд┐рдЦреЗрдВрдЧреЗред
рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдПрдХ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдмрдирд╛рдПрдВ рдФрд░ рдЙрд╕рдореЗрдВ рдЧреВрдЧрд▓ рдореИрдкреНрд╕ рдПрдкреА рд╕реЗ рдХрдиреЗрдХреНрдЯ рдХрд░реЗрдВред рдпрд╣рд╛рдВ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдХреБрдЫ рднреА рд╕рдордЭрд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ - рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдкрд╣рд▓реЗ рд╣реА рдмрд╣реБрдд рдХреБрдЫ рд▓рд┐рдЦрд╛ рдЬрд╛ рдЪреБрдХрд╛ рд╣реИ, рд╡реИрд╕реЗ, рд╣рдм рдХреЗ рд▓рд┐рдВрдХ
рдПрдХ ,
рджреЛ ,
рддреАрди рд╣реИрдВ ред
рдкрд╣рд▓реЗ рд╣рдо рддрдп рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рдЙрд╕реЗ рдХреНрдпрд╛ рдФрд░ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рдЖрдЗрдП рдЬрд╛рдиреЗ ...
рдЬрд╛рд╣рд┐рд░ рд╣реИ, рд╣рдореЗрдВ рдХреБрдЫ рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдХреЗ рд╕рд╛рде рдЖрдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИ рдЬрд┐рд╕рдХреЗ рджреНрд╡рд╛рд░рд╛ рд╕рднреА рдкрд┐рди рд╕реНрдХреНрд░реАрди рдкрд░ рдкреНрд░рджрд░реНрд╢рд┐рдд рдирд╣реАрдВ рд╣реЛрдВрдЧреЗ, рд▓реЗрдХрд┐рди рдХреЗрд╡рд▓ рдПрдХ рджреВрд╕рд░реЗ рд╕реЗ рдирд┐рд╢реНрдЪрд┐рдд рджреВрд░реА рдкрд░ред рдФрд░ рдЖрдкрдХреЛ рдпрд╣ рднреА рд╕реАрдЦрдирд╛ рд╣реЛрдЧрд╛ рдХрд┐ рдЙрдиреНрд╣реЗрдВ рд╕рдореВрд╣реЛрдВ рдореЗрдВ рдХреИрд╕реЗ рд╕рдВрдпреЛрдЬрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПред рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕ рд╕рднреА рдЕрд░реНрдерд╡реНрдпрд╡рд╕реНрдерд╛ рдХрд╛ рдПрдХ рддрд╛рд▓рдореЗрд▓ рдЖрд╡рд╢реНрдпрдХ рд╣реИ:
1) рдХрд╛рд░реНрдб рдкрд░ рдкрд┐рди рдХреЗ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рд▓реЛрдбрд┐рдВрдЧ рдкрд░ред
2) рдЬрд╝реВрдо рдмрджрд▓рддреЗ рд╕рдордп
рдкрд╣рд▓реЗ рдкреИрд░рд╛рдЧреНрд░рд╛рдл рдХреЗ рд╕рд╛рде, рд╕рд┐рджреНрдзрд╛рдВрдд рд░реВрдк рдореЗрдВ, рд╕рдм рдХреБрдЫ рд╕реНрдкрд╖реНрдЯ рд╣реИ - рдЪрд▓реЛ рджреВрд╕рд░реЗ рдкрд░ рдлреИрд╕рд▓рд╛ рдХрд░рддреЗ рд╣реИрдВред рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдШреЛрд╖рд┐рдд рдХрд░реЗрдВ:
public interface IOnZoomListener { void onZoomChanged(); }
рдФрд░ рд╣рдо рдЕрдкрдиреЗ MapView рдХреЛ рдЗрд╕ рддрд░рд╣ рд╕реЗ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рддреЗ рд╣реИрдВ:
public class MyMapView extends MapView { int oldZoomLevel = -1; IOnZoomListener onZoomListener; public MyMapView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); } public MyMapView(Context context, String apiKey) { super(context, apiKey); } public MyMapView(Context context, AttributeSet attrs) { super(context, attrs); } public void setOnZoomListener(IOnZoomListener onZoomListener) { this.onZoomListener = onZoomListener; } @Override public void dispatchDraw(Canvas canvas) { super.dispatchDraw(canvas); int newZoom = this.getZoomLevel(); if (newZoom != oldZoomLevel) { if (oldZoomLevel != -1 && onZoomListener != null) { onZoomListener.onZoomChanged(); } oldZoomLevel = getZoomLevel(); } } }
рдпрд╣рд╛рдВ рд╣рдордиреЗ рдмрд╕ рдЕрдкрдиреЗ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛ рдкрдВрдЬреАрдХреГрдд рдХрд░рдиреЗ рдФрд░ рдЬрд╝реВрдорд▓рд╡реЗрд▓ рдХреЛ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдбреНрд░рд╛рдЗрдВрдЧ рдХреА рдЬрд╛рдВрдЪ рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рдХреЛ рдЬреЛрдбрд╝рд╛ (рдпрджрд┐ рдЬрд╝реВрдорд▓реАрд╡реЗрд▓ рдмрджрд▓ рдЧрдпрд╛ рд╣реИ - рд╣рдо рдЕрдкрдиреЗ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреА рд╡рд┐рдзрд┐ рдХреЛ рдЦреАрдВрдЪрддреЗ рд╣реИрдВ)ред
рдЕрдм рд╣рдо рддрдп рдХрд░реЗрдВрдЧреЗ рдХрд┐ рд╣рдо рдирдХреНрд╢реЗ рдкрд░ рдкрд┐рдВрд╕ рдХреИрд╕реЗ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░реЗрдВрдЧреЗ рдФрд░ рдЙрдиреНрд╣реЗрдВ рд╕рдореВрд╣реЛрдВ рдореЗрдВ рдХреИрд╕реЗ рд╕рдВрдпреЛрдЬрд┐рдд рдХрд░реЗрдВрдЧреЗред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдирд┐рдореНрди рдЬреЛрдбрд╝ рдХреЗ рд╕рд╛рде OverlayItem рд╕реЗ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдорд┐рд▓реА MyOverlayItem рд╢реНрд░реЗрдгреА рдмрдирд╛рдПрдВ:
public class MyOverlayItem extends OverlayItem { private String name; private ArrayList<MyOverlayItem> list = new ArrayList<MyOverlayItem>(); public MyOverlayItem(GeoPoint point, String name) { super(point, "", ""); this.name = name; } public String getName() { if (list.size() > 0) { return "There are " + (list.size() + 1) + " places."; } else { return name; } } public void addList(MyOverlayItem item) { list.add(item); } public ArrayList<MyOverlayItem> getList() { return list; } }
рд╕рдореВрд╣рдмрджреНрдз рдкрд┐рди рдХреА рдПрдХ рд╕реВрдЪреА ArrayList рд╕реВрдЪреА рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХреА рдЬрд╛рдПрдЧреА, рдФрд░ getName рд╡рд┐рдзрд┐ рд╣рдореЗрдВ рдпрд╛ рддреЛ рд╕рдореВрд╣ рдореЗрдВ рдСрдмреНрдЬреЗрдХреНрдЯ рдХрд╛ рдирд╛рдо рдпрд╛ рдЙрдирдХреА рд╕рдВрдЦреНрдпрд╛ рд╡рд╛рдкрд╕ рдХрд░ рджреЗрдЧреАред
рдЕрдм рд╣рдо рд╡рд░реНрдгрди рдХрд░реЗрдВрдЧреЗ рдХрд┐ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдпрд╣ рд╕рдм рдХрд┐рд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдерд╛ - рд╣рдорд╛рд░рд╛ рд╕рдВрд╢реЛрдзрд┐рдд ItemizedOverlayред
рдлрд╝рд┐рд▓реНрдЯрд░рд┐рдВрдЧ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХрд╛ рд╕рд╛рд░ рдХрд╛рдлреА рд╕рд░рд▓ рд╣реИ: рд╣рдо рдмрд╕ рд╕рднреА рдореМрдЬреВрджрд╛ рддрддреНрд╡реЛрдВ рдкрд░ рд▓реВрдк рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЪрд▓рддреЗ рд╣реИрдВ рдФрд░ рддрддреНрд╡реЛрдВ рдХреЗ рдореМрдЬреВрджрд╛ рд╕рдореВрд╣ рдХреЗ рд╕рд╛рде рдирд┐рдХрдЯ рджреВрд░реА рдХреЗ рд▓рд┐рдП рдкреНрд░рддреНрдпреЗрдХ рддрддреНрд╡ рдХреА рдЬрд╛рдВрдЪ рдХрд░рддреЗ рд╣реИрдВред рдпрджрд┐ рд╣рдореЗрдВ рдРрд╕рд╛ рдХреЛрдИ рд╕рдореВрд╣ рдорд┐рд▓рд╛ рд╣реИ - рддрддреНрд╡ рдХреЛ рдЗрд╕рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЬрд╛рддрд╛ рд╣реИ, рдпрджрд┐ рдирд╣реАрдВ - рдЗрд╕ рддрддреНрд╡ рдХреЗ рд╕рд╛рде рдПрдХ рдирдпрд╛ рд╕рдореВрд╣ рдмрдирд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:
boolean isImposition; for (MyOverlayItem itemFromAll : myOverlaysAll) { isImposition = false; for (MyOverlayItem item : myOverlays) { if (itemFromAll == item) { isImposition = true; break; } if (isImposition(itemFromAll, item)) { item.addList(itemFromAll); isImposition = true; break; } } if (!isImposition) { myOverlays.add(itemFromAll); } }
рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рджреВрд░реА рдХреА рдЬрд╛рдВрдЪ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдореИрдВ рд╕рд┐рд░реНрдл рдкрд┐рди рдХреЗ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛ (рдЕрдХреНрд╖рд╛рдВрд╢ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рд╣реЛрдиреЗ рд╡рд╛рд▓реА рддреНрд░реБрдЯрд┐ рдХреЛ рдЙрдкреЗрдХреНрд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рджреВрд░реА рдмрдбрд╝реА рдирд╣реАрдВ рд╣реИ), рд▓реЗрдХрд┐рди рдлрд┐рд░ рдореБрдЭреЗ рдЬрд╝реВрдорд▓реЗрд╡рд▓ рдХреЛ рднреА рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред
MapView.getLatitudeSpan рд╡рд┐рдзрд┐, рдЬреЛ рд╣рдореЗрдВ рдЙрд╕ рд╕рдордиреНрд╡рдп рдкреНрд░рдгрд╛рд▓реА рдореЗрдВ рд╕реНрдХреНрд░реАрди рдХреА рджреГрд╢реНрдпрдорд╛рди рдЪреМрдбрд╝рд╛рдИ рдХреА рджреВрд░реА рд▓реМрдЯрд╛рддреА рд╣реИ, рдЬрд┐рд╕рдХреА рдореБрдЭреЗ рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдореЗрд░реЗ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдХрд╛рдлреА рдЙрдкрдпреБрдХреНрдд рдереАред рдпрд╣ рдХреЗрд╡рд▓ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рдХрд╛рд░рдХ (рдХрд┐рддрдиреЗ рдЕрдзрд┐рдХрддрдо рдкрд┐рди рд╕реНрдХреНрд░реАрди рдореЗрдВ "рдлрд┐рдЯ" рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП) рджреНрд╡рд╛рд░рд╛ рдЗрд╕ рджреВрд░реА рдХреЛ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрдиреА рд╣реБрдИ рд╣реИ - рдпрд╣ рдкрд┐рди рдХреЗ рдмреАрдЪ рдиреНрдпреВрдирддрдо рджреВрд░реА рд╣реЛрдЧреА:
private boolean isImposition(MyOverlayItem item1, MyOverlayItem item2) { int latspan = mapView.getLatitudeSpan(); int delta = latspan / KOEFF; int dx = item1.getPoint().getLatitudeE6() - item2.getPoint().getLatitudeE6(); int dy = item1.getPoint().getLongitudeE6() - item2.getPoint().getLongitudeE6(); double dist = Math.sqrt(dx * dx + dy * dy); if (dist < delta) { return true; } else { return false; } }
рдпрд╣рд╛рдБ, рдХреЗрд╡рд▓ рдорд╛рдорд▓реЗ рдореЗрдВ, рдкреВрд░реНрдг рд╡рд░реНрдЧ рд╕реНрд░реЛрдд:
public class PlaceOverlay extends ItemizedOverlay<MyOverlayItem> { private static final int KOEFF = 20; private ArrayList<MyOverlayItem> myOverlaysAll = new ArrayList<MyOverlayItem>(); private ArrayList<MyOverlayItem> myOverlays = new ArrayList<MyOverlayItem>(); private MapView mapView; public PlaceOverlay(Drawable defaultMarker, MapView mapView) { super(boundCenterBottom(defaultMarker)); this.mapView = mapView; populate(); } public void addOverlay(MyOverlayItem overlay) { myOverlaysAll.add(overlay); myOverlays.add(overlay); } public void doPopulate() { populate(); setLastFocusedIndex(-1); } @Override protected MyOverlayItem createItem(int i) { return myOverlays.get(i); } @Override public int size() { return myOverlays.size(); } private boolean isImposition(MyOverlayItem item1, MyOverlayItem item2) { int latspan = mapView.getLatitudeSpan(); int delta = latspan / KOEFF; int dx = item1.getPoint().getLatitudeE6() - item2.getPoint().getLatitudeE6(); int dy = item1.getPoint().getLongitudeE6() - item2.getPoint().getLongitudeE6(); double dist = Math.sqrt(dx * dx + dy * dy); if (dist < delta) { return true; } else { return false; } } public void clear() { myOverlaysAll.clear(); myOverlays.clear(); } public void calculateItems() { myOverlaysClear(); boolean isImposition; for (MyOverlayItem itemFromAll : myOverlaysAll) { isImposition = false; for (MyOverlayItem item : myOverlays) { if (itemFromAll == item) { isImposition = true; break; } if (isImposition(itemFromAll, item)) { item.addList(itemFromAll); isImposition = true; break; } } if (!isImposition) { myOverlays.add(itemFromAll); } } doPopulate(); } private void myOverlaysClear() { for (MyOverlayItem item : myOverlaysAll) { item.getList().clear(); } myOverlays.clear(); } @Override protected boolean onTap(int index) { Toast.makeText(mapView.getContext(), myOverlays.get(index).getName(), Toast.LENGTH_SHORT).show(); return true; } }
рдЕрд░реЗ рд╣рд╛рдБ - onTap рдкрджреНрдзрддрд┐ рдореЗрдВ рд╣рдо рдЯреЛрд╕реНрдЯ рдХреЛ рд╕рдореВрд╣ рдХреЗ рдирд╛рдо рд╕реЗ рдЖрдЙрдЯрдкреБрдЯ рдХрд░рддреЗ рд╣реИрдВ - рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдХреЗ рд╕рдВрдЪрд╛рд▓рди рдХреЛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдПред
рдореИрдВ рдЬреЛрдбрд╝рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдХрд┐ рдпрд╣ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдЕрдВрддрд┐рдо рд╕рддреНрдп рдирд╣реАрдВ рд╣реИ - рдпрд╣ рд╕реБрдзрд╛рд░ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП - рд╕рдореВрд╣ рдХреЗ рдкрд╣рд▓реЗ рддрддреНрд╡ рдХреА рд╕рд╛рдЗрдЯ рдкрд░ рдирд╣реАрдВ рдПрдХ рдкрд┐рди рдЦреАрдВрдЪреЗрдВ, рд▓реЗрдХрд┐рди рдЗрд╕рдХреА рд╕рд╛рдордЧреНрд░реА рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдЗрд╕рдХреЗ рд╕реНрдерд╛рди рдХреА рдЧрдгрдирд╛ рдХрд░реЗрдВред рд▓реЗрдХрд┐рди рдЖрдк рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЕрдкрдиреА рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдореЗрдВ рдЦреБрдж рдХреЛ рдорд╣рд╕реВрд╕ рдХрд░рддреЗ рд╣реИрдВред
рдЕрдм рдЖрдЗрдП рдЬрд╛рдиреЗрдВ рдХрд┐ рдпрд╣ рд╕рдм рдПрдХ рд╕рд╛рде рдХреИрд╕реЗ рд░рдЦрд╛ рдЬрд╛рдПред
рдЪрд▓рд┐рдП рдХрдИ PinsProjectActivity рдмрдирд╛рддреЗ рд╣реИрдВ рдЬреЛ рд╣рдореЗрдВ MapActivity рд╕реЗ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдорд┐рд▓реЗрдЧрд╛ рдФрд░ рд╣рдо рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЗрдВрдЯрд░рдлреЗрд╕ рдХреЛ рд▓рд╛рдЧреВ рдХрд░реЗрдВрдЧреЗ: LocationListener, IOnZoomListenerред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдореИрдВ рд╕рдм рдХреБрдЫ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рдирд╣реАрдВ рдЪрд┐рддреНрд░рд┐рдд рдХрд░реВрдВрдЧрд╛ - рд╕реНрд░реЛрдд рдореЗрд░реЗ рд▓рд┐рдП рд╕рдм рдХреБрдЫ рдмрддрд╛рдПрдЧрд╛:
public class ManyPinsProjectActivity extends MapActivity implements LocationListener, IOnZoomListener { private static final int DEFAULT_ZOOM = 15; private MyMapView mapView = null; private Drawable myCurrentMarker = null; private Drawable placeMarker = null; private List<Overlay> mapOverlays; private PlaceOverlay placeOverlay; private MyCurrentLocationOverlay myCurrentLocationOverlay; double currentLatitude, currentLongitude; private MapController mapController; private LocationManager locationManager; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); locationManager = (LocationManager) this.getSystemService(Context.LOCATION_SERVICE); mapView = (MyMapView) findViewById(R.id.mapview); myCurrentMarker = this.getResources().getDrawable(R.drawable.my_pin_red); placeMarker = this.getResources().getDrawable(R.drawable.my_pin); myCurrentLocationOverlay = new MyCurrentLocationOverlay(myCurrentMarker, mapView); placeOverlay = new PlaceOverlay(placeMarker, mapView); mapOverlays = mapView.getOverlays(); mapController = mapView.getController(); mapView.setBuiltInZoomControls(true); mapView.setOnZoomListener(this); } private void animateToPlaceOnMap(final GeoPoint geopoint) { mapView.post(new Runnable() { @Override public void run() { mapView.invalidate(); mapController.animateTo(geopoint); mapController.setZoom(DEFAULT_ZOOM); } }); } private void setCurrentGeopoint(double myLatitude, double myLongitude) { currentLatitude = myLatitude; currentLongitude = myLongitude; final GeoPoint myCurrentGeoPoint = new GeoPoint((int) (myLatitude * 1E6), (int) (myLongitude * 1E6)); MyOverlayItem myCurrentItem = new MyOverlayItem(myCurrentGeoPoint, "Current Location"); myCurrentLocationOverlay.addOverlay(myCurrentItem); mapOverlays.add(myCurrentLocationOverlay); animateToPlaceOnMap(myCurrentGeoPoint); } @Override protected void onPause() { super.onPause(); locationManager.removeUpdates(this); } @Override protected void onResume() { super.onResume(); locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 5000, 100, this); } private ArrayList<PlaceInfo> generatePlaces(){ Random random = new Random(); int x, y; ArrayList<PlaceInfo> places = new ArrayList<PlaceInfo>(); PlaceInfo p; for(int i = 0; i < 100; i++){ x = random.nextInt(2000); y = random.nextInt(2000); p = new PlaceInfo(); p.setLatitude(currentLatitude + x/100000f); p.setLongitude(currentLongitude - y/100000f); p.setName("Place тДЦ " + i); places.add(p); } return places; } private void displayPlacesOnMap() { ArrayList<PlaceInfo> places = generatePlaces(); mapOverlays.remove(placeOverlay); GeoPoint point = null; MyOverlayItem overlayitem = null; placeOverlay.clear(); for (PlaceInfo place : places) { point = new GeoPoint((int) (place.getLatitude() * 1E6), (int) (place.getLongitude() * 1E6)); overlayitem = new MyOverlayItem(point, place.getName()); placeOverlay.addOverlay(overlayitem); } placeOverlay.calculateItems(); placeOverlay.doPopulate(); if (placeOverlay.size() > 0) { mapOverlays.add(placeOverlay); mapView.postInvalidate(); } } @Override public void onLocationChanged(Location location) { locationManager.removeUpdates(this); double myLatitude = location.getLatitude(); double myLongitude = location.getLongitude(); setCurrentGeopoint(myLatitude, myLongitude); displayPlacesOnMap(); } @Override public void onStatusChanged(String provider, int status, Bundle extras) { } @Override public void onProviderEnabled(String provider) { } @Override public void onProviderDisabled(String provider) { } @Override protected boolean isRouteDisplayed() { return false; } @Override public void onZoomChanged() { if (placeOverlay != null) { placeOverlay.calculateItems(); } } }
рдпрд╣ рдЬреЛрдбрд╝рдиреЗ рдпреЛрдЧреНрдп рд╣реИ рдХрд┐ MyCurrentLocationOverlay рдПрдХ рддрддреНрд╡ рдХреЗ рд╕рд╛рде рдПрдХ рд╕рд╛рдорд╛рдиреНрдп ItemizedOverlay рд╣реИ, рдФрд░ PlaceInfo рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдЖрд╡рд░рдг рд╡рд░реНрдЧ рдпреБрдХреНрдд рд╣реИ:
private String name; private double latitude; private double longitude;
рдЗрди рд╕рднреА рдЬреЛрдбрд╝рддреЛрдбрд╝ рдХреЗ рдмрд╛рдж - рдпрд╣ рд╣реИ рдХрд┐ рдкрд┐рди рдХреЗ рд╕рд╛рде рд╣рдорд╛рд░рд╛ рдирдХреНрд╢рд╛ рдХреИрд╕реЗ рджрд┐рдЦрдирд╛ рд╢реБрд░реВ рд╣реБрдЖ:


рдореБрдЭреЗ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рд▓реЗрдЦ рдЖрдкрдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧреА рд╣реЛрдЧрд╛ред
рдкреВрд░реА рдкрд░рд┐рдпреЛрдЬрдирд╛
рдпрд╣рд╛рдВ рдкрд╛рдИ рдЬрд╛ рд╕рдХрддреА
рд╣реИ ред