You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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:

  1. 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
    }
    
  2. 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"/>
    
  3. Add a MapFragment to 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 (let in Kotlin, if in 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 03:41:01