Hello,
I am developing a simple GIS cloud application using Google App Engine & Geomodel. In this application, I would like to store latitude and longitude of points from user, & later on query them using boundingbox & proximity queries. I am experiencing problem while trying to access the server through a browser. I appreciate it if someone help me with this regard. I am using Eclipse, and here is what I did: 1) Created a Web application project enabling only Google App Engine (1.3.4)(as Google SDK) 2) Created a simple jsp file in "war" folder to get latitude & longitude from user 3) Created two java classes, UseGeocell and ObjectToSave. UseGeocell class is similar to the code in http://code.google.com/p/javageomodel/source/browse/trunk/geocell/src/test/java/com/beoui/utils/HowToUseGeocell.java ObjectToSave is exactly http://code.google.com/p/javageomodel/source/browse/trunk/geocell/src/test/java/com/beoui/utils/ObjectToSave.java 4)In my Servlet I defined an object of type UseGeocell and called testHowToSaveGeocellsInDatabase function in order to save latitude & longitude that are obtained from the input Here is my code: My UseGeocell class: package edu.pitt.Test8_Geomodel_GAE; import java.util.ArrayList; import java.util.List; import java.util.logging.Level; import java.util.logging.Logger; import javax.jdo.PersistenceManager; import junit.framework.Assert; import junit.framework.TestCase; import com.beoui.geocell.GeocellManager; import com.beoui.geocell.model.BoundingBox; import com.beoui.geocell.model.CostFunction; import com.beoui.geocell.model.GeocellQuery; import com.beoui.geocell.model.Point; /** * Unit test also used to explain how to use Geocell class. * * @author Alexandre Gellibert <[email protected]> * */ public class UseGeocell extends TestCase { private final Logger log = Logger.getLogger("com.beoui.utils"); public ObjectToSave obj; /** * First step is to save your entities. * In database, you don't save only latitude and longitude of your point but also geocells around this point. */ public void testHowToSaveGeocellsInDatabase(double lat, double lon) { // Incoming data: latitude and longitude (Bordeaux for instance) //double lat = 44.838611; //double lon = -0.578333; // Transform it to a point Point p = new Point(lat, lon); // Generates the list of GeoCells List<String> cells = GeocellManager.generateGeoCell(p); // Save your instance obj = new ObjectToSave(); obj.setLatitude(lat); obj.setLongitude(lon); obj.setGeocells(cells); //objDao.save(obj); // Just checking that cells are not empty Assert.assertTrue(cells.size() > 0); // Show in the log what cells are going to be saved log.log(Level.INFO, "Geocells to be saved for Point("+lat +","+lon+") are: "+cells); } /** * Second step, now entities are in database, we can query on them. * Here is the example of a bounding box query. * */ public void testHowToQueryOnABoundingBox(double latSW, double lonSW, double latNE, double lonNE) { // Incoming data: latitude and longitude of south-west and north-east points (around Bordeaux for instance =) ) //double latSW = 44.8; //double lonSW = -0.6; // double latNE = 44.9; // double lonNE = -0.7; // Transform this to a bounding box BoundingBox bb = new BoundingBox(latNE, lonNE, latSW, lonSW); // Calculate the geocells list to be used in the queries (optimize list of cells that complete the given bounding box) List<String> cells = GeocellManager.bestBboxSearchCells(bb, null); // OR if you want to use a custom "cost function" List<String> cells2 = GeocellManager.bestBboxSearchCells(bb, new CostFunction() { @Override public double defaultCostFunction(int numCells, int resolution) { if(numCells > 100) { return Double.MAX_VALUE; } else { return 0; } } }); // Use this in a query // In Google App Engine, you'll have something like below. In hibernate (or whatever else), it might be a little bit different. // String queryString = "select from ObjectToSave where geocellsParameter.contains(geocells)"; // Query query = pm.newQuery(query); // query.declareParameters("String geocellsParameter"); // query.declareParameters("String geocellsP"); // List<ObjectToSave> objects = (List<ObjectToSave>) query.execute(cells); // Just checking that cells are not empty Assert.assertTrue(cells.size() > 0); Assert.assertTrue(cells2.size() > 0); // Show in the log what cells shoud be used in the query log.log(Level.INFO, "Geocells to use in query for PointSW("+latSW+","+lonSW+") ; PointNE("+latNE+","+lonNE+") are: "+cells); } /** * To test proximity search, you have to give your base query and it will be enhanced with geocells restrictions. * */ // TODO configure persistent manager to run a real test public void testHowToQueryWithProximitySearch(double lat, double lon) { Point center = new Point(lat, lon); PersistenceManager pm = null;// here put your persistent manager List<Object> params = new ArrayList<Object>(); params.add("John"); GeocellQuery baseQuery = new GeocellQuery("lastName == lastNameParam", "String lastNameParam", params); List<ObjectToSave> objects = null; try { objects = GeocellManager.proximityFetch(center, 40, 0, ObjectToSave.class, baseQuery, pm); Assert.assertTrue(objects.size() > 0); } catch (Exception e) { // We catch exception here because we have not configured the PersistentManager (and so the queries won't work) } } } My servlet: package edu.pitt.Test8_Geomodel_GAE; import java.io.IOException; import javax.servlet.http.*; @SuppressWarnings("serial") public class Test8_Geomodel_GAEServlet extends HttpServlet { public void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException { doPost(req, resp); } public void doPost(HttpServletRequest req, HttpServletResponse resp) throws IOException { String lat = req.getParameter("txtlatitude"); String lon = req.getParameter("txtlongitude"); double latitude = Double.parseDouble(lat); double longitude = Double.parseDouble(lon); UseGeocell gc = new UseGeocell(); gc.testHowToSaveGeocellsInDatabase(latitude, longitude); resp.sendRedirect("/main.jsp"); } } My jsp file: <%@ page contentType="text/html;charset=UTF-8" language="java" %> <%@ page import="java.util.List" %> <%@ page import="javax.jdo.PersistenceManager" %> <%@ page import="com.google.appengine.api.users.User" %> <%@ page import="com.google.appengine.api.users.UserService" %> <%@ page import="com.google.appengine.api.users.UserServiceFactory" %> <%@ page import="javax.jdo.PersistenceManager" %> <%@ page import= "edu.pitt.Test8_Geomodel_GAE.Test8_Geomodel_GAEServlet" %> <%@ page import= "edu.pitt.Test8_Geomodel_GAE.UseGeocell" %> <html> <head><title>Geomodel GAE Project_helloo2</title></head> <body bgcolor="#ffffff" background="background.gif"> <table border="0" width="700"> <tr> <td width="150"> </td> <td width="50"> <h1>Enter a point:</h1> </td> </tr> <tr> <td width="150"> </td> <td width="550"> <form action="/test8_geomodel_gae" method="post"> <br>Latitude: <input type="text" name="txtlatitude" size="25"> <br>Longitude: <input type="text" name="txtlongitude" size="25"> <br> <input type="submit" value="Submit"> </form> </td> </tr> </table> </body> </html> My web.xml file: <?xml version="1.0" encoding="utf-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" version="2.5"> <servlet> <servlet-name>Test8_Geomodel_GAE</servlet-name> <servlet- class>edu.pitt.Test8_Geomodel_GAE.Test8_Geomodel_GAEServlet</servlet- class> </servlet> <servlet-mapping> <servlet-name>Test8_Geomodel_GAE</servlet-name> <url-pattern>/test8_geomodel_gae</url-pattern> </servlet-mapping> <welcome-file-list> <welcome-file>main.jsp</welcome-file> </welcome-file-list> </web-app> The code is compiled and run successfully. However, when in the browser, when I submit latitude & longitude I receive an error as follow: HTTP ERROR 500 Problem accessing /test8_geomodel_gae. Reason: com/beoui/geocell/model/Point Caused by: java.lang.NoClassDefFoundError: com/beoui/geocell/model/Point at edu.pitt.Test8_Geomodel_GAE.Test8_Geomodel_GAEServlet.doPost(Test8_Geomodel_GAEServlet.java: 45) at javax.servlet.http.HttpServlet.service(HttpServlet.java:713) at javax.servlet.http.HttpServlet.service(HttpServlet.java:806) at org.mortbay.jetty.servlet.ServletHolder.handle(ServletHolder.java: 511) at org.mortbay.jetty.servlet.ServletHandler $CachedChain.doFilter(ServletHandler.java:1166) at com.google.appengine.api.blobstore.dev.ServeBlobFilter.doFilter(ServeBlobFilter.java: 51) at org.mortbay.jetty.servlet.ServletHandler $CachedChain.doFilter(ServletHandler.java:1157) at com.google.apphosting.utils.servlet.TransactionCleanupFilter.doFilter(TransactionCleanupFilter.java: 43) at org.mortbay.jetty.servlet.ServletHandler $CachedChain.doFilter(ServletHandler.java:1157) at com.google.appengine.tools.development.StaticFileFilter.doFilter(StaticFileFilter.java: 122) at org.mortbay.jetty.servlet.ServletHandler $CachedChain.doFilter(ServletHandler.java:1157) at org.mortbay.jetty.servlet.ServletHandler.handle(ServletHandler.java: 388) at org.mortbay.jetty.security.SecurityHandler.handle(SecurityHandler.java: 216) at org.mortbay.jetty.servlet.SessionHandler.handle(SessionHandler.java: 182) at org.mortbay.jetty.handler.ContextHandler.handle(ContextHandler.java: 765) at org.mortbay.jetty.webapp.WebAppContext.handle(WebAppContext.java: 418) at com.google.apphosting.utils.jetty.DevAppEngineWebAppContext.handle(DevAppEngineWebAppContext.java: 70) at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java: 152) at com.google.appengine.tools.development.JettyContainerService $ApiProxyHandler.handle(JettyContainerService.java:349) at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java: 152) at org.mortbay.jetty.Server.handle(Server.java:326) at org.mortbay.jetty.HttpConnection.handleRequest(HttpConnection.java: 542) at org.mortbay.jetty.HttpConnection $RequestHandler.content(HttpConnection.java:938) at org.mortbay.jetty.HttpParser.parseNext(HttpParser.java:755) at org.mortbay.jetty.HttpParser.parseAvailable(HttpParser.java:218) at org.mortbay.jetty.HttpConnection.handle(HttpConnection.java:404) at org.mortbay.io.nio.SelectChannelEndPoint.run(SelectChannelEndPoint.java: 409) at org.mortbay.thread.QueuedThreadPool $PoolThread.run(QueuedThreadPool.java:582) I am not sure what I am doing wrong. I really appreciate it if someone help me with this issue. Thanks. -- You received this message because you are subscribed to the Google Groups "Google App Engine for Java" group. To post to this group, send email to [email protected]. To unsubscribe from this group, send email to [email protected]. For more options, visit this group at http://groups.google.com/group/google-appengine-java?hl=en.
