[ 
https://issues.apache.org/jira/browse/SIS-45?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=13257774#comment-13257774
 ] 

Peter Karich edited comment on SIS-45 at 3/7/13 8:41 PM:
---------------------------------------------------------

Now I understand why the time is always the same ... because searchRegion is 
calculated wrong. It should somehow depend on the radius which will again 
improve query time a lot!

In my own quadtree implementation https://github.com/graphhopper/ I have this:

{code}
   public BBox createBBox(double lat, double lon, double radiusInKm) {
        if (radiusInKm <= 0)
            throw new IllegalArgumentException("Distance cannot be 0 or 
negative! " + radiusInKm + " lat,lon:" + lat + "," + lon);

        // length of a circle at specified lat / dist
        double dLon = (360 / (calcCircumference(lat) / radiusInKm));

        // length of a circle is independent of the longitude
        double dLat = (360 / (CalcDistance.C / radiusInKm));

        // Now return bounding box in coordinates
        return new BBox(lat + dLat, lon - dLon, lat - dLat, lon + dLon);
    }
{code}

but it is not copy and pastable due to different bounding box definitions
                
      was (Author: peathal):
    Now I understand why the time is always the same ... because searchRegion 
is calculated wrong. It should somehow depend on the radius which will again 
improve query time a lot!

In my own quadtree implementation (http://karussell.github.com/GraphHopper/) I 
have this:

{code}
   public BBox createBBox(double lat, double lon, double radiusInKm) {
        if (radiusInKm <= 0)
            throw new IllegalArgumentException("Distance cannot be 0 or 
negative! " + radiusInKm + " lat,lon:" + lat + "," + lon);

        // length of a circle at specified lat / dist
        double dLon = (360 / (calcCircumference(lat) / radiusInKm));

        // length of a circle is independent of the longitude
        double dLat = (360 / (CalcDistance.C / radiusInKm));

        // Now return bounding box in coordinates
        return new BBox(lat + dLat, lon - dLon, lat - dLat, lon + dLon);
    }
{code}

but it is not copy and pastable due to different bounding box definitions
                  
> Performance improvement of queryByPointRadius
> ---------------------------------------------
>
>                 Key: SIS-45
>                 URL: https://issues.apache.org/jira/browse/SIS-45
>             Project: Spatial Information Systems
>          Issue Type: Improvement
>          Components: distance functions
>            Reporter: Peter Karich
>            Assignee: Chris A. Mattmann
>             Fix For: 0.3
>
>
> If I didn't make a mistake a search with the normal distance method took 
> ~2.4s and with this distance method it takes only about 0.7s:
> {code}
>   public static double getHaversineDistance(double fromLat, double fromLon, 
> double toLat, double toLon) {
>     double dLat = Math.toRadians(toLat - fromLat);
>         double dLon = Math.toRadians(toLon - fromLon);
>         double a = Math.sin(dLat / 2) * Math.sin(dLat / 2)
>                 + Math.cos(Math.toRadians(fromLat)) * 
> Math.cos(Math.toRadians(toLat)) * Math.sin(dLon / 2) * Math.sin(dLon / 2);
>         return EARTH_RADIUS * 2 * Math.asin(Math.sqrt(a));
>   }
> {code}
> Also one should think about normalizing the distance before the search so 
> that one does not need the whole last line which should give further speed 
> improvements.
> I'm still unsure why it takes roughly the same time in my example for 10km, 
> 20km and 40kmm where at every step a lot more nodes are involved. Normally I 
> would say the mode nodes - the more comparisons it'll take and the slower it 
> should get. But it doesn't. Probably I'm measuring wrong?

--
This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators
For more information on JIRA, see: http://www.atlassian.com/software/jira

Reply via email to