Как лучше всего показывать несколько меток с фотографиями внутри воздушных шаров?

У меня есть следующий проект: Несколько фотографий сделаны с мобильного телефона, фотографии сохранены в веб-системе, которая в свою очередь отображает фотографии на Google Earth, которые находятся внутри него. Я прочитал много статей, но все они использовали fetchKml, одна хорошая статья, которую я прочитал, использовала php, но использовала fetchKml. Я не знаю, возможно ли вместо этого использовать parseKml. Во всяком случае, я не уверен, как это сделать с kml, так что это выглядит так:

Мой класс KMLGenerator()

public static String getKMLFromObra (List<Obra> obraFotos) {
    StringBuffer sb = new StringBuffer();
    sb.append("<?xml version='1.0' encoding='UTF-8'?>");
    sb.append("<kml xmlns='http://www.opengis.net/kml/2.2' " + 
            "xmlns:gx='http://www.google.com/kml/ext/2.2' " + 
            "xmlns:kml='http://www.opengis.net/kml/2.2' " + 
            "xmlns:atom='http://www.w3.org/2005/Atom'> ");

    if (obraFotos != null && obraFotos.size() > 0) {
        for (Obra o : obraFotos) {
            for (Local local : o.getLocais()) {
                sb.append("<Document>");  
                sb.append("<name>" + local.getName() + "</name>");  

                sb.append("<Style id='defaultStyles'>");  
                sb.append("<IconStyle>");  
                sb.append("<scale>1.1</scale>");
                sb.append("<Icon>");  
                sb.append("<href>" + "http://localhost:8080/ConstruMobilFoto/lib/img/fotoIcon.png" + "</href>");  
                sb.append("</Icon>");  
                sb.append("</IconStyle>");  
                sb.append("</Style>");  

                sb.append("<Placemark>");  
                sb.append("<name>" + "Foto" + "</name>");  
                sb.append("<styleUrl>" + "#defaultStyles"+ "</styleUrl>");  
                sb.append("<altitudeMode>" + "relativeToGround" + "</altitudeMode>");  
                sb.append("<Point>");
                sb.append("<altitudeMode>relativeToGround</altitudeMode>");
                sb.append("<coordinates>" + local.getLongitude() + "," + local.getLatitude() + "," + 50</coordinates>");
                sb.append("</Point>");
                sb.append("<Link>");
                sb.append("<href>" + local.getFotos() + "</href>");
                sb.append("</Link>");

                sb.append("</Placemark>");  
                sb.append("</Document>");  
                sb.append("</kml>");  
                return sb.toString();
            }
        }
    }
    return null;
}

У меня есть функция dwr в моем jsp, которая вызывает этот метод, получает результаты String и выполняет синтаксический анализ следующим образом:

Класс PainelEarth()

@SuppressWarnings("static-access")
public String geraFotosObra (int idObra) throws Exception {
    try {
        List<Obra> obraFotos = obraBusiness.getObraLatLong(new Obra(idObra));
        return new KMLGenerator().getKMLFromObra(obraFotos);
    } catch (Exception e) {
        log.error(e.getLocalizedMessage(), e);
        return null;
    }
}

и на моей странице jsp

function initCB(instance) {
    // other codes

    showPics(ge);
}

function showPics(ge) {
    PainelEarthAjax.geraFotosObra({
        callback : function(kmlString) {
            var kmlObject = ge.parseKml(kmlString);
            ge.getFeatures().appendChild(kmlObject);
        }
    });
    return null;
}

Любая помощь будет приветствоваться!!


person Rafael Jesus    schedule 17.02.2012    source источник
comment
Я на самом деле не уверен, в чем вопрос, можете ли вы уточнить?   -  person Mano Marks    schedule 17.02.2012


Ответы (1)


В вашем коде, если вы посмотрите на сигнатуру метода geraFotosObra, вы увидите, что он принимает один параметр int idObra.

public String geraFotosObra (int idObra) throws Exception { ...

Тем не менее, когда вы вызываете метод в своем jsp, вы передаете литерал объекта, содержащий функцию обратного вызова.

PainelEarthAjax.geraFotosObra({
        callback : function(kmlString) { ...

Как бы то ни было, я не понимаю, как генерируется kml, если, возможно, geraFotosObra не является перегруженным методом? Кроме того, даже если он был сгенерирован как есть, я не понимаю, как функция обратного вызова, которую вы передаете вместо идентификатора, когда-либо вызывается - почему, например, kmlString будет результатом вызова geraFotosObra?

// How is this called, what sets kmlString!?
callback : function(kmlString) {
            var kmlObject = ge.parseKml(kmlString);
            ge.getFeatures().appendChild(kmlObject);
        }

В целом код, который вы разместили, немного сбивает с толку, поэтому извините, если я что-то пропустил... Я думаю, что вы, возможно, скопировали и вставили некоторый код из примера fetchKml, и асинхронные обратные вызовы, используемые с этим методом, немного смутили вас.

В любом случае, исходя из того, что вы опубликовали, вы должны передать int id методу geraFotosObra, получить результат строки и затем проанализировать его в плагине.

Что-то вроде следующего имеет смысл. Замените функцию showPics следующей.

function showPics(ge) {
  var kmlString = PainelEarthAjax.geraFotosObra(1); // or something?
  var kmlObject = ge.parseKml(kmlString);
  ge.getFeatures().appendChild(kmlObject);
}
person Fraser    schedule 27.02.2012