Line data Source code
1 : /******************************************************************************
2 : *
3 : * Project: OGR
4 : * Purpose: Implements OGRAVCLayer class. This is the base class for E00
5 : * and binary coverage layer implementations. It provides some base
6 : * layer operations, and methods for transforming between OGR
7 : * features, and the in memory structures of the AVC library.
8 : * Author: Frank Warmerdam, warmerdam@pobox.com
9 : *
10 : ******************************************************************************
11 : * Copyright (c) 2002, Frank Warmerdam <warmerdam@pobox.com>
12 : *
13 : * Permission is hereby granted, free of charge, to any person obtaining a
14 : * copy of this software and associated documentation files (the "Software"),
15 : * to deal in the Software without restriction, including without limitation
16 : * the rights to use, copy, modify, merge, publish, distribute, sublicense,
17 : * and/or sell copies of the Software, and to permit persons to whom the
18 : * Software is furnished to do so, subject to the following conditions:
19 : *
20 : * The above copyright notice and this permission notice shall be included
21 : * in all copies or substantial portions of the Software.
22 : *
23 : * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
24 : * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
25 : * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
26 : * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
27 : * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
28 : * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
29 : * DEALINGS IN THE SOFTWARE.
30 : ****************************************************************************/
31 :
32 : #include "ogr_avc.h"
33 : #include "cpl_conv.h"
34 : #include "cpl_string.h"
35 :
36 : /************************************************************************/
37 : /* OGRAVCLayer() */
38 : /************************************************************************/
39 :
40 14 : OGRAVCLayer::OGRAVCLayer(AVCFileType eSectionTypeIn, OGRAVCDataSource *poDSIn)
41 14 : : poFeatureDefn(nullptr), poDS(poDSIn), eSectionType(eSectionTypeIn)
42 : {
43 14 : }
44 :
45 : /************************************************************************/
46 : /* ~OGRAVCLayer() */
47 : /************************************************************************/
48 :
49 14 : OGRAVCLayer::~OGRAVCLayer()
50 :
51 : {
52 14 : if (m_nFeaturesRead > 0 && poFeatureDefn != nullptr)
53 : {
54 16 : CPLDebug("AVC", "%d features read on layer '%s'.",
55 8 : static_cast<int>(m_nFeaturesRead), poFeatureDefn->GetName());
56 : }
57 :
58 14 : if (poFeatureDefn != nullptr)
59 14 : poFeatureDefn->Release();
60 14 : }
61 :
62 : /************************************************************************/
63 : /* TestCapability() */
64 : /************************************************************************/
65 :
66 0 : int OGRAVCLayer::TestCapability(const char * /* pszCap */)
67 : {
68 0 : return FALSE;
69 : }
70 :
71 : /************************************************************************/
72 : /* SetupFeatureDefinition() */
73 : /************************************************************************/
74 :
75 14 : int OGRAVCLayer::SetupFeatureDefinition(const char *pszName)
76 :
77 : {
78 14 : bool bRet = false;
79 14 : switch (eSectionType)
80 : {
81 4 : case AVCFileARC:
82 : {
83 4 : poFeatureDefn = new OGRFeatureDefn(pszName);
84 4 : poFeatureDefn->Reference();
85 4 : poFeatureDefn->SetGeomType(wkbLineString);
86 :
87 8 : OGRFieldDefn oUserId("UserId", OFTInteger);
88 8 : OGRFieldDefn oFNode("FNODE_", OFTInteger);
89 8 : OGRFieldDefn oTNode("TNODE_", OFTInteger);
90 8 : OGRFieldDefn oLPoly("LPOLY_", OFTInteger);
91 8 : OGRFieldDefn oRPoly("RPOLY_", OFTInteger);
92 :
93 4 : poFeatureDefn->AddFieldDefn(&oUserId);
94 4 : poFeatureDefn->AddFieldDefn(&oFNode);
95 4 : poFeatureDefn->AddFieldDefn(&oTNode);
96 4 : poFeatureDefn->AddFieldDefn(&oLPoly);
97 4 : poFeatureDefn->AddFieldDefn(&oRPoly);
98 :
99 4 : bRet = true;
100 4 : break;
101 : }
102 :
103 2 : case AVCFilePAL:
104 : case AVCFileRPL:
105 : {
106 2 : poFeatureDefn = new OGRFeatureDefn(pszName);
107 2 : poFeatureDefn->Reference();
108 2 : poFeatureDefn->SetGeomType(wkbPolygon);
109 :
110 4 : OGRFieldDefn oArcIds("ArcIds", OFTIntegerList);
111 2 : poFeatureDefn->AddFieldDefn(&oArcIds);
112 :
113 2 : bRet = true;
114 2 : break;
115 : }
116 :
117 2 : case AVCFileCNT:
118 : {
119 2 : poFeatureDefn = new OGRFeatureDefn(pszName);
120 2 : poFeatureDefn->Reference();
121 2 : poFeatureDefn->SetGeomType(wkbPoint);
122 :
123 4 : OGRFieldDefn oLabelIds("LabelIds", OFTIntegerList);
124 2 : poFeatureDefn->AddFieldDefn(&oLabelIds);
125 :
126 2 : bRet = true;
127 2 : break;
128 : }
129 :
130 6 : case AVCFileLAB:
131 : {
132 6 : poFeatureDefn = new OGRFeatureDefn(pszName);
133 6 : poFeatureDefn->Reference();
134 6 : poFeatureDefn->SetGeomType(wkbPoint);
135 :
136 12 : OGRFieldDefn oValueId("ValueId", OFTInteger);
137 6 : poFeatureDefn->AddFieldDefn(&oValueId);
138 :
139 12 : OGRFieldDefn oPolyId("PolyId", OFTInteger);
140 6 : poFeatureDefn->AddFieldDefn(&oPolyId);
141 :
142 6 : bRet = true;
143 6 : break;
144 : }
145 :
146 0 : case AVCFileTXT:
147 : case AVCFileTX6:
148 : {
149 0 : poFeatureDefn = new OGRFeatureDefn(pszName);
150 0 : poFeatureDefn->Reference();
151 0 : poFeatureDefn->SetGeomType(wkbPoint);
152 :
153 0 : OGRFieldDefn oUserId("UserId", OFTInteger);
154 0 : poFeatureDefn->AddFieldDefn(&oUserId);
155 :
156 0 : OGRFieldDefn oText("Text", OFTString);
157 0 : poFeatureDefn->AddFieldDefn(&oText);
158 :
159 0 : OGRFieldDefn oHeight("Height", OFTReal);
160 0 : poFeatureDefn->AddFieldDefn(&oHeight);
161 :
162 0 : OGRFieldDefn oLevel("Level", OFTInteger);
163 0 : poFeatureDefn->AddFieldDefn(&oLevel);
164 :
165 0 : bRet = true;
166 0 : break;
167 : }
168 :
169 0 : default:
170 0 : poFeatureDefn = nullptr;
171 0 : break;
172 : }
173 :
174 14 : if (poFeatureDefn && poFeatureDefn->GetGeomFieldDefn(0))
175 : {
176 14 : poFeatureDefn->GetGeomFieldDefn(0)->SetSpatialRef(
177 14 : poDS->DSGetSpatialRef());
178 : }
179 :
180 14 : SetDescription(pszName);
181 14 : return bRet;
182 : }
183 :
184 : /************************************************************************/
185 : /* TranslateFeature() */
186 : /* */
187 : /* Translate the AVC structure for a feature to the */
188 : /* corresponding OGR definition. It is assumed that the passed */
189 : /* in feature is of a type matching the section type */
190 : /* established by SetupFeatureDefinition(). */
191 : /************************************************************************/
192 :
193 310 : OGRFeature *OGRAVCLayer::TranslateFeature(void *pAVCFeature)
194 :
195 : {
196 310 : m_nFeaturesRead++;
197 :
198 310 : switch (eSectionType)
199 : {
200 : /* ====================================================================
201 : */
202 : /* ARC */
203 : /* ====================================================================
204 : */
205 58 : case AVCFileARC:
206 : {
207 58 : AVCArc *psArc = static_cast<AVCArc *>(pAVCFeature);
208 :
209 : /* --------------------------------------------------------------------
210 : */
211 : /* Create feature. */
212 : /* --------------------------------------------------------------------
213 : */
214 58 : OGRFeature *poOGRFeature = new OGRFeature(GetLayerDefn());
215 58 : poOGRFeature->SetFID(psArc->nArcId);
216 :
217 : /* --------------------------------------------------------------------
218 : */
219 : /* Apply the line geometry. */
220 : /* --------------------------------------------------------------------
221 : */
222 58 : OGRLineString *poLine = new OGRLineString();
223 :
224 58 : poLine->setNumPoints(psArc->numVertices);
225 210 : for (int iVert = 0; iVert < psArc->numVertices; iVert++)
226 152 : poLine->setPoint(iVert, psArc->pasVertices[iVert].x,
227 152 : psArc->pasVertices[iVert].y);
228 :
229 58 : poLine->assignSpatialReference(GetSpatialRef());
230 58 : poOGRFeature->SetGeometryDirectly(poLine);
231 :
232 : /* --------------------------------------------------------------------
233 : */
234 : /* Apply attributes. */
235 : /* --------------------------------------------------------------------
236 : */
237 58 : poOGRFeature->SetField(0, psArc->nUserId);
238 58 : poOGRFeature->SetField(1, psArc->nFNode);
239 58 : poOGRFeature->SetField(2, psArc->nTNode);
240 58 : poOGRFeature->SetField(3, psArc->nLPoly);
241 58 : poOGRFeature->SetField(4, psArc->nRPoly);
242 58 : return poOGRFeature;
243 : }
244 :
245 : /* ====================================================================
246 : */
247 : /* PAL (Polygon) */
248 : /* RPL (Region) */
249 : /* ====================================================================
250 : */
251 12 : case AVCFilePAL:
252 : case AVCFileRPL:
253 : {
254 12 : AVCPal *psPAL = static_cast<AVCPal *>(pAVCFeature);
255 :
256 : /* --------------------------------------------------------------------
257 : */
258 : /* Create feature. */
259 : /* --------------------------------------------------------------------
260 : */
261 12 : OGRFeature *poOGRFeature = new OGRFeature(GetLayerDefn());
262 12 : poOGRFeature->SetFID(psPAL->nPolyId);
263 :
264 : /* --------------------------------------------------------------------
265 : */
266 : /* Apply attributes. */
267 : /* --------------------------------------------------------------------
268 : */
269 : // Setup ArcId list.
270 : int *panArcs =
271 12 : static_cast<int *>(CPLMalloc(sizeof(int) * psPAL->numArcs));
272 57 : for (int i = 0; i < psPAL->numArcs; i++)
273 45 : panArcs[i] = psPAL->pasArcs[i].nArcId;
274 12 : poOGRFeature->SetField(0, psPAL->numArcs, panArcs);
275 12 : CPLFree(panArcs);
276 :
277 12 : return poOGRFeature;
278 : }
279 :
280 : /* ====================================================================
281 : */
282 : /* CNT (Centroid) */
283 : /* ====================================================================
284 : */
285 0 : case AVCFileCNT:
286 : {
287 0 : AVCCnt *psCNT = (AVCCnt *)pAVCFeature;
288 :
289 : /* --------------------------------------------------------------------
290 : */
291 : /* Create feature. */
292 : /* --------------------------------------------------------------------
293 : */
294 0 : OGRFeature *poOGRFeature = new OGRFeature(GetLayerDefn());
295 0 : poOGRFeature->SetFID(psCNT->nPolyId);
296 :
297 : /* --------------------------------------------------------------------
298 : */
299 : /* Apply Geometry */
300 : /* --------------------------------------------------------------------
301 : */
302 0 : OGRPoint *poPoint = new OGRPoint(psCNT->sCoord.x, psCNT->sCoord.y);
303 0 : poPoint->assignSpatialReference(GetSpatialRef());
304 0 : poOGRFeature->SetGeometryDirectly(poPoint);
305 :
306 : /* --------------------------------------------------------------------
307 : */
308 : /* Apply attributes. */
309 : /* --------------------------------------------------------------------
310 : */
311 0 : poOGRFeature->SetField(0, psCNT->numLabels, psCNT->panLabelIds);
312 :
313 0 : return poOGRFeature;
314 : }
315 :
316 : /* ====================================================================
317 : */
318 : /* LAB (Label) */
319 : /* ====================================================================
320 : */
321 240 : case AVCFileLAB:
322 : {
323 240 : AVCLab *psLAB = static_cast<AVCLab *>(pAVCFeature);
324 :
325 : /* --------------------------------------------------------------------
326 : */
327 : /* Create feature. */
328 : /* --------------------------------------------------------------------
329 : */
330 240 : OGRFeature *poOGRFeature = new OGRFeature(GetLayerDefn());
331 240 : poOGRFeature->SetFID(psLAB->nValue);
332 :
333 : /* --------------------------------------------------------------------
334 : */
335 : /* Apply Geometry */
336 : /* --------------------------------------------------------------------
337 : */
338 : OGRPoint *poPoint =
339 240 : new OGRPoint(psLAB->sCoord1.x, psLAB->sCoord1.y);
340 240 : poPoint->assignSpatialReference(GetSpatialRef());
341 240 : poOGRFeature->SetGeometryDirectly(poPoint);
342 :
343 : /* --------------------------------------------------------------------
344 : */
345 : /* Apply attributes. */
346 : /* --------------------------------------------------------------------
347 : */
348 240 : poOGRFeature->SetField(0, psLAB->nValue);
349 240 : poOGRFeature->SetField(1, psLAB->nPolyId);
350 :
351 240 : return poOGRFeature;
352 : }
353 :
354 : /* ====================================================================
355 : */
356 : /* TXT/TX6 (Text) */
357 : /* ====================================================================
358 : */
359 0 : case AVCFileTXT:
360 : case AVCFileTX6:
361 : {
362 0 : AVCTxt *psTXT = static_cast<AVCTxt *>(pAVCFeature);
363 :
364 : /* --------------------------------------------------------------------
365 : */
366 : /* Create feature. */
367 : /* --------------------------------------------------------------------
368 : */
369 0 : OGRFeature *poOGRFeature = new OGRFeature(GetLayerDefn());
370 0 : poOGRFeature->SetFID(psTXT->nTxtId);
371 :
372 : /* --------------------------------------------------------------------
373 : */
374 : /* Apply Geometry */
375 : /* --------------------------------------------------------------------
376 : */
377 0 : if (psTXT->numVerticesLine > 0)
378 : {
379 0 : OGRPoint *poPoint = new OGRPoint(psTXT->pasVertices[0].x,
380 0 : psTXT->pasVertices[0].y);
381 0 : poPoint->assignSpatialReference(GetSpatialRef());
382 0 : poOGRFeature->SetGeometryDirectly(poPoint);
383 : }
384 :
385 : /* --------------------------------------------------------------------
386 : */
387 : /* Apply attributes. */
388 : /* --------------------------------------------------------------------
389 : */
390 0 : poOGRFeature->SetField(0, psTXT->nUserId);
391 0 : poOGRFeature->SetField(1, reinterpret_cast<char *>(psTXT->pszText));
392 0 : poOGRFeature->SetField(2, psTXT->dHeight);
393 0 : poOGRFeature->SetField(3, psTXT->nLevel);
394 :
395 0 : return poOGRFeature;
396 : }
397 :
398 0 : default:
399 0 : return nullptr;
400 : }
401 : }
402 :
403 : /************************************************************************/
404 : /* MatchesSpatialFilter() */
405 : /************************************************************************/
406 :
407 268 : bool OGRAVCLayer::MatchesSpatialFilter(void *pFeature)
408 :
409 : {
410 268 : if (m_poFilterGeom == nullptr)
411 268 : return true;
412 :
413 0 : switch (eSectionType)
414 : {
415 : /* ====================================================================
416 : */
417 : /* ARC */
418 : /* */
419 : /* Check each line segment for possible intersection. */
420 : /* ====================================================================
421 : */
422 0 : case AVCFileARC:
423 : {
424 0 : AVCArc *psArc = static_cast<AVCArc *>(pFeature);
425 :
426 0 : for (int iVert = 0; iVert < psArc->numVertices - 1; iVert++)
427 : {
428 0 : AVCVertex *psV1 = psArc->pasVertices + iVert;
429 0 : AVCVertex *psV2 = psArc->pasVertices + iVert + 1;
430 :
431 0 : if ((psV1->x < m_sFilterEnvelope.MinX &&
432 0 : psV2->x < m_sFilterEnvelope.MinX) ||
433 0 : (psV1->x > m_sFilterEnvelope.MaxX &&
434 0 : psV2->x > m_sFilterEnvelope.MaxX) ||
435 0 : (psV1->y < m_sFilterEnvelope.MinY &&
436 0 : psV2->y < m_sFilterEnvelope.MinY) ||
437 0 : (psV1->y > m_sFilterEnvelope.MaxY &&
438 0 : psV2->y > m_sFilterEnvelope.MaxY))
439 : /* This segment is completely outside extents */;
440 : else
441 0 : return true;
442 : }
443 :
444 0 : return false;
445 : }
446 :
447 : /* ====================================================================
448 : */
449 : /* PAL (Polygon) */
450 : /* RPL (Region) */
451 : /* */
452 : /* Check against the polygon bounds stored in the PAL. */
453 : /* ====================================================================
454 : */
455 0 : case AVCFilePAL:
456 : case AVCFileRPL:
457 : {
458 0 : AVCPal *psPAL = (AVCPal *)pFeature;
459 :
460 0 : if (psPAL->sMin.x > m_sFilterEnvelope.MaxX ||
461 0 : psPAL->sMax.x < m_sFilterEnvelope.MinX ||
462 0 : psPAL->sMin.y > m_sFilterEnvelope.MaxY ||
463 0 : psPAL->sMax.y < m_sFilterEnvelope.MinY)
464 0 : return false;
465 : else
466 0 : return true;
467 : }
468 :
469 : /* ====================================================================
470 : */
471 : /* CNT (Centroid) */
472 : /* ====================================================================
473 : */
474 0 : case AVCFileCNT:
475 : {
476 0 : AVCCnt *psCNT = static_cast<AVCCnt *>(pFeature);
477 :
478 0 : if (psCNT->sCoord.x < m_sFilterEnvelope.MinX ||
479 0 : psCNT->sCoord.x > m_sFilterEnvelope.MaxX ||
480 0 : psCNT->sCoord.y < m_sFilterEnvelope.MinY ||
481 0 : psCNT->sCoord.y > m_sFilterEnvelope.MaxY)
482 0 : return false;
483 : else
484 0 : return true;
485 : }
486 :
487 : /* ====================================================================
488 : */
489 : /* LAB (Label) */
490 : /* ====================================================================
491 : */
492 0 : case AVCFileLAB:
493 : {
494 0 : AVCLab *psLAB = (AVCLab *)pFeature;
495 :
496 0 : if (psLAB->sCoord1.x < m_sFilterEnvelope.MinX ||
497 0 : psLAB->sCoord1.x > m_sFilterEnvelope.MaxX ||
498 0 : psLAB->sCoord1.y < m_sFilterEnvelope.MinY ||
499 0 : psLAB->sCoord1.y > m_sFilterEnvelope.MaxY)
500 0 : return false;
501 : else
502 0 : return true;
503 : }
504 :
505 : /* ====================================================================
506 : */
507 : /* TXT/TX6 (Text) */
508 : /* ====================================================================
509 : */
510 0 : case AVCFileTXT:
511 : case AVCFileTX6:
512 : {
513 0 : AVCTxt *psTXT = static_cast<AVCTxt *>(pFeature);
514 :
515 0 : if (psTXT->numVerticesLine == 0)
516 0 : return true;
517 :
518 0 : if (psTXT->pasVertices[0].x < m_sFilterEnvelope.MinX ||
519 0 : psTXT->pasVertices[0].x > m_sFilterEnvelope.MaxX ||
520 0 : psTXT->pasVertices[0].y < m_sFilterEnvelope.MinY ||
521 0 : psTXT->pasVertices[0].y > m_sFilterEnvelope.MaxY)
522 0 : return false;
523 :
524 0 : return true;
525 : }
526 :
527 0 : default:
528 0 : return true;
529 : }
530 : }
531 :
532 : /************************************************************************/
533 : /* AppendTableDefinition() */
534 : /* */
535 : /* Add fields to this layers feature definition based on the */
536 : /* definition from the coverage. */
537 : /************************************************************************/
538 :
539 6 : bool OGRAVCLayer::AppendTableDefinition(AVCTableDef *psTableDef)
540 :
541 : {
542 32 : for (int iField = 0; iField < psTableDef->numFields; iField++)
543 : {
544 26 : AVCFieldInfo *psFInfo = psTableDef->pasFieldDef + iField;
545 : char szFieldName[128];
546 :
547 : /* Strip off white space */
548 26 : strcpy(szFieldName, psFInfo->szName);
549 26 : if (strstr(szFieldName, " ") != nullptr)
550 26 : *(strstr(szFieldName, " ")) = '\0';
551 :
552 26 : OGRFieldDefn oFDefn(szFieldName, OFTInteger);
553 :
554 26 : if (psFInfo->nIndex < 0)
555 0 : continue;
556 :
557 : // Skip FNODE#, TNODE#, LPOLY# and RPOLY# from AAT table.
558 26 : if (eSectionType == AVCFileARC && iField < 4)
559 0 : continue;
560 :
561 26 : oFDefn.SetWidth(psFInfo->nFmtWidth);
562 :
563 26 : if (psFInfo->nType1 * 10 == AVC_FT_DATE ||
564 26 : psFInfo->nType1 * 10 == AVC_FT_CHAR)
565 2 : oFDefn.SetType(OFTString);
566 :
567 24 : else if (psFInfo->nType1 * 10 == AVC_FT_FIXINT ||
568 24 : psFInfo->nType1 * 10 == AVC_FT_BININT)
569 12 : oFDefn.SetType(OFTInteger);
570 :
571 12 : else if (psFInfo->nType1 * 10 == AVC_FT_FIXNUM ||
572 12 : psFInfo->nType1 * 10 == AVC_FT_BINFLOAT)
573 : {
574 12 : oFDefn.SetType(OFTReal);
575 12 : if (psFInfo->nFmtPrec > 0)
576 12 : oFDefn.SetPrecision(psFInfo->nFmtPrec);
577 : }
578 :
579 26 : poFeatureDefn->AddFieldDefn(&oFDefn);
580 : }
581 6 : return TRUE;
582 : }
583 :
584 : /************************************************************************/
585 : /* TranslateTableFields() */
586 : /************************************************************************/
587 :
588 252 : bool OGRAVCLayer::TranslateTableFields(OGRFeature *poFeature, int nFieldBase,
589 : AVCTableDef *psTableDef,
590 : AVCField *pasFields)
591 :
592 : {
593 252 : int iOutField = nFieldBase;
594 :
595 1500 : for (int iField = 0; iField < psTableDef->numFields; iField++)
596 : {
597 1248 : AVCFieldInfo *psFInfo = psTableDef->pasFieldDef + iField;
598 1248 : int nType = psFInfo->nType1 * 10;
599 :
600 1248 : if (psFInfo->nIndex < 0)
601 0 : continue;
602 :
603 : // Skip FNODE#, TNODE#, LPOLY# and RPOLY# from AAT table.
604 1248 : if (eSectionType == AVCFileARC && iField < 4)
605 0 : continue;
606 :
607 1248 : if (nType == AVC_FT_DATE || nType == AVC_FT_CHAR ||
608 1008 : nType == AVC_FT_FIXINT || nType == AVC_FT_FIXNUM)
609 : {
610 240 : if (nType == AVC_FT_CHAR)
611 : {
612 : /* Remove trailing spaces in char fields */
613 : size_t nLen =
614 240 : strlen(reinterpret_cast<char *>(pasFields[iField].pszStr));
615 4080 : while (nLen > 0 && pasFields[iField].pszStr[nLen - 1] == ' ')
616 3840 : nLen--;
617 240 : pasFields[iField].pszStr[nLen] = '\0';
618 : }
619 240 : poFeature->SetField(iOutField++, reinterpret_cast<char *>(
620 240 : pasFields[iField].pszStr));
621 : }
622 1008 : else if (nType == AVC_FT_BININT && psFInfo->nSize == 4)
623 : {
624 504 : poFeature->SetField(iOutField++, pasFields[iField].nInt32);
625 : }
626 504 : else if (nType == AVC_FT_BININT && psFInfo->nSize == 2)
627 : {
628 0 : poFeature->SetField(iOutField++, pasFields[iField].nInt16);
629 : }
630 504 : else if (nType == AVC_FT_BINFLOAT && psFInfo->nSize == 4)
631 : {
632 504 : poFeature->SetField(iOutField++, pasFields[iField].fFloat);
633 : }
634 0 : else if (nType == AVC_FT_BINFLOAT && psFInfo->nSize == 8)
635 : {
636 0 : poFeature->SetField(iOutField++, pasFields[iField].dDouble);
637 : }
638 : else
639 : {
640 0 : CPLAssert(false);
641 : return false;
642 : }
643 : }
644 :
645 252 : return true;
646 : }
|