Буферная зона при выборе intersect.

0 голосов
спросил 20 Май, 08 от Igoryuha (1,340 баллов) в категории Программные продукты Esri
public void SelByLoc(IFeatureLayer pLayer0, IFeatureLayer pLayer1, double dblBufferDistance, string filter)

{

IGeometryCollection pGeoCollection;

pGeoCollection = new GeometryBagClass();

IGeometryCollection pGeometryBag;

pGeometryBag = new GeometryBagClass();

IFeatureCursor pCursor;

IFeatureLayer pFeatureLayer = pLayer1;

IFeatureLayer pFeatureLayer_1 = pLayer0;

IFeatureClass pIntersectFeatCls;

pIntersectFeatCls = pFeatureLayer_1.FeatureClass;

IFeatureClass pIntersectFeatCls_1;

pIntersectFeatCls_1 = pFeatureLayer.FeatureClass;

pCursor = pIntersectFeatCls.Search(null, false);

IFeatureCursor pCursor_1;

if (filter != "")

{

IQueryFilter QF = new QueryFilterClass();

QF.WhereClause = filter;

pCursor_1 = pIntersectFeatCls_1.Search(QF, false);

}

else

{

pCursor_1 = pIntersectFeatCls_1.Search(null, false);

}

IFeature pFeature;

pFeature = pCursor.NextFeature();

System.Object obj1 = Missing.Value;

System.Object obj2 = null;

while (pFeature != null){

pGeoCollection.AddGeometry(pFeature.ShapeCopy, ref obj1, ref obj2);

pFeature = pCursor.NextFeature();

}

pFeature = pCursor_1.NextFeature();

obj1 = Missing.Value;

obj2 = null;

while (pFeature != null)

{

pGeometryBag.AddGeometry(pFeature.ShapeCopy, ref obj1, ref obj2);

pFeature = pCursor_1.NextFeature();

}

ITopologicalOperator pTopologicalOperator;

pTopologicalOperator = (ITopologicalOperator)pGeometryBag;

IGeometry pAddGeometry;

pAddGeometry = pTopologicalOperator.Buffer(dblBufferDistance);

ISpatialFilter pSpatialFilter;

pSpatialFilter = new SpatialFilterClass();

pSpatialFilter.Geometry = pAddGeometry;

pSpatialFilter.GeometryField = "SHAPE";

pSpatialFilter.SpatialRel = esriSpatialRelEnum.esriSpatialRelIntersects;

IFeatureSelection pFSel = (IFeatureSelection)pFeatureLayer_1;

pFSel.SelectFeatures(pSpatialFilter, esriSelectionResultEnum.esriSelectionResultNew, false);

axMapControl1.ActiveView.Refresh();

}

вот процедура по которой я делаю выборку. в переменную dblBufferDistance указываю размер буферной зоны, но при значении 1 у меня буферная зона становится огромная (думаю она использует градусы в качестве ед. измерения). как мне перевести ее в метры?

10 Ответы

0 голосов
ответил 22 Май, 08 от Igoryuha (1,340 баллов)

Че то вяло как то в форуме поддержка :(

Темя актуальна :(
0 голосов
ответил 22 Май, 08 от Tatkis (2,420 баллов)
1. Какие единицы карты?
2. Почему тогда очень большая зона получается при 1, если это градусы?
3. Какие еще размеры буферной зоны пробовали вводить и что получали?
0 голосов
ответил 22 Май, 08 от Igoryuha (1,340 баллов)

Единицы карты - метры.

Зона получается при dblBufferDistance = 1 огромная от 60 000 метров до 110 000 м. пробовал вводить dblBufferDistance = dblBufferDistance * 0.000009; получалось вроде приближенно похожа, но не равномерный выбор. :(
0 голосов
ответил 22 Май, 08 от Alexander1 (32,520 баллов)
Единицы карты здесь ни при чём. Важны единицы проекции данных, которые буферизуются:

"The buffer distance is in the same units as the source shape that is being buffered."

http://edndoc.esri.com/arcobjects/9.2/ComponentHelp/esrigeometry/ITopologicalOperator_Buffer.htm
0 голосов
ответил 22 Май, 08 от Igoryuha (1,340 баллов)

вот код смены проекции:

//Устанавливаю 11 зону проекции
ISpatialReferenceFactory pSpatRefFact;
ISpatialReference pSpatRef;
IProjectedCoordinateSystem pPCS;
IGeographicCoordinateSystem pGCS;
IProjectedCoordinateSystemEdit pPCSEdit;
IProjection pProjection;
ILinearUnit pUnit;
pSpatRefFact = new SpatialReferenceEnvironmentClass();
pProjection = pSpatRefFact.CreateProjection(esriSRProjectionType.esriSRProjection_TransverseMercator.GetHashCode());
pUnit = (ILinearUnit)pSpatRefFact.CreateUnit(esriSRUnitType.esriSRUnit_Meter.GetHashCode());
pGCS = pSpatRefFact.CreateGeographicCoordinateSystem(esriSRGeoCSType.esriSRGeoCS_Pulkovo1942.GetHashCode());
IParameter[] aParamArray;
aParamArray = new IParameter[5];
aParamArray[0] = pSpatRefFact.CreateParameter(esriSRParameterType.esriSRParameter_ScaleFactor.GetHashCode());
aParamArray[0].Value = 0.9996;
aParamArray[1] = pSpatRefFact.CreateParameter(esriSRParameterType.esriSRParameter_CentralMeridian.GetHashCode());
aParamArray[1].Value = 69;//11 зона
aParamArray[2] = pSpatRefFact.CreateParameter(esriSRParameterType.esriSRParameter_CentralParallel.GetHashCode());
aParamArray[2].Value = 0;
aParamArray[3] = pSpatRefFact.CreateParameter(esriSRParameterType.esriSRParameter_FalseEasting.GetHashCode());
aParamArray[3].Value = 0;
aParamArray[4] = pSpatRefFact.CreateParameter(esriSRParameterType.esriSRParameter_FalseNorthing.GetHashCode());
aParamArray[4].Value = 1250000;
pPCS = new ProjectedCoordinateSystemClass();
pPCSEdit = (IProjectedCoordinateSystemEdit)pPCS;
object Parm1 = "Transverse_Mercator";
object Parm2 = "";
object Parm3 = "";
object Parm4 = "";
object Parm5 = "";
object Parm6 = pGCS;
object Parm7 = pUnit;
object Parm8 = pProjection;
object Parm9 = aParamArray;
pPCSEdit.Define(ref Parm1, ref Parm2, ref Parm3, ref Parm4, ref Parm5, ref Parm6, ref Parm7, ref Parm8, ref Parm9);
pSpatRef = pPCS;
axMapControl1.ActiveView.FocusMap.SpatialReference = pSpatRef;
axMapControl1.ActiveView.Refresh();
 
esriSRUnitType.esriSRUnit_Meter.GetHashCode() - это метры? подозреваю что нет :( т.к. HashCode
 
как узнать/установить ед.измерения в проекции?
0 голосов
ответил 22 Май, 08 от Alexander1 (32,520 баллов)
Что это за код? Какая проекция у исходных данных?
0 голосов
ответил 22 Май, 08 от Igoryuha (1,340 баллов)
Это код смены системы координат и проекции у датафрейма. у исходных стоит GCS_Pulkovo_1942.
0 голосов
ответил 22 Май, 08 от Alexander1 (32,520 баллов)
Я уже писал, что единицы карты/'датафрейма' не имеют значения.
А у GCS_Pulkovo_1942, насколько помню, единицы - градусы.
Т.е. dblBufferDistance задаётся в градусах.
0 голосов
ответил 22 Май, 08 от Igoryuha (1,340 баллов)
Тогда как перевести мне в метры? да, если я делаю через ArcMap c применением той же самой проекцией на датафрейм то буферная зона отображается правильно. Если же на датафрейм не применяю проекцию то буферная зона получается точ в точ как у меня. :)
0 голосов
ответил 22 Май, 08 от Alexander1 (32,520 баллов)
Добро пожаловать на сайт Вопросов и Ответов, где вы можете задавать вопросы по GIS тематике и получать ответы от других членов сообщества.
...