Создание feature class

0 голосов
спросил 30 Март, 04 от Гость (210,080 баллов) в категории Программные продукты Esri

Здравствуйте.

Возникла следующая проблема. Надо из ничего создать FeatureLayer с любым простеньким FeatureCLassом, скажем, полигончики с парой полей в базе (скажем, "имя", "фамилия"). Геобазу надо создать "на лету", представителя FeatureClass-а выдергивать неоткуда, так что тоже создавать. Координаты vertexов полигона хоть руками типа (10,11), (40, 29), (29,40)...

Пока что единственное, что получилось - создавать (заранее) базу геоданных с сохраненным туда единственным представителем FeatClass-а полигонного и потом, загружая в ВБ из базы FeatClass, создавать им новые фичи. Явно неоптимально плюс глючит временами.

Перерыл все samples, все что нашел - не по теме. Один из примеров подходит по постановке задачи, но созданный featureclass не работает (не создает новых feature).

Help!..

9 Ответы

0 голосов
ответил 30 Март, 04 от dios (5,300 баллов)
что касаеться featureclass

http://arcobjectsonline.esri.com/arcobjectsonline/samples/geodatabase/creating%20data/createworkspacefeatureclass.htm

далее
dim pFeature as IFeature
pFeature = FeatureClass.CreateFeature

pFeature.Value для полей
pFeature.Shape для шейпа

pFeature.Store для записи


0 голосов
ответил 30 Март, 04 от Owen (540 баллов)

Ну как создать с имеющимся FeatureClassом отдельные фичи - это отнюдь не то, что я спрашивал. Вот именно поименованный выше sample мне и генерил глючный featureclass. Правда, там были некоторые изменения типа Spatial Reference у меня вида

Dim pSpatRefFact As ISpatialReferenceFactory
Set pSpatRefFact = New SpatialReferenceEnvironment
Dim srWGS1984 As ISpatialReference
Set srWGS1984 = pSpatRefFact.CreateGeographicCoordinateSystem(esriSRGeoCS_WGS1984)

а не unknown, да fields какие-то свои приделаны. Вопрос-то был в создании всего сразу, начиная от workspacefactory. Мабуть, нельзя пользоваться ни access, ни OLEDB workspacefactor-ями?

Если можно, любой работающий sample. Просто с нуля взлет геобазы, внутри которой с нуля сделанный featureclass на основе полигона... Shape ему от ISegmentCollection я уж как-нибудь сам...

Заранее спасибо... ПНХ типа "читай samples", если можно, не постите - их я уже все читал-пробовал-комбинировал. Наверное я просто чего-то простого не понимаю...

ЗЫ Дмитрий, guest - это я же.

0 голосов
ответил 30 Март, 04 от Alexander1 (32,520 баллов)

В фолдере
C:\arcgis\arcexe83\ArcObjects Developer Kit\Samples\3D Analyst\Utilities
есть модуль dbUtil.bas. В нём можно найти все функции, которые тебе требуются:
- CreateAccessDatabase,
- CreateAccessFeatureClass,
- CreateFeatureClassDS и т.д. и т.п.
Возможно, для конкретного случая нужно будет модифицировать код. Ну дык для этого специалистов и держат на работе.

И ешё совет - поменьше П&Н&Х, а побольше работы с первоисточиками, в том числе и с Samples, которые тебе приводят, как пример.
На этом форуме никто никому ничем не обязан - ты просишь помочь, люди совершенно бесплатно пытаются сделать это. Т.е. и вести себя следует соответственно.

0 голосов
ответил 31 Март, 04 от dios (5,300 баллов)
Во во политкорректность в наше время дело редкое, даже когда пытаешься помочь людям.

За отсутствием времени прлагаю рабочий код на С++, на васик я думаю переделать не составит труда.

bool CreateShapeFile(_bstr_t sFolderName,
                                              _bstr_t sFileName,
                                              esriCore::esriGeometryType nType,
                                              esriCore::IFeatureClass ** ppFeatClass)
{
esriCore::IWorkspacePtr pWS;
esriCore::IFeatureWorkspacePtr pFWS;
esriCore::IWorkspaceFactoryPtr pWorkspaceFactory;
     pWorkspaceFactory.CreateInstance(esriCore::CLSID_ShapefileWorkspaceFactory);
     pWorkspaceFactory->OpenFromFile(sFolderName, 0, &pWS);
     pFWS = pWS;
esriCore::IFieldsPtr pFields;
esriCore::IFieldsEditPtr pFieldsEdit;
     pFields.CreateInstance(esriCore::CLSID_Fields);
pFieldsEdit = pFields;

esriCore::IFieldPtr pField;
esriCore::IFieldEditPtr pFieldEdit;

     pField.CreateInstance(esriCore::CLSID_Field);
pFieldEdit = pField;
     pFieldEdit->put_Name(_bstr_t(_T("Shape")));
     pFieldEdit->put_Type(esriCore::esriFieldTypeGeometry);

esriCore::IGeometryDefPtr pGeomDef;
esriCore::IGeometryDefEditPtr pGeomDefEdit;
     pGeomDef.CreateInstance(esriCore::CLSID_GeometryDef);
pGeomDefEdit = pGeomDef;
     esriCore::ISpatialReferencePtr pSR;
     pSR.CreateInstance(esriCore::CLSID_UnknownCoordinateSystem);
     pGeomDefEdit->put_GeometryType(nType);
     pGeomDefEdit->putref_SpatialReference(pSR);
     pFieldEdit->putref_GeometryDef(pGeomDef);
     pFieldsEdit->AddField(pField);
     pFWS->CreateFeatureClass(sFileName, pFields, NULL, NULL, esriCore::esriFTSimple, _bstr_t(_T("Shape")), _bstr_t(_T("")), ppFeatClass);
     return true;
}


это создание чистого шейпа без полей

плюс дабавляем поля

void AddField(esriCore::IFeatureClassPtr & pFeatClass,
                                   _bstr_t sName,
                                   esriCore::esriFieldType nType,
                                   long nLength,
                                   long nPrecision,
                                   long nScale)
{
esriCore::IFieldPtr pField;
esriCore::IFieldEditPtr pFieldEdit;
     pField.CreateInstance(esriCore::CLSID_Field);
pFieldEdit = pField;
     pFieldEdit->put_Name(sName);
     pFieldEdit->put_Type(nType);

if(nType == esriCore::esriFieldTypeString)
    pFieldEdit->put_Length(nLength);
else
{
    pFieldEdit->put_Length(0);
      pFieldEdit->put_Precision(nPrecision);
}

if(nType == esriCore::esriFieldTypeSingle || nType == esriCore::esriFieldTypeDouble)
      pFieldEdit->put_Scale(nScale);

     HRESULT hr = pFeatClass->AddField(pField);
}

0 голосов
ответил 14 Апр, 04 от Owen (540 баллов)

В порядке завершения дискуссии... Наверное, я просто нечетко сформулировал проблему... Которая как раз состояла, в частности, в том, что стандартные samples не вполне работали, падали и вообще...

Вдруг кто-то встретится с подобной проблемой, чтобы не биться с ней... При создании FeatureClass-а у его Spatial Reference (которую надо задавать при создании соответствующего поля у FeatureClass) должен быть дернут

pSpatialReference.SetDomain -A,A, -A,A

где А- некоторая константа (скажем, 99999999 или 9999). От этой константы напрямую зависит, до какой цифры, грубо говоря, округляются координаты у того, что будет выведено на экран.

 

Возможно, это очевидно любому продвинутому пользователю =) Мне вот, конечно, не очевидно. Я же не продвинутый...

Большое спасибо за помощь!

0 голосов
ответил 14 Апр, 04 от Alexander1 (32,520 баллов)


В порядке завершения дискуссии...

Ну, раз дискуссия завершена, значит всё ясно. image

0 голосов
ответил 15 Апр, 04 от dios (5,300 баллов)

Вдруг кто-то встретится с подобной проблемой, чтобы не биться с ней... При создании FeatureClass-а у его Spatial Reference (которую надо задавать при создании соответствующего поля у FeatureClass) должен быть дернут


pSpatialReference.SetDomain -A,A, -A,A



Вот это как раз дергать не обязательно. достаточно создать экземпляр pSpatialReference

DIM pSpatialReference as ISpatialReference
SET pSpatialReference new SpatialReference

и все
0 голосов
ответил 16 Апр, 04 от Owen (540 баллов)

И с этим экземпляром ничего не выйдет.

Не указан этот самый домен  - ничего вам не нарисуется в layer-е. И featureClass может не взлететь даже, а если и взлетит - у меня он на корню рубит ArcMap (access violaation-ом) при попытке полезть в source.

У меня все это выглядит примерно так

global const MaxExt = 9999

...

Dim pSpatRefFact As ISpatialReferenceFactory
Dim lWGS1984 As ISpatialReference
Set pSpatRefFact = New SpatialReferenceEnvironment
Set lWGS1984 = pSpatRefFact.CreateGeographicCoordinateSystem(esriSRGeoCS_WGS1984)
lWGS1984.SetDomain -MaxExt, MaxExt, -MaxExt, MaxExt

и все волшебным образом работает... Если потом featClass создавать с указанием этого вот SpatRef при задании егойных Fields

Забыл сказать, есть еще одна тонкость. Не знаю, может я просто криво писал, но далеко не для всех типов геометрии FeatCl создается. Только MultiPoint, Polygon, Polyline. esriGeometryPath, скажем, или там esriGeometryPoint рушат ArcMap (лицензионную 8.3) мгновенно и довольно-таки качественно.

0 голосов
ответил 16 Апр, 04 от Alexander1 (32,520 баллов)


... есть еще одна тонкость...

Owen, когда на этом форуме советуют посмотреть тот или иной пример, при этом по умолчанию предполагается знание некоторых основ. Вся необходимая информация имеется в ArcObjects Developer Help.
В данном случае (создание FeatureClass) советую перечитать следуюшие разделы:
- CreateFeatureClass Method
- Feature CoClass
- GeometryDef CoClass

В последнем из них, например, имеется объяснение т.н. "тонкостям":

"The actual geometry type is defined by the esriGeometryType enumeration, though currently only four values are acceptable with respect to GeometryDef objects: esriGeometryPoint, esriGeometryMultipoint, esriGeometryPolyline, and esriGeometryPolygon."

Достаточно ли такой подсказки, или есть необходимость более подробного объяснения по остальным вопросам?
Не стесняйся, спрашивай.

Добро пожаловать на сайт Вопросов и Ответов, где вы можете задавать вопросы по GIS тематике и получать ответы от других членов сообщества.
...