如何使用字符串地址在 google maps API V2 android 中获取地理坐标?

Posted

技术标签:

【中文标题】如何使用字符串地址在 google maps API V2 android 中获取地理坐标?【英文标题】:How to get geographical coordinates in google maps API V2 android using an string address? 【发布时间】:2015-08-24 18:12:48 【问题描述】:

我正在设计一个定位地点的 android 应用程序,这些地点在服务器的数据库中,但我只有地点的名称和位置,所以我需要在我的应用程序中找到它并放一个 标记那里。可以仅通过地址获取坐标,或者,我是否需要重做我的数据库,添加纬度和经度字段?

【问题讨论】:

同意 anton 你需要一个 api 来获取lat, lng 【参考方案1】:

您可以使用Geocoder 类查找您拥有的地址,然后使用返回的LanLng 对象使用标记填充地图。

请注意,Geocoder 类无法对每个地址进行地理编码,但如果格式正确,大多数地址都会成功。

以this question 的代码为指导,我刚刚完成了这个简单的示例。

我创建了一个自定义类,用于存储位置名称、位置地址和用于存储纬度/经度的 LatLng 对象。

对于这个简单的例子,我只使用了三个地址。

这是完整的课程代码:

import android.location.Address;
import android.location.Geocoder;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.widget.Toast;
import com.google.android.gms.maps.GoogleMap;
import com.google.android.gms.maps.SupportMapFragment;
import com.google.android.gms.maps.model.BitmapDescriptorFactory;
import com.google.android.gms.maps.model.LatLng;
import com.google.android.gms.maps.model.MarkerOptions;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.Locale;

public class MapsActivity extends AppCompatActivity 

    private GoogleMap mMap; // Might be null if Google Play services APK is not available.

    @Override
    protected void onCreate(Bundle savedInstanceState) 
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_maps);
        setUpMapIfNeeded();
    

    @Override
    protected void onResume() 
        super.onResume();
        setUpMapIfNeeded();
    


    private void setUpMapIfNeeded() 
        // Do a null check to confirm that we have not already instantiated the map.
        if (mMap == null) 
            // Try to obtain the map from the SupportMapFragment.
            mMap = ((SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.map))
                    .getMap();
            // Check if we were successful in obtaining the map.
            if (mMap != null) 
                setUpMap();
            
        
    


    private void setUpMap() 
        mMap.setMyLocationEnabled(true);

        List<CustomLocation> custLocs = new ArrayList<CustomLocation>();

        //Testing with three addresses
        custLocs.add(new CustomLocation("location 1", "100 market street san francisco ca"));
        custLocs.add(new CustomLocation("location 2", "200 market street san francisco ca"));
        custLocs.add(new CustomLocation("location 3", "300 market street san francisco ca"));


        //set the location for each item in the list
        for (CustomLocation custLoc : custLocs)
            custLoc.setLocation(getSingleLocationFromAddress(custLoc.address));
        

        //draw the Marker for each item in the list
        for (CustomLocation custLoc : custLocs)
            mMap.addMarker(new MarkerOptions().position(custLoc.latLng)
                    .title(custLoc.name).icon(BitmapDescriptorFactory
                    .defaultMarker(BitmapDescriptorFactory.HUE_MAGENTA)));
        
    

    //method to do a lookup on the address
    public LatLng getSingleLocationFromAddress(String strAddress)
    
        Geocoder coder = new Geocoder(this, Locale.getDefault());
        List<Address> address = null;
        Address location = null;
        LatLng temp = null;
        String strAddresNew = strAddress.replace(",", " ");
        try
        
            address = coder.getFromLocationName(strAddresNew, 1);
            if (!address.isEmpty())
            
                location = address.get(0);
                location.getLatitude();
                location.getLongitude();
                temp = new LatLng(location.getLatitude(), location.getLongitude());
                Log.d("Latlng : ", temp + "");
            
         catch (IOException e)
        
            Toast.makeText(this, e.toString(), Toast.LENGTH_LONG).show();
            e.printStackTrace();
         catch (Exception e)
        
            e.printStackTrace();
        
        return temp;
    

    //class to hold the name and address and location
    public static class CustomLocation

        public String name;
        public String address;
        public LatLng latLng;
        public CustomLocation(String n, String a)
            name = n;
            address = a;
        
        public void setLocation(LatLng ll)
            latLng = ll;
        
    

结果:

【讨论】:

这真的很容易,谢谢!显然我必须小心我使用的地址,因为它可能会给出错误的地址,对吧? @ReneLimon 没问题!我相信您唯一需要担心的是 LatLng 对于某些地址返回 null。【参考方案2】:

您可以向 google maps API 发出请求,以通过地址字符串获取可能的地址。检查此link。

【讨论】:

【参考方案3】:

您可以使用 Geocoder 类,它将以指定格式返回给定地址的纬度和经度。但是地址名称必须遵循指定的格式。 从以下链接查看更多信息:- https://developer.android.com/reference/android/location/Geocoder

【讨论】:

以上是关于如何使用字符串地址在 google maps API V2 android 中获取地理坐标?的主要内容,如果未能解决你的问题,请参考以下文章

如何向 google_map_location_picker 添加语言环境支持? (扑)

如何在 android google map v2 实现上为 geoserver 瓦片重新加载 TileOverlay

java Android - google maps v2 - 从字符串/ coor加载地址的任务。

java Android - google maps v2 - 从字符串/ coor加载地址的任务。

java Android - google maps v2 - 从字符串/ coor加载地址的任务。

java Android - google maps v2 - 从字符串/ coor加载地址的任务。