我有我的班级Geofence的网格。另外,我使用传单创建层,即地理围栏。当我从服务器获得地理围栏时,我填充网格并创建和添加图层到FeatureGroup的drawingItems。我将图层的属性设置为geofence的id。这是代码:
if (200 == response.getStatusCode()) {
JsArray<Geofence> geofenceJsArray = JsonUtils.safeEval(response.getText());
ILayer iLayer;
for (int i = 0; i < geofenceJsArray.length(); i++) {
geofenceStore.add(geofenceJsArray.get(i));
JsArray<Coordinate> coordinateJsArray = geofenceJsArray.get(i).getCoordinates();
if (geofenceJsArray.get(i).getType() == Type.CIRCLE) {
double lat = coordinateJsArray.get(0).getLatitude();
double lon = coordinateJsArray.get(0).getLongitude();
LatLng latLng = new LatLng(lat, lon);
double radius = geofenceJsArray.get(i).getRadius();
Options options = new Options();
iLayer = new Circle(latLng, radius, options);
iLayer.getJSObject().setProperty("_leaflet_id", geofenceJsArray.get(i).getId());
} else {
PolylineOptions polylineOptions = new PolylineOptions();
LatLng[] latLngArray = new LatLng[coordinateJsArray.length()];
for (int j = 0; j < coordinateJsArray.length(); j++) {
double lat = coordinateJsArray.get(i).getLatitude();
double lon = coordinateJsArray.get(i).getLongitude();
latLngArray[j] = new LatLng(lat, lon);
}
iLayer = new Polygon(latLngArray, polylineOptions);
iLayer.getJSObject().setProperty("_leaflet_id", geofenceJsArray.get(i).getId());
}
drawnItems.addLayer(iLayer);
map.addLayer(iLayer);
}
使用此代码:
if (204 == response.getStatusCode()) {
ILayer layerForRemove = null;
for (int i = 0; i < drawnItems.getLayers().length; i++) {
LoggerHelper.log(className, "_leaflet_id: " + drawnItems.getLayers()[i].getOptions().getProperty("_leaflet_id") + "");
if (selectedGeofence.getId() == Integer.parseInt(drawnItems.getLayers()[i].getOptions().getProperty("_leaflet_id") + "")) {
layerForRemove = drawnItems.getLayers()[i];
}
}
drawnItems.removeLayer(layerForRemove);
geofenceStore.remove(selectedGeofence);
Info.display("Уведомление", "Геозона " + selectedGeofence.getName() + " успешно удалено!");
LoggerHelper.log(className, "Device " + selectedGeofence.getName() + " has been removed. Bye-bye!");
} else {
Info.display("Ошибка", "Не удалось удалить геозону " + selectedGeofence.getName());
LoggerHelper.log(className, "Error while deleting device. " +
"Error code: " + response.getStatusCode() +
". Error status message: " + response.getStatusText());
}
我在这一行中收到_leaflet_id为“null”
LoggerHelper.log(className, "_leaflet_id: " + drawnItems.getLayers()[i].getOptions().getProperty("_leaflet_id") + "");
为什么?因为我在这行中设置了它:
iLayer.getJSObject().setProperty("_leaflet_id", geofenceJsArray.get(i).getId());
在此先感谢您的回答!
您根本不应该处理Leaflet图层的_leaflet_id
私有属性。试图这样做会产生意想不到的问题。
您可以自由地向Leaflet图层添加自定义属性,并保留对它们的引用,例如:
var geofencesById = {}
for (...) {
layer = L.polygon(...);
layer._geofence_id = geofenceJsArray.get(i).getId();
geofencesById[ geofenceJsArray.get(i).getId() ] = layer;
}