나는 다중 부분으로 나뉘어 진 폴리 라인을 가지고 있으며이 부분들은 정점의 ID가 폴리 라인의 플로팅을 따르지 않도록 잘 정렬되어 있지 않습니다.
이 폴리 라인은 버스 라인을 나타내는 것이며 버스의 주행 방식에 따라 플로팅이 필요합니다. 이 폴리 라인의 여러 부분을 병합하는 방법을 알고 싶습니다.
나는 이미 단일 파트, 유니온, 병합 등의 멀티 파트뿐만 아니라 스플릿 및 언 스플릿을 시도했지만 아무도 원하는 결과를 얻지 못했습니다.
나는 다중 부분으로 나뉘어 진 폴리 라인을 가지고 있으며이 부분들은 정점의 ID가 폴리 라인의 플로팅을 따르지 않도록 잘 정렬되어 있지 않습니다.
이 폴리 라인은 버스 라인을 나타내는 것이며 버스의 주행 방식에 따라 플로팅이 필요합니다. 이 폴리 라인의 여러 부분을 병합하는 방법을 알고 싶습니다.
나는 이미 단일 파트, 유니온, 병합 등의 멀티 파트뿐만 아니라 스플릿 및 언 스플릿을 시도했지만 아무도 원하는 결과를 얻지 못했습니다.
답변:
태그에서 ArcGIS 10을 실행하고 있음을 알았습니다. 비슷한 작업에 다음 방법을 사용했습니다.
2) 사용 비 분할
이 작업을 수행하려면 (즉, 올바른 순서로 선을 갖도록) 선을 구성 끝점으로 나눈 다음 속성에 따라 방향을 변경해야합니다 (예 : 1 = 시작, 2 = 끝) -이것을 사용하여 다른 점만 조건부로 연결할 수 있습니다 (1 + 2 인 경우 연결선 만들기).
IDE로 작업하는 경우이 작업을 수행하는 코드는 상당히 길지만 특정 질문이 있으면 최선을 다해 도와 드리겠습니다.
AV 3.x 및 Avenue를 사용하여 꽤 오래 전과 똑같이해야했습니다. 코드를 간단히 살펴 보았지만 찾을 수 없었습니다. 올바르게 기억한다면 논리는 다음과 같습니다. (버스 정류장과 터미널을 다른 점 모양 파일로 사용하여 시작 부분과 끝 부분을 결정할 수있었습니다) :
첫 번째 부분을 얻으려면 :
2a. 터미널을 시작하기에 가장 가까운 부분을 얻으십시오
2b. 이 부분의 시작 및 끝 노드와 시작 터미널까지의 거리를 가져옵니다. 시작 정점이 가장 가까운 것이라면이 부분을 '정렬 된 폴리 라인'에 추가하십시오. 끝이 FLIP이면 추가하십시오.
... 또는 그런 것! :-)
이것이 당신에게 의미가 있는지 알려 주시면 원래 Avenue Avenue 코드를 찾으십시오.
나는 비슷한 프로젝트에서 ArcObjects를 사용했습니다. 내 목표는 두 개의 짧은 폴리 라인을 단일 폴리 라인으로 만드는 시작점이 다른 두 개의 폴리 라인을 연결하는 것이 었습니다. 내 프로세스는 다음과 같습니다
1. Dictionary<PointKey, FeatureDataList> polylineDictionary;
두 클래스 모두 "Equals"및 "GetHashCode"메소드를 대체합니다.
Dictionary<PointKey, FeatureDataList> ToPointDictionary;
Dictionary<PointKey, FeatureDataList> FromPointDictionary;
public void CreateDictionary(IFeatureLayer featureLayer)
{
var featureFunctionality = new FeatureFunctionality();
List<IFeature> features = GetAllFeatures(featureLayer.FeatureClass);
foreach (var feature in features)
{
IPolyline polyline = GetPolylineFromFeature(feature);
AddFeatureInDictionary(ToPointDictionary, feature, polyline.ToPoint);
AddFeatureInDictionary(FromPointDictionary, feature, polyline.FromPoint);
}
}
void AddFeatureInDictionary(Dictionary<PointKey, FeatureDataList> polylineDictionary, IFeature feature, IPoint point)
{
FeatureDataList featureDataList;
PointKey key = PointKey.GetKey(point);
if (!polylineDictionary.ContainsKey(key))
{
featureDataList = new FeatureDataList();
featureDataList.Add(feature);
polylineDictionary.Add(key, featureDataList);
}
else
{
featureDataList = polylineDictionary[key];
featureDataList.Add(feature);
}
}
이 과정을 통해 두 개의 사전을 만들었습니다. 사전을 작성한 후 두 사전에 동일한 점이 있고 두 사전 모두에 해당 키에 피쳐 목록에 피쳐가 하나만 있는지 확인한 다음이 두 폴리 라인으로 새 폴리 라인을 작성하고 두 개의 짧은 폴리 라인을 삭제합니다.
두 개의 폴리 라인을 하나로 결합하려면 :
private IPolyline GetJoinedPolylineFromFeatures(List<IFeature> features)
{
IPolyline newPolyline = null;
if (features.Count == 2)
{
IPolyline polyline1 = feature1.Shape as IPolyline;
IPolyline polyline2 = feature2.Shape as IPolyline;
if (PointKey.GetKey(polyline1.ToPoint).Equals(PointKey.GetKey(polyline2.FromPoint)))
{
var topoOperator2 = polyline1 as ITopologicalOperator2;
if (topoOperator2 != null)
newPolyline = topoOperator2.Union(polyline2) as IPolyline;
}
else if (PointKey.GetKey(polyline1.FromPoint).Equals(PointKey.GetKey(polyline2.ToPoint)))
{
var topoOperator2 = polyline2 as ITopologicalOperator2;
if (topoOperator2 != null)
newPolyline = topoOperator2.Union(polyline1) as IPolyline;
}
}
return newPolyline;
}
"Reshape Feature"도구를 사용하여 버스 경로를 업데이트했기 때문에 정확히 같은 문제가 발생했습니다. 멀티 파트 기능이 일치하지 않기 때문에 디졸브, 병합 및 분리가 작동하지 않았습니다.
지금까지 이것을 눈치 채지 못했다면, 멀티 파트 피처간에 일치해야하는 정점을 자세히 살펴보십시오. 필요에 따라 확장, 트림 또는 모양을 변경 한 다음 위에 언급 된 도구를 사용하십시오.