001// License: GPL. For details, see LICENSE file. 002package org.openstreetmap.josm.plugins.streetside; 003 004import java.util.List; 005 006import org.openstreetmap.josm.data.coor.LatLon; 007import org.openstreetmap.josm.plugins.streetside.cubemap.CubemapUtils; 008import org.openstreetmap.josm.plugins.streetside.model.UserProfile; 009 010/** 011 * A StreetsideImage object represents each of the images stored in Streetside. 012 * 013 * @author nokutu 014 * @author renerr18 015 * 016 * @see StreetsideSequence 017 * @see StreetsideData 018 */ 019public class StreetsideImage extends StreetsideAbstractImage { 020 /** 021 * Rn is a Bing Streetside image attribute - currently not 022 * used, mapped or supported in the Streetside plugin - 023 * left out initially because it's an unrequired complex object. 024 */ 025 public static class Rn { 026 // placeholder for nexted Rn attribute 027 } 028 029 // latitude of the Streetside image 030 private double la; 031 032 //longitude of the Streetside image 033 private double lo; 034 035 // The bubble altitude, in meters above the WGS84 ellipsoid 036 private double al; 037 038 // Roll 039 private double ro; 040 041 // Pitch 042 private double pi; 043 044 // Blurring instructions - not currently used by the plugin 045 private String bl; 046 047 // Undocumented Attributes 048 private int ml; 049 private List<String> nbn; 050 private List<String> pbn; 051 private int ad; 052 private Rn rn; 053 054 /** 055 * Set of traffic signs in the image. 056 *//* 057 private final List<ImageDetection> detections = Collections.synchronizedList(new ArrayList<>()); 058*/ 059 /** 060 * Main constructor of the class StreetsideImage 061 * 062 * @param id The unique identifier of the image. 063 * @param latLon The latitude and longitude where it is positioned. 064 * @param he The direction of the images in degrees, meaning 0 north. 065 */ 066 public StreetsideImage(String id, LatLon latLon, double he) { 067 super(id, latLon, he); 068 } 069 070 public StreetsideImage(String id, LatLon latLon) { 071 super(id, latLon, 0.0); 072 } 073 074 public StreetsideImage(String id, double la, double lo) { 075 super(id, new LatLon(la,lo), 0.0); 076 } 077 078 public StreetsideImage(String id) { 079 super(id); 080 } 081 082 // Default constructor for Jackson/JSON Deserializattion 083 public StreetsideImage() { 084 super(CubemapUtils.IMPORTED_ID, null, 0.0); 085 } 086 087 /** 088 * Returns the unique identifier of the object. 089 * 090 * @return A {@code String} containing the unique identifier of the object. 091 */ 092 @Override 093public String getId() { 094 return String.valueOf(id); 095 } 096 097 /*public List<ImageDetection> getDetections() { 098 return detections; 099 }*/ 100 101 /*public void setAllDetections(Collection<ImageDetection> newDetections) { 102 Logging.debug("Add {0} detections to image {1}", newDetections.size(), getId()); 103 synchronized (detections) { 104 detections.clear(); 105 detections.addAll(newDetections); 106 } 107 }*/ 108 109 public UserProfile getUser() { 110 return getSequence().getUser(); 111 } 112 113 @Override 114 public String toString() { 115 return String.format( 116 // TODO: format date cd (Gradle build error command line) 117 "Image[id=%s,lat=%f,lon=%f,he=%f,user=%s]", 118 id, latLon.lat(), latLon.lon(), he, "null"//, cd 119 ); 120 } 121 122 // TODO: implement equals @rrh 123 @Override 124 public boolean equals(Object object) { 125 return object instanceof StreetsideImage && id.equals(((StreetsideImage) object).getId()); 126 } 127 128 // TODO: implement compareTo @rrh 129 @Override 130 public int compareTo(StreetsideAbstractImage image) { 131 if (image instanceof StreetsideImage) { 132 return id.compareTo(((StreetsideImage) image).getId()); 133 } 134 return hashCode() - image.hashCode(); 135 } 136 137 // TODO: implement hashcode @rrh 138 @Override 139 public int hashCode() { 140 return id.hashCode(); 141 } 142 143 @Override 144 public void stopMoving() { 145 super.stopMoving(); 146 checkModified(); 147 } 148 149 private void checkModified() { 150 if (StreetsideLayer.hasInstance()) { 151 if (isModified()) { 152 StreetsideLayer.getInstance().getLocationChangeset().add(this); 153 } else { 154 StreetsideLayer.getInstance().getLocationChangeset().remove(this); 155 } 156 } 157 } 158 159 @Override 160 public void turn(double ca) { 161 super.turn(ca); 162 checkModified(); 163 } 164 165 /** 166 * @return the altitude 167 */ 168 public double getAl() { 169 return al; 170 } 171 172 /** 173 * @param altitude the altitude to set 174 */ 175 public void setAl(double altitude) { 176 al = altitude; 177 } 178 179 /** 180 * @return the roll 181 */ 182 public double getRo() { 183 return ro; 184 } 185 186 /** 187 * @param roll the roll to set 188 */ 189 public void setRo(double roll) { 190 ro = roll; 191 } 192 193 /** 194 * @return the pi 195 */ 196 public double getPi() { 197 return pi; 198 } 199 200 /** 201 * @param pitch the pi to set 202 */ 203 public void setPi(double pitch) { 204 pi = pitch; 205 } 206 207 /** 208 * @return the burringl 209 */ 210 public String getBl() { 211 return bl; 212 } 213 214 /** 215 * @param blurring the blurring to set 216 */ 217 public void setBl(String blurring) { 218 bl = blurring; 219 } 220 221 /** 222 * @return the ml 223 */ 224 public int getMl() { 225 return ml; 226 } 227 228 /** 229 * @param ml the ml to set 230 */ 231 public void setMl(int ml) { 232 this.ml = ml; 233 } 234 235 /** 236 * @return the nbn 237 */ 238 public List<String> getNbn() { 239 return nbn; 240 } 241 242 /** 243 * @param nbn the nbn to set 244 */ 245 public void setNbn(List<String> nbn) { 246 this.nbn = nbn; 247 } 248 249 /** 250 * @return the pbn 251 */ 252 public List<String> getPbn() { 253 return pbn; 254 } 255 256 /** 257 * @param pbn the pbn to set 258 */ 259 public void setPbn(List<String> pbn) { 260 this.pbn = pbn; 261 } 262 263 /** 264 * @return the ad 265 */ 266 public int getAd() { 267 return ad; 268 } 269 270 /** 271 * @param ad the ad to set 272 */ 273 public void setAd(int ad) { 274 this.ad = ad; 275 } 276 277 /** 278 * @return the la 279 */ 280 public double getLa() { 281 return la; 282 } 283 284 /** 285 * @param la the la to set 286 */ 287 public void setLa(double la) { 288 this.la = la; 289 } 290 291 /** 292 * @return the lo 293 */ 294 public double getLo() { 295 return lo; 296 } 297 298 /** 299 * @param lo the lo to set 300 */ 301 public void setLo(double lo) { 302 this.lo = lo; 303 } 304 305 /** 306 * @param id the id to set 307 */ 308 @Override 309public void setId(String id) { 310 this.id = id; 311 } 312 313 /** 314 * @return the rn 315 */ 316 public Rn getRn() { 317 return rn; 318 } 319 320 /** 321 * @param rn the rn to set 322 */ 323 public void setRn(Rn rn) { 324 this.rn = rn; 325 } 326}