我正在尝试将以下示例用于自己的应用。要添加Geojson文件,我已经用其他代码进行了管理,但是我无法使其与实时数据一起使用。我只想根据接受实时信息点的情况显示不同的颜色。代码的第一个问题是它没有运行示例,存在许多错误。将其用于我的应用程序的第二次尝试显示了一些额外的错误。故障之一是被getmapAync代替的getmap(),但没有解决问题。 有关代码错误的任何建议。是添加实时空间数据的更好的方法,没有跟踪信息只是其属性的状态。
GeoJSON — displays and styles GeoJSON data
package com.example.testnavbar;
import android.content.Context;
import android.net.Uri;
import android.os.AsyncTask;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Toast;
import com.google.android.gms.maps.CameraUpdateFactory;
import com.google.android.gms.maps.GoogleMap;
import com.google.android.gms.maps.MapView;
import com.google.android.gms.maps.MapsInitializer;
import com.google.android.gms.maps.OnMapReadyCallback;
import com.google.android.gms.maps.model.BitmapDescriptor;
import com.google.android.gms.maps.model.BitmapDescriptorFactory;
import com.google.android.gms.maps.model.CameraPosition;
import com.google.android.gms.maps.model.LatLng;
import com.google.android.gms.maps.model.MarkerOptions;
import com.google.android.gms.maps.model.PolylineOptions;
import com.google.maps.android.data.Feature;
import com.google.maps.android.data.geojson.GeoJsonFeature;
import com.google.maps.android.data.geojson.GeoJsonLayer;
import com.google.maps.android.data.geojson.GeoJsonLineString;
import com.google.maps.android.data.geojson.GeoJsonPointStyle;
import org.json.JSONException;
import org.json.JSONObject;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.URL;
import java.util.List;
import static com.mapbox.mapboxsdk.Mapbox.getApplicationContext;
public class HomeFragment extends Fragment {
private final static String mLogTag = "GeoJson";
GoogleMap mGoogleMap;
MapView mMapView;
View mView;
/**
* Assigns a color based on the given magnitude
*/
private static float magnitudeToColor(double status) {
if (status == 1) {
return BitmapDescriptorFactory.HUE_GREEN;
} else if (status == 2) {
return BitmapDescriptorFactory.HUE_YELLOW;
} else {
return BitmapDescriptorFactory.HUE_RED;
}
}
protected int getLayoutId() {
return R.layout.activity_maps;
}
protected void startDemo() {
// Download the GeoJSON file.
retrieveFileFromUrl();
// Alternate approach of loading a local GeoJSON file.
//retrieveFileFromResource();
}
private void retrieveFileFromUrl() {
new DownloadGeoJsonFile().execute(getString(R.string.geojson_url));
}
private void retrieveFileFromResource() {
try {
GeoJsonLayer layer = new GeoJsonLayer(getMap(), R.raw.picnicsites, this);
addGeoJsonLayerToMap(layer);
} catch (IOException e) {
Log.e(mLogTag, "GeoJSON file could not be read");
} catch (JSONException e) {
Log.e(mLogTag, "GeoJSON file could not be converted to a JSONObject");
}
}
/**
* Adds a point style to all features to change the color of the marker based on its magnitude
* property
*/
private void addColorsToMarkers(GeoJsonLayer layer) {
// Iterate over all the features stored in the layer
for (GeoJsonFeature feature : layer.getFeatures()) {
// Check if the magnitude property exists
if (feature.getProperty("mag") != null && feature.hasProperty("place")) {
double magnitude = Double.parseDouble(feature.getProperty("mag"));
// Get the icon for the feature
BitmapDescriptor pointIcon = BitmapDescriptorFactory
.defaultMarker(magnitudeToColor(magnitude));
// Create a new point style
GeoJsonPointStyle pointStyle = new GeoJsonPointStyle();
// Set options for the point style
pointStyle.setIcon(pointIcon);
pointStyle.setTitle("Magnitude of " + magnitude);
pointStyle.setSnippet("Earthquake occured " + feature.getProperty("place"));
// Assign the point style to the feature
feature.setPointStyle(pointStyle);
}
}
}
private class DownloadGeoJsonFile extends AsyncTask<String, Void, GeoJsonLayer> {
@Override
protected GeoJsonLayer doInBackground(String... params) {
try {
// Open a stream from the URL
InputStream stream = new URL(params[0]).openStream();
String line;
StringBuilder result = new StringBuilder();
BufferedReader reader = new BufferedReader(new InputStreamReader(stream));
while ((line = reader.readLine()) != null) {
// Read and save each line of the stream
result.append(line);
}
// Close the stream
reader.close();
stream.close();
return new GeoJsonLayer(getMap(), new JSONObject(result.toString()));
} catch (IOException e) {
Log.e(mLogTag, "GeoJSON file could not be read");
} catch (JSONException e) {
Log.e(mLogTag, "GeoJSON file could not be converted to a JSONObject");
}
return null;
}
@Override
protected void onPostExecute(GeoJsonLayer layer) {
if (layer != null) {
addGeoJsonLayerToMap(layer);
}
}
}
private void addGeoJsonLayerToMap(GeoJsonLayer layer) {
addColorsToMarkers(layer);
layer.addLayerToMap();
getMap().moveCamera(CameraUpdateFactory.newLatLng(new LatLng(35.126411,33.429859)));
// Demonstrate receiving features via GeoJsonLayer clicks.
layer.setOnFeatureClickListener(new GeoJsonLayer.GeoJsonOnFeatureClickListener() {
@Override
public void onFeatureClick(Feature feature) {
Toast.makeText(HomeFragment.this,
"Feature clicked: " + feature.getProperty("title"),
Toast.LENGTH_SHORT).show();
}
});
}
}