Jarek W.

Jarek W. Software Engineer

Temat: Problem z aplikacją GWT + Google Maps + KML + GAE

Witam,

Mam problem z aplikacją w GWT (Google Web Toolkit) na GAE (Google App Engine), która wykorzystuje KML generowany przez serwlet HTTP do nanoszenia tras na mapę. Dane są następujące:

KML jest generowany przez serwlet:


...
public void doGet(HttpServletRequest request, HttpServletResponse response) {
try {
response.getOutputStream().println(getSampleKml());
} catch(Exception e) {
}
}

private String getSampleKml() {
...//zwraca plik KML postaci: http://jarekwalkiewicz.pl/public/points.kml
}
...


Klient (GWT) wygląda tak (w skrócie):

...
private final static String GOOGLE_MAPS_API_KEY = "...";
private final static Float BEGIN_LAT = new Float(52.15);
private final static Float BEGIN_LNG = new Float(21.0);
private final static int ZOOM_LEVEL = 12;
private MapWidget map;
...
Maps.loadMapsApi(GOOGLE_MAPS_API_KEY, "2", false, new Runnable() {
public void run() {
map = new MapWidget(LatLng.newInstance(BEGIN_LAT.floatValue(), BEGIN_LNG.floatValue()), ZOOM_LEVEL);
map.setSize("640px", "480px");
map.addControl(new LargeMapControl());
mapPanel.add(map);
}
});
...
String url = "..."; //<-- TO JEST WAŻNE
GeoXmlOverlay.load(url, new GeoXmlLoadCallback() {
@Override
public void onFailure(String url, Throwable caught) {
}

@Override
public void onSuccess(String url, GeoXmlOverlay overlay) {
map.addOverlay(overlay);
overlay.setVisible(true);
}
});
...

I teraz tak:
1) Jeśli url == "http://jarekwalkiewicz.pl/public/points.kml", to na mapę jest nanoszona odpowiednia trasa - wszystko jest okej.
2) Jeśli url == "http://xxxxxx.appspot.com/service/kml" (nie chcę podawać rzeczywistej nazwy aplikacji), to na mapę nie jest nanoszona trasa (następuje wejście do onFailure, choć Throwable caught jest null).

Oczywiście na pewnym zdarzeniu występuje wysłanie żądania pobrania tego KMLa. Odpowiedzi widoczne w Firebug są następujące:

Przypadek 1)

_xdc_._3goh1262o && _xdc_._3goh1262o({"name":"http://jarekwalkiewicz.pl/public/points.kml","Status":{"code":200,"request":"geoxml"},viewport: {center: {lat: 52.219500,lng: 21.022500},span: {lat: 0.139000,lng: 0.045000}},"kmlOverlay":{tileUrlBase:"/mapsdt?id=http://jarekwalkiewicz.pl/public/points.kml",force_mapsdt:false,geViewable:true,name:"Test",description:"Testowe punkty",polylines:[{id:"A",fid:"g313a16e70c1429df",name:"Jarek Walkiewicz",description:"",points:"oph}H_qd_Cod@oKoKoK?wQgEgE_wQ_XoKod@oK_q@oKgEgw@oKgEgEod@gE_Xg^?_q@gEgEwj@?",levels:"B@@@@A?A?@@@@@@B",numLevels:4,zoomFactor:16,weight:4,color:"#ff0000",opacity:1,snippet:""}],layer_id:"kml:cO64pz4jBDEZpbGphuGqRs30leGSyPBI",server_version:3,server_options:"F"}})


Przypadek 2)

_xdc_._3goh1262o && _xdc_._3goh1262o({"name":"http://xxxxxx.appspot.com/service/kml","Status":{"code":200,"request":"geoxml"}})


Wygląda na to, że brakuje części w odpowiedzi do przypadku 2). I teraz pytanie: dlaczego? Czy chodzi o to, że serwlet jest w chmurze na GAE? Generalnie jak się bezpośrednio do niego odwołam z przeglądarki, to jest zwracana oczekiwana treść. Natomiast "nie potrafi" jej pobrać klient GWT. Co robię źle? Jakie jest na to rozwiązanie? Spotkał się ktoś w ogóle z takim problemem wcześniej? Wszelkie (p)odpowiedzi mile widziane.

Pozdrawiam,
JarekJarek W. edytował(a) ten post dnia 03.06.11 o godzinie 14:09
Jarek W.

Jarek W. Software Engineer

Temat: Problem z aplikacją GWT + Google Maps + KML + GAE

Poradziłem sobie inaczej. Generalnie mówiąc, źle podszedłem do rozwiązania problemu. Niepotrzebne zupełnie były serwlety i KML do tego, co chciałem osiągnąć w swojej aplikacji. Generalnie wystarczyło odwołać się z klienta do serwera i w odpowiedzi dostać listę pewnych punktów ze współrzędnymi w postaci listy typu np. List<PositionProxy>. Następnie przeiterować się po niej i zebrać wszystkie punkty do tablicy typu LatLng[]. Potem skorzystać z com.google.gwt.maps.client.overlay.Polyline, przekazać tę tablicę punktów do konstruktora (można też dodać inne parametry: kolor, szerokość etc.) i ostatecznie obiekt klasy polyline dodać do mapy. Mogłoby to wyglądać mniej więcej tak:


positionRequest.findPositions(/* parametry */).fire(new Receiver<List<PositionProxy>>() {
public void onSuccess(List<PositionProxy> positions) {
LatLng[] points;
int positionsSize = positions.size();
if(positionsSize > 0) {
points = new LatLng[positionsSize];
int i = 0;
for(PositionProxy position : positions) {
LatLng positionCoordinates = LatLng.newInstance(position.getLat(), position.getLng());
points[i++] = positionCoordinates;
}
Polyline polyline = new Polyline(points, "#ff0000");
map.addOverlay(polyline);
}
}
});


Także temat jest do zamknięcia. Jeżeli ktoś przeze mnie zadał sobie trud i zaczął nad tym myśleć, to dziękuję.

Pozdrawiam,
Jarek

konto usunięte

Temat: Problem z aplikacją GWT + Google Maps + KML + GAE

Jak to dobrze gdy problemy się rozwiązują i gdy sami do tego dochodzimy.

Następna dyskusja:

Spring + hibernate - proble...




Wyślij zaproszenie do