5 votos

<html><p>Polígono puntos a Polilínea</p></html>

Estoy tratando de crear una polilínea a partir de los puntos que consulto de un polígono. Tengo un polígono y obtengo sus bordes, los convierto en segmentos y luego uso QueryNormal para obtener el punto medio de ese borde. Obtengo 2 puntos diferentes de 2 bordes, quiero crear una curva a partir de esos 2 puntos, no una línea recta, sino seguir el camino del polígono de un punto a otro. Las imágenes a continuación explican mejor las cosas. Intenté usar el operador topológico y cortar pero eso no hace lo que quiero, intenté usar el polygon.Split() pero tampoco me da lo que quiero. ¿Es posible dividir un polígono basado en puntos?

Aquí está lo que quiero, tengo un polígono y quiero usar los puntos para crear la curva

Nuevas ediciones:- Después de poder obtener la subcurva usando las distancias de 2 puntos de entrada, siempre me está dando la parte más larga del poliCurva, aquí hay una imagen de lo que está haciendo, donde quiero el camino corto según la imagen de arriba. introduce la descripción de la imagen aquí

0 votos

¿Si ya tienes los puntos, qué te impide crear una polilínea?

0 votos

Creando una polilínea a partir de 2 puntos dibujará una línea recta entre esos 2 puntos, lo cual no es lo que estoy buscando. Sin embargo, creo que descubrí cómo hacerlo usando el método SplitAtDistance(), que básicamente me permite comenzar a contar los segmentos desde mi punto de inicio de entrada hasta el punto final y crear una polilínea a partir de esos múltiples segmentos. Estoy probando eso hoy.

3voto

John Kramlich Puntos 286

Así es como lo haría:

  • Crea tus dos puntos
  • Convierte el polígono en ICurve
  • Utiliza el método QueryPointAndDistance de ICurve y obtén el valor DistanceAlongCurve para cada punto
  • Utiliza el método GetSubcurve de ICurve para extraer la curva roja que has identificado en tu imagen.

0 votos

Logré resolverlo dividiendo el polígono en los puntos creados a lo largo del polígono y luego obtener esos segmentos que fueron divididos y crear una curva a partir de ellos. Sin embargo, prefiero tu solución ya que me da la distancia a lo largo del polígono. Pensé que el método insertaba puntos a ciertas distancias, ¡no sabía que en realidad devolvía la distancia de los puntos :). Gracias

0 votos

¿Es posible controlar la dirección de la curva que obtengo del método GetSubCurve()? CASI SIEMPRE me está dando la parte larga de la curva, por lo que en mi caso, en la parte superior me está dando la parte larga de la curva, independientemente de cuál sea el punto de inicio, siempre me está dando la subcurva larga cuando quiero la más corta :). ¿alguna idea?

0 votos

Eso me sugeriría que los polígonos no se están creando de manera consistente. ¿Estos polígonos se construyen fuera del entorno de ArcMap? Intenta ejecutar la herramienta de verificación de geometría y de reparación en el conjunto de datos. Tu código no debería estar funcionando bien para algunos y mal para otros. Si estuviera mal, debería ser consistentemente incorrecto...

2voto

Wolfi Puntos 16

He resuelto el problema, obteniendo el anillo exterior de los polígonos, la interfaz IRing tiene el método GetSubcurveEx, este método es perfecto para mi caso ya que puedo especificar en qué dirección quiero que siga la subcurva. Puedo especificar en sentido horario o antihorario, así que obtuve ambas direcciones y simplemente elegí la más corta. Así es como lo hice.

       ExteriorPolygonRing.QueryPointAndDistance(esriSegmentExtension.esriNoExtension, puntoTerminalEnParcela, false, outPoint, ref pointDistance, ref fromcr, ref rightSide);
       ExteriorPolygonRing.QueryPointAndDistance(esriSegmentExtension.esriNoExtension, puntoDeBordeDeAgujeroManualParcela, false, outPoint2, ref pointDistance2, ref fromcr2, ref rightSide);
        var caminoEnSentidoHorario = polyRing.GetSubcurveEx(pointDistance, pointDistance2, false, true, true);
        var caminoEnSentidoAntihorario = polyRing.GetSubcurveEx(pointDistance, pointDistance2, false, false, true);

        if (caminoEnSentidoHorario.Length < caminoEnSentidoAntihorario.Length) {
            return caminoEnSentidoHorario;
        }
        return caminoEnSentidoAntihorario;
    }

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X