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 // Heading (equivalent to Mapillary cd attribute - not currently supported. 045 private double he; 046 047 // Blurring instructions - not currently used by the plugin 048 private String bl; 049 050 // Undocumented Attributes 051 private int ml; 052 private long ne; 053 private long pr; 054 private List<String> nbn; 055 private List<String> pbn; 056 private int ad; 057 private Rn rn; 058 059 /** 060 * Set of traffic signs in the image. 061 *//* 062 private final List<ImageDetection> detections = Collections.synchronizedList(new ArrayList<>()); 063*/ 064 /** 065 * Main constructor of the class StreetsideImage 066 * 067 * @param id The unique identifier of the image. 068 * @param latLon The latitude and longitude where it is positioned. 069 * @param he The direction of the images in degrees, meaning 0 north. 070 */ 071 public StreetsideImage(String id, LatLon latLon, double he) { 072 super(id, latLon, he); 073 } 074 075 public StreetsideImage(String id, LatLon latLon) { 076 super(id, latLon, 0.0); 077 } 078 079 public StreetsideImage(String id, double la, double lo) { 080 super(id, new LatLon(la,lo), 0.0); 081 } 082 083 public StreetsideImage(String id) { 084 super(id); 085 } 086 087 // Default constructor for Jackson/JSON Deserializattion 088 public StreetsideImage() { 089 super(CubemapUtils.IMPORTED_ID, null, 0.0); 090 } 091 092 /** 093 * Returns the unique identifier of the object. 094 * 095 * @return A {@code String} containing the unique identifier of the object. 096 */ 097 @Override 098public String getId() { 099 return String.valueOf(id); 100 } 101 102 /*public List<ImageDetection> getDetections() { 103 return detections; 104 }*/ 105 106 /*public void setAllDetections(Collection<ImageDetection> newDetections) { 107 Logging.debug("Add {0} detections to image {1}", newDetections.size(), getId()); 108 synchronized (detections) { 109 detections.clear(); 110 detections.addAll(newDetections); 111 } 112 }*/ 113 114 public UserProfile getUser() { 115 return getSequence().getUser(); 116 } 117 118 @Override 119 public String toString() { 120 return String.format( 121 // TODO: format date cd (Gradle build error command line) 122 "Image[id=%s,lat=%f,lon=%f,he=%f,user=%s]", 123 id, latLon.lat(), latLon.lon(), he, "null"//, cd 124 ); 125 } 126 127 // TODO: implement equals @rrh 128 @Override 129 public boolean equals(Object object) { 130 return object instanceof StreetsideImage && id.equals(((StreetsideImage) object).getId()); 131 } 132 133 // TODO: implement compareTo @rrh 134 @Override 135 public int compareTo(StreetsideAbstractImage image) { 136 if (image instanceof StreetsideImage) { 137 return id.compareTo(((StreetsideImage) image).getId()); 138 } 139 return hashCode() - image.hashCode(); 140 } 141 142 // TODO: implement hashcode @rrh 143 @Override 144 public int hashCode() { 145 return id.hashCode(); 146 } 147 148 @Override 149 public void stopMoving() { 150 super.stopMoving(); 151 checkModified(); 152 } 153 154 private void checkModified() { 155 if (StreetsideLayer.hasInstance()) { 156 if (isModified()) { 157 StreetsideLayer.getInstance().getLocationChangeset().add(this); 158 } else { 159 StreetsideLayer.getInstance().getLocationChangeset().remove(this); 160 } 161 } 162 } 163 164 @Override 165 public void turn(double ca) { 166 super.turn(ca); 167 checkModified(); 168 } 169 170 /** 171 * @return the altitude 172 */ 173 public double getAl() { 174 return al; 175 } 176 177 /** 178 * @param altitude the altitude to set 179 */ 180 public void setAl(double altitude) { 181 al = altitude; 182 } 183 184 /** 185 * @return the roll 186 */ 187 public double getRo() { 188 return ro; 189 } 190 191 /** 192 * @param roll the roll to set 193 */ 194 public void setRo(double roll) { 195 ro = roll; 196 } 197 198 /** 199 * @return the pi 200 */ 201 public double getPi() { 202 return pi; 203 } 204 205 /** 206 * @param pitch the pi to set 207 */ 208 public void setPi(double pitch) { 209 pi = pitch; 210 } 211 212 /** 213 * @return the burringl 214 */ 215 public String getBl() { 216 return bl; 217 } 218 219 /** 220 * @param blurring the blurring to set 221 */ 222 public void setBl(String blurring) { 223 bl = blurring; 224 } 225 226 /** 227 * @return the ml 228 */ 229 public int getMl() { 230 return ml; 231 } 232 233 /** 234 * @param ml the ml to set 235 */ 236 public void setMl(int ml) { 237 this.ml = ml; 238 } 239 240 /** 241 * @return the ne 242 */ 243 public long getNe() { 244 return ne; 245 } 246 247 /** 248 * @param ne the ne to set 249 */ 250 public void setNe(long ne) { 251 this.ne = ne; 252 } 253 254 /** 255 * @return the pr 256 */ 257 public long getPr() { 258 return pr; 259 } 260 261 /** 262 * @param pr the pr to set 263 */ 264 public void setPr(long pr) { 265 this.pr = pr; 266 } 267 268 /** 269 * @return the nbn 270 */ 271 public List<String> getNbn() { 272 return nbn; 273 } 274 275 /** 276 * @param nbn the nbn to set 277 */ 278 public void setNbn(List<String> nbn) { 279 this.nbn = nbn; 280 } 281 282 /** 283 * @return the pbn 284 */ 285 public List<String> getPbn() { 286 return pbn; 287 } 288 289 /** 290 * @param pbn the pbn to set 291 */ 292 public void setPbn(List<String> pbn) { 293 this.pbn = pbn; 294 } 295 296 /** 297 * @return the ad 298 */ 299 public int getAd() { 300 return ad; 301 } 302 303 /** 304 * @param ad the ad to set 305 */ 306 public void setAd(int ad) { 307 this.ad = ad; 308 } 309 310 /** 311 * @return the la 312 */ 313 public double getLa() { 314 return la; 315 } 316 317 /** 318 * @param la the la to set 319 */ 320 public void setLa(double la) { 321 this.la = la; 322 } 323 324 /** 325 * @return the lo 326 */ 327 public double getLo() { 328 return lo; 329 } 330 331 /** 332 * @param lo the lo to set 333 */ 334 public void setLo(double lo) { 335 this.lo = lo; 336 } 337 338 /** 339 * @param id the id to set 340 */ 341 @Override 342public void setId(String id) { 343 this.id = id; 344 } 345 346 /** 347 * @return the rn 348 */ 349 public Rn getRn() { 350 return rn; 351 } 352 353 /** 354 * @param rn the rn to set 355 */ 356 public void setRn(Rn rn) { 357 this.rn = rn; 358 } 359}