FazBrowse GitHub Viewer | Trending |
URL:
| Home
Tools: [Download Repo ZIP]   [Original HTTPS Page]

[Trunk] · SharpMap/SharpMap@ce2b57f · GitHub

Repository navigation

Commit ce2b57f

Browse files
committed
[Trunk]
- Unit test for basic serialization using remoting approach - Adjusting TileLayer's GetTile approach to the way the async variant does it - Attempt to make GeometryFeatureProvider thread safe git-tfs-id: [https://tfs.codeplex.com/tfs/TFS01]$/SharpMap/Trunk;C100898
1 parent aa3394a commit ce2b57f

5 files changed

Lines changed: 338 additions & 64 deletions

File tree

‎SharpMap/Data/Providers/GeometryFeatureProvider.cs‎

Lines changed: 106 additions & 59 deletions
Original file line numberDiff line numberDiff line change
@@ -58,8 +58,9 @@ namespace SharpMap.Data.Providers
5858
/// </remarks>
5959
public class GeometryFeatureProvider : FilterProvider, IProvider
6060
{
61+
private readonly object _featuresLock = new object();
6162
private readonly FeatureDataTable _features;
62-
private int _SRID = -1;
63+
private int _srid = -1;
6364

6465
#region constructors
6566

@@ -115,7 +116,13 @@ private void HandleFeaturesCleared(object sender, DataTableClearEventArgs e)
115116
/// </summary>
116117
public FeatureDataTable Features
117118
{
118-
get { return _features; }
119+
get
120+
{
121+
lock (_features)
122+
{
123+
return _features;
124+
}
125+
}
119126
}
120127

121128
#region IProvider Members
@@ -129,14 +136,43 @@ public Collection<IGeometry> GetGeometriesInView(Envelope bbox)
129136
{
130137
var list = new Collection<IGeometry>();
131138

132-
foreach (FeatureDataRow fdr in _features.Rows)
133-
if (!fdr.Geometry.IsEmpty)
134-
if (FilterDelegate == null || FilterDelegate(fdr))
139+
lock (_features)
140+
{
141+
foreach (FeatureDataRow fdr in _features.Rows)
142+
if (!fdr.Geometry.IsEmpty)
143+
if (FilterDelegate == null || FilterDelegate(fdr))
144+
{
145+
if (bbox.Intersects(fdr.Geometry.EnvelopeInternal))
146+
list.Add(fdr.Geometry);
147+
}
148+
}
149+
return list;
150+
}
151+
152+
private IEnumerable<KeyValuePair<uint, FeatureDataRow>> EnumerateFeatures(Envelope bbox)
153+
{
154+
lock (_featuresLock)
155+
{
156+
uint id = 0;
157+
if (FilterDelegate == null)
158+
foreach (FeatureDataRow feature in _features.Rows)
135159
{
136-
if (bbox.Intersects(fdr.Geometry.EnvelopeInternal))
137-
list.Add(fdr.Geometry);
160+
var geom = feature.Geometry;
161+
var testBox = geom != null ? geom.EnvelopeInternal : new Envelope(bbox);
162+
if (bbox.Intersects(testBox))
163+
yield return new KeyValuePair<uint, FeatureDataRow>(id, feature);
164+
id++;
138165
}
139-
return list;
166+
else
167+
foreach (FeatureDataRow feature in _features.Rows)
168+
{
169+
var geom = feature.Geometry;
170+
var testBox = geom != null ? geom.EnvelopeInternal : new Envelope(bbox);
171+
if (bbox.Intersects(testBox) && FilterDelegate(feature))
172+
yield return new KeyValuePair<uint, FeatureDataRow>(id, feature);
173+
id++;
174+
}
175+
}
140176
}
141177

142178
/// <summary>
@@ -147,17 +183,10 @@ public Collection<IGeometry> GetGeometriesInView(Envelope bbox)
147183
public Collection<uint> GetObjectIDsInView(Envelope bbox)
148184
{
149185
var list = new Collection<uint>();
150-
uint i = 0;
151-
foreach (FeatureDataRow fdr in _features.Rows)
152-
{
153-
i++;
154-
if (!fdr.Geometry.IsEmpty)
155-
if (FilterDelegate == null || FilterDelegate(fdr))
156-
{
157-
if (bbox.Intersects(fdr.Geometry.EnvelopeInternal))
158-
list.Add(i);
159-
}
160-
}
186+
187+
foreach (var idFeature in EnumerateFeatures(bbox))
188+
list.Add(idFeature.Key);
189+
161190
return list;
162191
}
163192

@@ -168,7 +197,10 @@ public Collection<uint> GetObjectIDsInView(Envelope bbox)
168197
/// <returns>geometry</returns>
169198
public IGeometry GetGeometryByID(uint oid)
170199
{
171-
return ((FeatureDataRow)_features.Rows[(int)oid]).Geometry;
200+
lock (_featuresLock)
201+
{
202+
return ((FeatureDataRow)_features.Rows[(int)oid]).Geometry;
203+
}
172204
}
173205

174206
/// <summary>
@@ -178,18 +210,24 @@ public IGeometry GetGeometryByID(uint oid)
178210
/// <param name="ds">FeatureDataSet to fill data into</param>
179211
public void ExecuteIntersectionQuery(IGeometry geom, FeatureDataSet ds)
180212
{
181-
var fdt = new FeatureDataTable();
182-
fdt = _features.Clone();
213+
FeatureDataTable fdt;
214+
lock (_featuresLock)
215+
fdt = _features.Clone();
183216

184-
foreach (FeatureDataRow fdr in _features)
185-
if (FilterDelegate == null || FilterDelegate(fdr))
217+
fdt.BeginLoadData();
218+
var pg = new NetTopologySuite.Geometries.Prepared.PreparedGeometryFactory().Create(geom);
219+
foreach (var idFeature in EnumerateFeatures(geom.EnvelopeInternal))
220+
{
221+
var fdr = idFeature.Value;
222+
if (pg.Intersects(fdr.Geometry))
186223
{
187-
if (fdr.Geometry.EnvelopeInternal.Intersects(geom.EnvelopeInternal))
188-
{
189-
fdt.LoadDataRow(fdr.ItemArray, false);
190-
((FeatureDataRow)fdt.Rows[fdt.Rows.Count - 1]).Geometry = fdr.Geometry;
191-
}
224+
fdt.LoadDataRow(fdr.ItemArray, true);
225+
var tmpGeom = fdr.Geometry;
226+
if (tmpGeom != null)
227+
((FeatureDataRow)fdt.Rows[fdt.Rows.Count - 1]).Geometry = (IGeometry)tmpGeom.Clone();
192228
}
229+
}
230+
fdt.EndLoadData();
193231

194232
ds.Tables.Add(fdt);
195233
}
@@ -201,21 +239,20 @@ public void ExecuteIntersectionQuery(IGeometry geom, FeatureDataSet ds)
201239
/// <param name="ds">FeatureDataSet to fill data into</param>
202240
public void ExecuteIntersectionQuery(Envelope box, FeatureDataSet ds)
203241
{
204-
var fdt = new FeatureDataTable();
205-
fdt = _features.Clone();
242+
FeatureDataTable fdt;
243+
lock (_featuresLock)
244+
fdt = _features.Clone();
206245

207-
foreach (FeatureDataRow fdr in _features)
208-
if (fdr.Geometry != null)
209-
{
210-
if (FilterDelegate == null || FilterDelegate(fdr))
211-
{
212-
if (fdr.Geometry.EnvelopeInternal.Intersects(box))
213-
{
214-
fdt.LoadDataRow(fdr.ItemArray, false);
215-
(fdt.Rows[fdt.Rows.Count - 1] as FeatureDataRow).Geometry = fdr.Geometry;
216-
}
217-
}
218-
}
246+
fdt.BeginLoadData();
247+
foreach (var idFeature in EnumerateFeatures(box))
248+
{
249+
var fdr = idFeature.Value;
250+
fdt.LoadDataRow(fdr.ItemArray, false);
251+
var geom = fdr.Geometry;
252+
if (geom != null)
253+
((FeatureDataRow)fdt.Rows[fdt.Rows.Count - 1]).Geometry = (IGeometry)geom.Clone();
254+
}
255+
fdt.EndLoadData();
219256

220257
ds.Tables.Add(fdt);
221258
}
@@ -226,18 +263,24 @@ public void ExecuteIntersectionQuery(Envelope box, FeatureDataSet ds)
226263
/// <returns>number of features</returns>
227264
public int GetFeatureCount()
228265
{
229-
return _features.Rows.Count;
266+
lock(_featuresLock)
267+
return _features.Rows.Count;
230268
}
231269

232270
/// <summary>
233-
/// Throws an NotSupportedException. Attribute data is not supported by this datasource
271+
/// Gets a specific feature from the data source by its <paramref name="rowId"/>
234272
/// </summary>
235-
/// <param name="rowId"></param>
236-
/// <returns></returns>
273+
/// <param name="rowId">The id of the row</param>
274+
/// <returns>A feature data row</returns>
237275
public FeatureDataRow GetFeature(uint rowId)
238276
{
239-
if (FilterDelegate == null || FilterDelegate(_features[(int) rowId]))
240-
return _features[(int) rowId];
277+
lock (_featuresLock)
278+
{
279+
if (rowId > _features.Rows.Count)
280+
return null;
281+
if (FilterDelegate != null && FilterDelegate(_features[(int) rowId]))
282+
return _features[(int) rowId];
283+
}
241284

242285
return null;
243286
}
@@ -248,15 +291,19 @@ public FeatureDataRow GetFeature(uint rowId)
248291
/// <returns>boundingbox</returns>
249292
public Envelope GetExtents()
250293
{
251-
if (_features.Rows.Count == 0)
252-
return null;
253-
var box = new Envelope();
254-
255-
foreach (FeatureDataRow fdr in _features.Rows)
256-
if (fdr.Geometry != null && !fdr.Geometry.IsEmpty)
257-
box.ExpandToInclude(fdr.Geometry.EnvelopeInternal);
294+
lock (_featuresLock)
295+
{
296+
if (_features.Rows.Count == 0)
297+
return null;
298+
var box = new Envelope();
258299

259-
return box;
300+
foreach (FeatureDataRow fdr in _features.Rows)
301+
{
302+
if (fdr.Geometry != null && !fdr.Geometry.IsEmpty)
303+
box.ExpandToInclude(fdr.Geometry.EnvelopeInternal);
304+
}
305+
return box;
306+
}
260307
}
261308

262309
/// <summary>
@@ -300,8 +347,8 @@ public bool IsOpen
300347
/// </summary>
301348
public int SRID
302349
{
303-
get { return _SRID; }
304-
set { _SRID = value; }
350+
get { return _srid; }
351+
set { _srid = value; }
305352
}
306353

307354
/// <summary>

‎SharpMap/Layers/TileLayer.cs‎

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -247,17 +247,17 @@ public override void Render(Graphics graphics, Map map)
247247
private void GetTileOnThread(object parameter)
248248
{
249249
object[] parameters = (object[])parameter;
250-
if (parameters.Length != 4) throw new ArgumentException("Three parameters expected");
250+
if (parameters.Length != 5) throw new ArgumentException("Five parameters expected");
251251
ITileProvider tileProvider = (ITileProvider)parameters[0];
252252
TileInfo tileInfo = (TileInfo)parameters[1];
253253
MemoryCache<Bitmap> bitmaps = (MemoryCache<Bitmap>)parameters[2];
254254
AutoResetEvent autoResetEvent = (AutoResetEvent)parameters[3];
255-
255+
bool retry = (bool) parameters[4];
256256

257-
byte[] bytes;
257+
var setEvent = true;
258258
try
259259
{
260-
bytes = tileProvider.GetTile(tileInfo);
260+
byte[] bytes = tileProvider.GetTile(tileInfo);
261261
Bitmap bitmap = new Bitmap(new MemoryStream(bytes));
262262
bitmaps.Add(tileInfo.Index, bitmap);
263263
if (_fileCache != null)
@@ -267,6 +267,12 @@ private void GetTileOnThread(object parameter)
267267
}
268268
catch (WebException ex)
269269
{
270+
if (retry)
271+
{
272+
GetTileOnThread(new object[] { tileProvider, tileInfo, bitmaps, autoResetEvent, false });
273+
setEvent = false;
274+
return;
275+
}
270276
if (_showErrorInTile)
271277
{
272278
//an issue with this method is that one an error tile is in the memory cache it will stay even
@@ -287,7 +293,7 @@ private void GetTileOnThread(object parameter)
287293
}
288294
finally
289295
{
290-
autoResetEvent.Set();
296+
if (setEvent) autoResetEvent.Set();
291297
}
292298
}
293299

‎SharpMap/SharpMap.csproj‎

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -221,7 +221,9 @@
221221
<Compile Include="Utilities\LeastSquaresTransform.cs" />
222222
<Compile Include="Utilities\LineOffset.cs" />
223223
<Compile Include="Utilities\Providers.cs" />
224+
<Compile Include="Utilities\Surrogates.Helper.cs" />
224225
<Compile Include="Utilities\Surrogates.cs" />
226+
<Compile Include="Utilities\Surrogates.Brushes.cs" />
225227
<Compile Include="Utilities\Transform.cs" />
226228
<Compile Include="Utilities\Version.cs" />
227229
<Compile Include="Utilities\Wfs\FeatureTypeInfo.cs" />
@@ -231,6 +233,7 @@
231233
<Compile Include="Utilities\Wfs\IXPathQueryManager.cs" />
232234
<Compile Include="Utilities\Wfs\OGCFilter_FE1_1_0.cs" />
233235
<Compile Include="Utilities\Wfs\PathNode.cs" />
236+
<Compile Include="Utilities\ReflectionUtility.cs" />
234237
<Compile Include="Utilities\Wfs\WFS1_0_0_XPathTextResources.cs" />
235238
<Compile Include="Utilities\Wfs\WFS1_1_0_XPathTextResources.cs" />
236239
<Compile Include="Utilities\Wfs\WFS_1_0_0_TextResources.cs" />

0 commit comments

Comments
 (0)

Back | FazBrowse Home | New Git URL