Android中基于JSON数据在地图添加多个标记的实现方法
How to Add Multiple Markers on Android Maps Using Customer JSON Data
Let's walk through implementing this feature step by step—from setting up your map to parsing the JSON and adding markers for pickup/drop locations.
Prerequisites
First, make sure you have Google Maps integrated into your Android project:
- Add the Maps SDK dependency to your app-level
build.gradle:dependencies { implementation 'com.google.android.gms:play-services-maps:18.2.0' implementation 'com.google.code.gson:gson:2.10.1' // For JSON parsing } - Add your Google Maps API key to the
AndroidManifest.xml:<meta-data android:name="com.google.android.geo.API_KEY" android:value="YOUR_GOOGLE_MAPS_API_KEY"/> - Add a
MapFragmentto your layout file (e.g.,activity_main.xml):<fragment android:id="@+id/map_fragment" android:name="com.google.android.gms.maps.SupportMapFragment" android:layout_width="match_parent" android:layout_height="match_parent"/>
Step 1: Create Data Classes for JSON Parsing
First, define classes to map your JSON structure. This makes parsing clean and type-safe.
Kotlin
data class CustomerResponse( val customer: List<CustomerRequest> ) data class CustomerRequest( val CustomerRequestId: Int, val CustomerId: Int, val CustomerName: String, val Phonenumber: String?, val PickupLat: String?, val PickupLng: String?, val DropLat: String?, val DropLng: String?, val FromLoc: String?, val ToLoc: String? )
Java
public class CustomerResponse { private List<CustomerRequest> customer; public List<CustomerRequest> getCustomer() { return customer; } public void setCustomer(List<CustomerRequest> customer) { this.customer = customer; } } public class CustomerRequest { private int CustomerRequestId; private int CustomerId; private String CustomerName; private String Phonenumber; private String PickupLat; private String PickupLng; private String DropLat; private String DropLng; private String FromLoc; private String ToLoc; // Getters and setters for all fields public int getCustomerRequestId() { return CustomerRequestId; } public void setCustomerRequestId(int customerRequestId) { CustomerRequestId = customerRequestId; } public String getCustomerName() { return CustomerName; } public void setCustomerName(String customerName) { CustomerName = customerName; } public String getPickupLat() { return PickupLat; } public void setPickupLat(String pickupLat) { PickupLat = pickupLat; } public String getPickupLng() { return PickupLng; } public void setPickupLng(String pickupLng) { PickupLng = pickupLng; } public String getDropLat() { return DropLat; } public void setDropLat(String dropLat) { DropLat = dropLat; } public String getDropLng() { return DropLng; } public void setDropLng(String dropLng) { DropLng = dropLng; } public String getFromLoc() { return FromLoc; } public void setFromLoc(String fromLoc) { FromLoc = fromLoc; } public String getToLoc() { return ToLoc; } public void setToLoc(String toLoc) { ToLoc = toLoc; } }
Step 2: Parse the JSON Data
Use Gson to convert your JSON string into a list of CustomerRequest objects. Always handle null values to avoid crashes!
Kotlin
val jsonString = """{ "customer": [ { "CustomerRequestId": 30, "CustomerId": 24, "CustomerName": "Saravanan", "Phonenumber": "9095897331", "PickupLat": "13.0667902", "PickupLng": "80.2458975", "DropLat": "13.0824243", "DropLng": "80.27546889999999", "FromLoc": "19-22, College Rd, Subba Road Avenue, Nungambakkam, Chennai, Tamil Nadu 600006, India", "ToLoc": "Station Rd, Kannappar Thidal, Periyamet, Chennai, Tamil Nadu 600003, India" }, { "CustomerRequestId": 29, "CustomerId": 4, "CustomerName": "drive..." } ] }""" val gson = Gson() val customerResponse = gson.fromJson(jsonString, CustomerResponse::class.java) val customerRequests = customerResponse.customer
Java
String jsonString = "{ \"customer\": [ { \"CustomerRequestId\": 30, \"CustomerId\": 24, \"CustomerName\": \"Saravanan\", \"Phonenumber\": \"9095897331\", \"PickupLat\": \"13.0667902\", \"PickupLng\": \"80.2458975\", \"DropLat\": \"13.0824243\", \"DropLng\": \"80.27546889999999\", \"FromLoc\": \"19-22, College Rd, Subba Road Avenue, Nungambakkam, Chennai, Tamil Nadu 600006, India\", \"ToLoc\": \"Station Rd, Kannappar Thidal, Periyamet, Chennai, Tamil Nadu 600003, India\" }, { \"CustomerRequestId\": 29, \"CustomerId\": 4, \"CustomerName\": \"drive...\" } ] }"; Gson gson = new Gson(); CustomerResponse customerResponse = gson.fromJson(jsonString, CustomerResponse.class); List<CustomerRequest> customerRequests = customerResponse.getCustomer();
Step 3: Add Markers to the Map
Implement the OnMapReadyCallback interface to access the GoogleMap instance, then loop through your customer data to add markers for pickup and drop locations.
Kotlin
class MainActivity : AppCompatActivity(), OnMapReadyCallback { private lateinit var googleMap: GoogleMap private lateinit var customerRequests: List<CustomerRequest> override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) // Parse JSON here (from Step 2) val mapFragment = supportFragmentManager.findFragmentById(R.id.map_fragment) as SupportMapFragment mapFragment.getMapAsync(this) } override fun onMapReady(map: GoogleMap) { googleMap = map customerRequests.forEach { customer -> // Add Pickup Marker (green) customer.PickupLat?.let { lat -> customer.PickupLng?.let { lng -> val pickupLatLng = LatLng(lat.toDouble(), lng.toDouble()) googleMap.addMarker( MarkerOptions() .position(pickupLatLng) .title("Pickup: ${customer.CustomerName}") .snippet("Request ID: ${customer.CustomerRequestId}\nLocation: ${customer.FromLoc}") .icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_GREEN)) ) } } // Add Drop Marker (red) customer.DropLat?.let { lat -> customer.DropLng?.let { lng -> val dropLatLng = LatLng(lat.toDouble(), lng.toDouble()) googleMap.addMarker( MarkerOptions() .position(dropLatLng) .title("Drop: ${customer.CustomerName}") .snippet("Request ID: ${customer.CustomerRequestId}\nLocation: ${customer.ToLoc}") .icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_RED)) ) } } } // Optional: Auto-zoom to show all markers if (customerRequests.isNotEmpty()) { val boundsBuilder = LatLngBounds.Builder() customerRequests.forEach { customer -> customer.PickupLat?.let { lat -> customer.PickupLng?.let { lng -> boundsBuilder.include(LatLng(lat.toDouble(), lng.toDouble())) } } customer.DropLat?.let { lat -> customer.DropLng?.let { lng -> boundsBuilder.include(LatLng(lat.toDouble(), lng.toDouble())) } } } val bounds = boundsBuilder.build() googleMap.moveCamera(CameraUpdateFactory.newLatLngBounds(bounds, 100)) // 100px padding } } }
Java
public class MainActivity extends AppCompatActivity implements OnMapReadyCallback { private GoogleMap googleMap; private List<CustomerRequest> customerRequests; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // Parse JSON here (from Step 2) SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.map_fragment); mapFragment.getMapAsync(this); } @Override public void onMapReady(GoogleMap map) { googleMap = map; for (CustomerRequest customer : customerRequests) { // Add Pickup Marker (green) if (customer.getPickupLat() != null && customer.getPickupLng() != null) { double pickupLat = Double.parseDouble(customer.getPickupLat()); double pickupLng = Double.parseDouble(customer.getPickupLng()); LatLng pickupLatLng = new LatLng(pickupLat, pickupLng); googleMap.addMarker(new MarkerOptions() .position(pickupLatLng) .title("Pickup: " + customer.getCustomerName()) .snippet("Request ID: " + customer.getCustomerRequestId() + "\nLocation: " + customer.getFromLoc()) .icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_GREEN))); } // Add Drop Marker (red) if (customer.getDropLat() != null && customer.getDropLng() != null) { double dropLat = Double.parseDouble(customer.getDropLat()); double dropLng = Double.parseDouble(customer.getDropLng()); LatLng dropLatLng = new LatLng(dropLat, dropLng); googleMap.addMarker(new MarkerOptions() .position(dropLatLng) .title("Drop: " + customer.getCustomerName()) .snippet("Request ID: " + customer.getCustomerRequestId() + "\nLocation: " + customer.getToLoc()) .icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_RED))); } } // Optional: Auto-zoom to show all markers if (!customerRequests.isEmpty()) { LatLngBounds.Builder boundsBuilder = new LatLngBounds.Builder(); for (CustomerRequest customer : customerRequests) { if (customer.getPickupLat() != null && customer.getPickupLng() != null) { double pickupLat = Double.parseDouble(customer.getPickupLat()); double pickupLng = Double.parseDouble(customer.getPickupLng()); boundsBuilder.include(new LatLng(pickupLat, pickupLng)); } if (customer.getDropLat() != null && customer.getDropLng() != null) { double dropLat = Double.parseDouble(customer.getDropLat()); double dropLng = Double.parseDouble(customer.getDropLng()); boundsBuilder.include(new LatLng(dropLat, dropLng)); } } LatLngBounds bounds = boundsBuilder.build(); googleMap.moveCamera(CameraUpdateFactory.newLatLngBounds(bounds, 100)); // 100px padding } } }
Key Notes
- Null Safety: We use null checks (
letin Kotlin,ifin Java) to skip markers for customers with missing coordinates—this prevents crashes from invalid data. - Custom Markers: Replace the default colored markers with your own drawables using
BitmapDescriptorFactory.fromResource(R.drawable.your_marker). - API Key Restrictions: Always restrict your Google Maps API key to your Android app (using package name and SHA-1) to prevent unauthorized use.
内容的提问来源于stack exchange,提问作者Aravind
相关产品推荐
相关产品推荐

