如何在 android 中获得不同的纬度、经度时在 googlemap 中移动标记
How to move marker in googlemap while getting different latitude,longitude in android
我正在开发 android 应用程序,我的要求是如何在 google 地图中移动标记,同时纬度和经度正在变化,这意味着跟踪设备系统
这是我的json
{
"gpslocation": [
{
"Latitude":"12.9789702",
"Longitude":"77.6411031",
"UpdatedOn":"2015-06-02 14:09:02"
}
]
}
这是我的主要activity
private static String url = "http://example.com/android/gps/latlong.php";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.gmap_direction);
pd = new ProgressDialog(Bustracking.this);
pd.setMessage("Please wait...");
pd.setCanceledOnTouchOutside(false);
pd.show();
new AsyncTask<Void, Void, Void>()
{
@Override
protected Void doInBackground(Void... params)
{
callAsynchronousTask();
return null;
}
@Override
protected void onPostExecute(Void result)
{
}
}.execute();
}
public void callAsynchronousTask() {
timer = new Timer();
timer.scheduleAtFixedRate(new TimerTask() {
@Override
public void run() {
location();
}
}, 0, 1000);
}
public void location(){
List<NameValuePair> params = new ArrayList<NameValuePair>();
params.add(new BasicNameValuePair("key", "agile89rise98"));
params.add(new BasicNameValuePair("username", un));
params.add(new BasicNameValuePair("type", "parent"));
// getting JSON string from URL
JSONObject json = jParser.makeHttpRequest(url, "GET", params);
try {
JSONArray a= json.getJSONArray(TAG_SUCCESS);
JSONObject c = a.getJSONObject(0);
// Storing JSON item in a Variable
final String latitudee = c.getString("Latitude");
final String longitudee = c.getString("Longitude");
final String updatedon = c.getString("UpdatedOn");
pd.dismiss();
runOnUiThread(new Runnable(){
@Override
public void run() {
try {
// Loading map
initilizeMap();
// Changing map type
googleMap.setMapType(GoogleMap.MAP_TYPE_NORMAL);
googleMap.setMyLocationEnabled(true);
// Enable / Disable zooming controls
googleMap.getUiSettings().setZoomControlsEnabled(false);
// Enable / Disable my location button
googleMap.getUiSettings().setMyLocationButtonEnabled(true);
// Enable / Disable Compass icon
googleMap.getUiSettings().setCompassEnabled(true);
// Enable / Disable Rotate gesture
googleMap.getUiSettings().setRotateGesturesEnabled(true);
// Enable / Disable zooming functionality
googleMap.getUiSettings().setZoomGesturesEnabled(true);
double latitude = Double.parseDouble(latitudee);
double longitude = Double.parseDouble(longitudee);
MarkerOptions marker = new MarkerOptions().position(new LatLng(latitude, longitude)).title(updatedon);
marker.icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_YELLOW));
googleMap.addMarker(marker);
CameraPosition cameraPosition = new CameraPosition.Builder()
.target(new LatLng(latitude,
longitude)).zoom(25).build();
googleMap.animateCamera(CameraUpdateFactory
.newCameraPosition(cameraPosition));
} catch (Exception e) {
e.printStackTrace();
}
}
});
} catch (final JSONException e) {
pd.dismiss();
runOnUiThread(new Runnable(){
@Override
public void run() {
Toast.makeText(getApplicationContext(), "Bus Service Not Available", Toast.LENGTH_SHORT).show();
e.printStackTrace();
}
});
}
}
我的纬度和经度根据设备位置不断变化,我从 json url 获取纬度和经度并将其显示在 google 地图中
我的 oncreate 函数中有一个 AsyncTask,我在 doinbackground 中调用了一个名为 callAsynchronousTask();
的函数 这个函数每隔一秒执行一次,因为我需要从 json url 开始的连续经纬度和我我正在从 callAsynchronoustask 调用另一个函数 location();
此函数用于检索经纬度值并将其显示在 googlemap
中
我每秒钟都在调用 location();
因为得到连续的经纬度值。现在我的输出就像为每个动作创建标记一样,所以每当我得到 latlong 时,它就会创建新标记
我的要求:-
它不应该创建新标记,只要我得到不同的 latlong 值,相同的标记就应该移动
你能告诉我怎么做吗?
在您的 initializeMap()
方法和 googleMap.setMapType()
方法之间执行此操作并将此行:
// Loading map
initilizeMap();
googleMap.clear(); // put this line
// Changing map type
googleMap.setMapType(GoogleMap.MAP_TYPE_NORMAL);
一些 Google 工程师提供了一个不错的演示视频,其中包含一些优雅的示例代码,关于如何为所有不同版本的 Android 制作标记从起点到终点的动画:
相关代码在这里:
https://gist.github.com/broady/6314689
以及所有这些操作的精彩演示视频。
下面是旧的已弃用答案
文档中提到不能更改标记图标:
图标
为标记显示的位图。如果未设置图标,则会显示默认图标。您可以使用 defaultMarker(float) 指定默认图标的替代颜色。创建标记后,您无法更改图标。
Google 地图 API v2 文档
您将不得不跟踪特定的标记,也许使用类似于此处描述的方法:Link 对象的标记,然后找出您需要更新的标记。在标记上调用 .remove(),然后根据您想要的 "direction" 创建一个旋转图像,使用该图像创建一个新标记,并将新标记添加到地图中。
您不需要 "clear" 地图,只需删除您要修改的标记,创建一个新标记,然后将其添加回地图。
遗憾的是,新地图 API 还不是很灵活。希望 Google 继续改进它。
您不必每次移动标记都重新创建它。
首先,创建全局Marker
字段
GoogleMap googleMap;
Marker activeMarker = null;
然后只有没有创建标记才创建它,如果是就移动它。
if (activeMarker == null)
{
MarkerOptions marker = new MarkerOptions().position(new LatLng(latitude, longitude)).title(updatedon);
marker.icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_YELLOW));
activeMarker = googleMap.addMarker(marker);
}
else
{
activeMarker.setPosition(new LatLng(latitude, longitude));
activeMarker.setTitle(updatedon);
}
此外,在开始 运行 执行 location()
任务之前,您应该 运行 只执行一次地图初始化代码。
// Loading map
initilizeMap();
// Changing map type
googleMap.setMapType(GoogleMap.MAP_TYPE_NORMAL);
googleMap.setMyLocationEnabled(true);
// Enable / Disable zooming controls
googleMap.getUiSettings().setZoomControlsEnabled(false);
// Enable / Disable my location button
googleMap.getUiSettings().setMyLocationButtonEnabled(true);
// Enable / Disable Compass icon
googleMap.getUiSettings().setCompassEnabled(true);
// Enable / Disable Rotate gesture
googleMap.getUiSettings().setRotateGesturesEnabled(true);
// Enable / Disable zooming functionality
googleMap.getUiSettings().setZoomGesturesEnabled(true);
我正在开发 android 应用程序,我的要求是如何在 google 地图中移动标记,同时纬度和经度正在变化,这意味着跟踪设备系统
这是我的json
{
"gpslocation": [
{
"Latitude":"12.9789702",
"Longitude":"77.6411031",
"UpdatedOn":"2015-06-02 14:09:02"
}
]
}
这是我的主要activity
private static String url = "http://example.com/android/gps/latlong.php";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.gmap_direction);
pd = new ProgressDialog(Bustracking.this);
pd.setMessage("Please wait...");
pd.setCanceledOnTouchOutside(false);
pd.show();
new AsyncTask<Void, Void, Void>()
{
@Override
protected Void doInBackground(Void... params)
{
callAsynchronousTask();
return null;
}
@Override
protected void onPostExecute(Void result)
{
}
}.execute();
}
public void callAsynchronousTask() {
timer = new Timer();
timer.scheduleAtFixedRate(new TimerTask() {
@Override
public void run() {
location();
}
}, 0, 1000);
}
public void location(){
List<NameValuePair> params = new ArrayList<NameValuePair>();
params.add(new BasicNameValuePair("key", "agile89rise98"));
params.add(new BasicNameValuePair("username", un));
params.add(new BasicNameValuePair("type", "parent"));
// getting JSON string from URL
JSONObject json = jParser.makeHttpRequest(url, "GET", params);
try {
JSONArray a= json.getJSONArray(TAG_SUCCESS);
JSONObject c = a.getJSONObject(0);
// Storing JSON item in a Variable
final String latitudee = c.getString("Latitude");
final String longitudee = c.getString("Longitude");
final String updatedon = c.getString("UpdatedOn");
pd.dismiss();
runOnUiThread(new Runnable(){
@Override
public void run() {
try {
// Loading map
initilizeMap();
// Changing map type
googleMap.setMapType(GoogleMap.MAP_TYPE_NORMAL);
googleMap.setMyLocationEnabled(true);
// Enable / Disable zooming controls
googleMap.getUiSettings().setZoomControlsEnabled(false);
// Enable / Disable my location button
googleMap.getUiSettings().setMyLocationButtonEnabled(true);
// Enable / Disable Compass icon
googleMap.getUiSettings().setCompassEnabled(true);
// Enable / Disable Rotate gesture
googleMap.getUiSettings().setRotateGesturesEnabled(true);
// Enable / Disable zooming functionality
googleMap.getUiSettings().setZoomGesturesEnabled(true);
double latitude = Double.parseDouble(latitudee);
double longitude = Double.parseDouble(longitudee);
MarkerOptions marker = new MarkerOptions().position(new LatLng(latitude, longitude)).title(updatedon);
marker.icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_YELLOW));
googleMap.addMarker(marker);
CameraPosition cameraPosition = new CameraPosition.Builder()
.target(new LatLng(latitude,
longitude)).zoom(25).build();
googleMap.animateCamera(CameraUpdateFactory
.newCameraPosition(cameraPosition));
} catch (Exception e) {
e.printStackTrace();
}
}
});
} catch (final JSONException e) {
pd.dismiss();
runOnUiThread(new Runnable(){
@Override
public void run() {
Toast.makeText(getApplicationContext(), "Bus Service Not Available", Toast.LENGTH_SHORT).show();
e.printStackTrace();
}
});
}
}
我的纬度和经度根据设备位置不断变化,我从 json url 获取纬度和经度并将其显示在 google 地图中
我的 oncreate 函数中有一个 AsyncTask,我在 doinbackground 中调用了一个名为 callAsynchronousTask();
的函数 这个函数每隔一秒执行一次,因为我需要从 json url 开始的连续经纬度和我我正在从 callAsynchronoustask 调用另一个函数 location();
此函数用于检索经纬度值并将其显示在 googlemap
我每秒钟都在调用 location();
因为得到连续的经纬度值。现在我的输出就像为每个动作创建标记一样,所以每当我得到 latlong 时,它就会创建新标记
我的要求:- 它不应该创建新标记,只要我得到不同的 latlong 值,相同的标记就应该移动
你能告诉我怎么做吗?
在您的 initializeMap()
方法和 googleMap.setMapType()
方法之间执行此操作并将此行:
// Loading map
initilizeMap();
googleMap.clear(); // put this line
// Changing map type
googleMap.setMapType(GoogleMap.MAP_TYPE_NORMAL);
一些 Google 工程师提供了一个不错的演示视频,其中包含一些优雅的示例代码,关于如何为所有不同版本的 Android 制作标记从起点到终点的动画:
相关代码在这里:
https://gist.github.com/broady/6314689
以及所有这些操作的精彩演示视频。
下面是旧的已弃用答案
文档中提到不能更改标记图标:
图标
为标记显示的位图。如果未设置图标,则会显示默认图标。您可以使用 defaultMarker(float) 指定默认图标的替代颜色。创建标记后,您无法更改图标。 Google 地图 API v2 文档
您将不得不跟踪特定的标记,也许使用类似于此处描述的方法:Link 对象的标记,然后找出您需要更新的标记。在标记上调用 .remove(),然后根据您想要的 "direction" 创建一个旋转图像,使用该图像创建一个新标记,并将新标记添加到地图中。
您不需要 "clear" 地图,只需删除您要修改的标记,创建一个新标记,然后将其添加回地图。
遗憾的是,新地图 API 还不是很灵活。希望 Google 继续改进它。
您不必每次移动标记都重新创建它。
首先,创建全局Marker
字段
GoogleMap googleMap;
Marker activeMarker = null;
然后只有没有创建标记才创建它,如果是就移动它。
if (activeMarker == null)
{
MarkerOptions marker = new MarkerOptions().position(new LatLng(latitude, longitude)).title(updatedon);
marker.icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_YELLOW));
activeMarker = googleMap.addMarker(marker);
}
else
{
activeMarker.setPosition(new LatLng(latitude, longitude));
activeMarker.setTitle(updatedon);
}
此外,在开始 运行 执行 location()
任务之前,您应该 运行 只执行一次地图初始化代码。
// Loading map
initilizeMap();
// Changing map type
googleMap.setMapType(GoogleMap.MAP_TYPE_NORMAL);
googleMap.setMyLocationEnabled(true);
// Enable / Disable zooming controls
googleMap.getUiSettings().setZoomControlsEnabled(false);
// Enable / Disable my location button
googleMap.getUiSettings().setMyLocationButtonEnabled(true);
// Enable / Disable Compass icon
googleMap.getUiSettings().setCompassEnabled(true);
// Enable / Disable Rotate gesture
googleMap.getUiSettings().setRotateGesturesEnabled(true);
// Enable / Disable zooming functionality
googleMap.getUiSettings().setZoomGesturesEnabled(true);