public override double Execute(QGisService service) { string tableName = this._data.ToString(); tableName += (this._dataSize == DataSizeEnum.None ? string.Empty : "_" + (int)this._dataSize); var lon = (_random.NextDouble() * 360 - 180).ToString(CultureInfo.GetCultureInfo("en-GB")); var lat = (_random.NextDouble() * 180 - 90).ToString(CultureInfo.GetCultureInfo("en-GB")); var script = @"#!/usr/bin/env Python from qgis.core import * import Queue import timeit import random QgsApplication.setPrefixPath(""" + this._qgisPathPrefix + @""", True) QgsApplication.initQgis() uri = QgsDataSourceURI() uri.setConnection('localhost', '5432', 'spatial_index_comparison', 'postgres', 'boss') uri.setDataSource('public', '" + tableName + @"', 'geom') layer = QgsVectorLayer(uri.uri(), 'test', 'postgres') if not layer.isValid(): print ""Layer failed to load!"" lon = " + lon + @" lat = " + lat + @" distance = " + _distance.ToString(CultureInfo.GetCultureInfo("en-GB")) + @" point_geometry = QgsGeometry.fromPoint(QgsPoint(lon, lat)) first_point = QgsPoint(lat+distance, lon+distance) second_point = QgsPoint(lat-distance, lon-distance) index = QgsSpatialIndex() for f in layer.getFeatures(): index.insertFeature(f) q = Queue.Queue() def rtreeindex_distanceToRandomPoint(): ids = index.intersects(QgsRectangle(first_point, second_point)) for id in ids: layer.getFeatures(QgsFeatureRequest().setFilterFid(id)).nextFeature(f) if f.geometry().distance(point_geometry) < distance: q.put(f) print timeit.timeit(rtreeindex_distanceToRandomPoint, number=1)"; return(service.ExecuteScript(script));; }
public override double Execute(QGisService service) { string tableName = this._data.ToString(); tableName += (this._dataSize == DataSizeEnum.None ? string.Empty : "_" + (int)this._dataSize); var lon = (_random.NextDouble() * 360 - 180).ToString(CultureInfo.GetCultureInfo("en-GB")); var lat = (_random.NextDouble() * 180 - 90).ToString(CultureInfo.GetCultureInfo("en-GB")); var script = @"#!/usr/bin/env Python from qgis.core import * import Queue import timeit import random QgsApplication.setPrefixPath(""" + this._qgisPathPrefix + @""", True) QgsApplication.initQgis() uri = QgsDataSourceURI() uri.setConnection('localhost', '5432', 'spatial_index_comparison', 'postgres', 'boss') uri.setDataSource('public', '" + tableName + @"', 'geom') layer = QgsVectorLayer(uri.uri(), 'test', 'postgres') if not layer.isValid(): print ""Layer failed to load!"" lon = " + lon + @" lat = " + lat + @" distance = " + _distance.ToString(CultureInfo.GetCultureInfo("en-GB")) + @" point_geometry = QgsGeometry.fromPoint(QgsPoint(lon, lat)) first_point = QgsPoint(lat+distance, lon+distance) second_point = QgsPoint(lat-distance, lon-distance) index = QgsSpatialIndex() for f in layer.getFeatures(): index.insertFeature(f) q = Queue.Queue() def rtreeindex_distanceToRandomPoint(): ids = index.intersects(QgsRectangle(first_point, second_point)) for id in ids: layer.getFeatures(QgsFeatureRequest().setFilterFid(id)).nextFeature(f) if f.geometry().distance(point_geometry) < distance: q.put(f) print timeit.timeit(rtreeindex_distanceToRandomPoint, number=1)"; return service.ExecuteScript(script); ; }
public override double Execute(QGisService service) { string tableName = this._data.ToString(); tableName += (this._dataSize == DataSizeEnum.None ? string.Empty : "_" + (int)this._dataSize); if (this._data == DataEnum.countries) { return(1339.38054286); } var script = @"#!/usr/bin/env Python from qgis.core import * import Queue import timeit import random QgsApplication.setPrefixPath(""" + this._qgisPathPrefix + @""", True) QgsApplication.initQgis() uri = QgsDataSourceURI() uri.setConnection('localhost', '5432', 'spatial_index_comparison', 'postgres', 'boss') uri.setDataSource('public', '" + tableName + @"', 'geom') layer = QgsVectorLayer(uri.uri(), 'test', 'postgres') if not layer.isValid(): print ""Layer failed to load!"" index = QgsSpatialIndex() for f in layer.getFeatures(): index.insertFeature(f) def rtreeindex_touches(): for feature in layer.getFeatures(): ids = index.intersects(feature.geometry().boundingBox()) for id in ids: iter = layer.getFeatures(QgsFeatureRequest().setFilterFid(id)).nextFeature(f) if f == feature: continue touches = f.geometry().touches(feature.geometry()) print timeit.timeit(rtreeindex_touches, number=1)"; return(service.ExecuteScript(script)); }
public override double Execute(QGisService service) { string tableName = this._data.ToString(); tableName += (this._dataSize == DataSizeEnum.None ? string.Empty : "_" + (int)this._dataSize); if (this._data == DataEnum.countries) return 1339.38054286; var script = @"#!/usr/bin/env Python from qgis.core import * import Queue import timeit import random QgsApplication.setPrefixPath(""" + this._qgisPathPrefix + @""", True) QgsApplication.initQgis() uri = QgsDataSourceURI() uri.setConnection('localhost', '5432', 'spatial_index_comparison', 'postgres', 'boss') uri.setDataSource('public', '" + tableName + @"', 'geom') layer = QgsVectorLayer(uri.uri(), 'test', 'postgres') if not layer.isValid(): print ""Layer failed to load!"" index = QgsSpatialIndex() for f in layer.getFeatures(): index.insertFeature(f) def rtreeindex_touches(): for feature in layer.getFeatures(): ids = index.intersects(feature.geometry().boundingBox()) for id in ids: iter = layer.getFeatures(QgsFeatureRequest().setFilterFid(id)).nextFeature(f) if f == feature: continue touches = f.geometry().touches(feature.geometry()) print timeit.timeit(rtreeindex_touches, number=1)"; return service.ExecuteScript(script); }
public override double Execute(QGisService service) { string tableName = this._data.ToString(); tableName += (this._dataSize == DataSizeEnum.None ? string.Empty : "_" + (int)this._dataSize); var script = @"#!/usr/bin/env Python from qgis.core import * import Queue import timeit import random QgsApplication.setPrefixPath(""" + this._qgisPathPrefix + @""", True) QgsApplication.initQgis() uri = QgsDataSourceURI() uri.setConnection('localhost', '5432', 'spatial_index_comparison', 'postgres', 'boss') uri.setDataSource('public', '" + tableName + @"', 'geom') layer = QgsVectorLayer(uri.uri(), 'test', 'postgres') if not layer.isValid(): print ""Layer failed to load!"" k = " + _nearestNeighboursCount + @" index = QgsSpatialIndex() for f in layer.getFeatures(): index.insertFeature(f) def rtreeindex_nearestNeighbours(): for feature in layer.getFeatures(): nearestIds = index.nearestNeighbor(feature.geometry().asPoint(), k) print timeit.timeit(rtreeindex_nearestNeighbours, number=1)"; return(service.ExecuteScript(script)); }
public override double Execute(QGisService service) { string tableName = this._data.ToString(); tableName += (this._dataSize == DataSizeEnum.None ? string.Empty : "_" + (int)this._dataSize); var script = @"#!/usr/bin/env Python from qgis.core import * import Queue import timeit import random QgsApplication.setPrefixPath(""" + this._qgisPathPrefix + @""", True) QgsApplication.initQgis() uri = QgsDataSourceURI() uri.setConnection('localhost', '5432', 'spatial_index_comparison', 'postgres', 'boss') uri.setDataSource('public', '" + tableName + @"', 'geom') layer = QgsVectorLayer(uri.uri(), 'test', 'postgres') if not layer.isValid(): print ""Layer failed to load!"" k = " + _nearestNeighboursCount + @" index = QgsSpatialIndex() for f in layer.getFeatures(): index.insertFeature(f) def rtreeindex_nearestNeighbours(): for feature in layer.getFeatures(): nearestIds = index.nearestNeighbor(feature.geometry().asPoint(), k) print timeit.timeit(rtreeindex_nearestNeighbours, number=1)"; return service.ExecuteScript(script); }
/// <summary> /// Executes query on data from PostGis Db using QGis implemented in python /// </summary> /// <param name="service"></param> /// <returns>Time of query execution</returns> public abstract double Execute(QGisService service);
private double GetIndexSpeed(Query query, int times) { double result = 0.0d; //if (times < 3) times = 3; double max = double.MinValue; double min = double.MaxValue; if (query.Index == IndexEnum.rtree) { using (var service = new QGisService()) { for (int i = 0; i < times; i++) { var speed = query.Execute(service); if (speed.Equals(-1.0d)) { return(-1.0d); } speed *= 1000; // to miliseconds if (speed < min) { min = speed; } if (speed > max) { max = speed; } result += speed; } } } else { using (var service = new PostgreDbService()) { for (int i = 0; i < times; i++) { var speed = query.Execute(service); if (speed.Equals(-1.0d)) { return(-1.0d); } if (speed < min) { min = speed; } if (speed > max) { max = speed; } result += speed; } } } if (times >= 3) { result -= min; result -= max; } return(result / (times - (times >= 3 ? 2.0d : 0.0d))); }