c#检查多边形内是否存在点

时间:2015-10-19 07:22:46

标签: javascript c# google-maps google-maps-api-3 geometry

您好我正在寻找一种方法来检查我的c#代码中多边形内是否存在一个点。我使用 Google地图几何图书馆成功地使用javascript作为{{3现在我需要从c#code中做同样的事情。谷歌提供任何web服务或dll同样的吗?

如果没有,任何人都可以出于同样的目的建议任何第三方api或插件。我已经尝试了一些第三方项目,但没有发现任何一个像Google地图几何图书馆一样提供准确性

2 个答案:

答案 0 :(得分:0)

这个问题对于编程来说是微不足道的。

为简化起见,首先假设测试点位于原点。您需要检查正X轴与多边形边的交点数的奇偶校验。

Severe:   net.sf.jasperreports.engine.JRException: Error printing report.
at net.sf.jasperreports.engine.print.JRPrinterAWT.printPages(JRPrinterAWT.java:214)
at net.sf.jasperreports.engine.JasperPrintManager.print(JasperPrintManager.java:242)
at net.sf.jasperreports.engine.JasperPrintManager.print(JasperPrintManager.java:129)
at net.sf.jasperreports.engine.JasperPrintManager.printReport(JasperPrintManager.java:326)
at Reports.Closing_Report_Report.doGet(Closing_Report_Report.java:73)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:687)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:790)
at org.apache.catalina.core.StandardWrapper.service(StandardWrapper.java:1682)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:318)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:160)
at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:734)
at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:673)
at com.sun.enterprise.web.WebPipeline.invoke(WebPipeline.java:99)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:174)
at org.apache.catalina.connector.CoyoteAdapter.doService(CoyoteAdapter.java:357)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:260)
at com.sun.enterprise.v3.services.impl.ContainerMapper.service(ContainerMapper.java:188)
at org.glassfish.grizzly.http.server.HttpHandler.runService(HttpHandler.java:191)
at org.glassfish.grizzly.http.server.HttpHandler.doHandle(HttpHandler.java:168)
at org.glassfish.grizzly.http.server.HttpServerFilter.handleRead(HttpServerFilter.java:189)
at org.glassfish.grizzly.filterchain.ExecutorResolver$9.execute(ExecutorResolver.java:119)
at org.glassfish.grizzly.filterchain.DefaultFilterChain.executeFilter(DefaultFilterChain.java:288)
at org.glassfish.grizzly.filterchain.DefaultFilterChain.executeChainPart(DefaultFilterChain.java:206)
at org.glassfish.grizzly.filterchain.DefaultFilterChain.execute(DefaultFilterChain.java:136)
at org.glassfish.grizzly.filterchain.DefaultFilterChain.process(DefaultFilterChain.java:114)
at org.glassfish.grizzly.ProcessorExecutor.execute(ProcessorExecutor.java:77)
at org.glassfish.grizzly.nio.transport.TCPNIOTransport.fireIOEvent(TCPNIOTransport.java:838)
at org.glassfish.grizzly.strategies.AbstractIOStrategy.fireIOEvent(AbstractIOStrategy.java:113)
at org.glassfish.grizzly.strategies.WorkerThreadIOStrategy.run0(WorkerThreadIOStrategy.java:115)
at org.glassfish.grizzly.strategies.WorkerThreadIOStrategy.access$100(WorkerThreadIOStrategy.java:55)
at org.glassfish.grizzly.strategies.WorkerThreadIOStrategy$WorkerThreadRunnable.run(WorkerThreadIOStrategy.java:135)
at org.glassfish.grizzly.threadpool.AbstractThreadPool$Worker.doWork(AbstractThreadPool.java:564)
at org.glassfish.grizzly.threadpool.AbstractThreadPool$Worker.run(AbstractThreadPool.java:544)
at java.lang.Thread.run(Thread.java:745)
Caused by: java.awt.HeadlessException
    at sun.awt.windows.WPrinterJob.printDialog(WPrinterJob.java:576)
    at net.sf.jasperreports.engine.print.JRPrinterAWT.printPages(JRPrinterAWT.java:198)
    ... 33 more

将索引模数为Inside= False for k in in 0..N-1: if (Y[k] > 0) != (Y[k+1] > 0): # The edge straddles the X-axis... if (Y[k] > 0) == (Y[k] * X[k+1] > Y[k+1] * X[k]): # ... and intersects it on the positive side Inside= not Inside ,以便N

对于不在原点的测试点,只需翻译所有多边形顶点的坐标即可,而无需实际修改多边形。

enter image description here

如果多边形穿过180°子午线,则重复经度±360°的多边形点测试。

答案 1 :(得分:0)

private static bool EstaDentroDeZona(double latitudActual, double longitudActual, List<PuntoPorZona> listaPuntosPorZona)
    {
        Punto<double> vector1 = new Punto<double>();
        Punto<double> vector2 = new Punto<double>();



        int i = 0;
        double a = 0;

        for (i = 0; i < listaPuntosPorZona.Count - 1; i++)
        {
            vector1.X = Convert.ToDouble(listaPuntosPorZona[i].Latitud) - latitudActual;
            vector1.Y = Convert.ToDouble(listaPuntosPorZona[i].Longitud) - longitudActual;
            vector2.X = Convert.ToDouble(listaPuntosPorZona[i + 1].Latitud) - latitudActual;
            vector2.Y = Convert.ToDouble(listaPuntosPorZona[i + 1].Longitud) - longitudActual;

            a = a + Angulo(vector1, vector2);
        }

        double grados = a * 180 / Math.PI;
        return Math.Abs(grados) > 180;
    }

    private static double Angulo(Punto<double> v1, Punto<double> v2)
    {
        double angulo;
        double calculoModulos;
        double calculoProductoEscalar;
        calculoModulos = Modulo(v1) * Modulo(v2);
        calculoProductoEscalar = ProductoEscalar(v1, v2);

        if (ModuloDelProductoVectorialConSigno(v1, v2) > 0)
        {
            angulo = Math.Acos(calculoProductoEscalar / calculoModulos);
        }
        else
        {
            angulo = -1 * (Math.Acos(calculoProductoEscalar / calculoModulos));
        }
        return angulo;
    }

    private static double ProductoEscalar(Punto<double> punto1, Punto<double> punto2)
    {
        double productoEscalcar;
        productoEscalcar = (punto1.X * punto2.X) + (punto1.Y * punto2.Y);
        return productoEscalcar;
    }

    private static double Modulo(Punto<double> punto)
    {
        double modulo;
        modulo = Math.Sqrt(punto.X * punto.X + punto.Y * punto.Y);
        return modulo;
    }

    private static double ModuloDelProductoVectorialConSigno(Punto<double> v1, Punto<double> v2)
    {
        double angulo = ((v1.X * v2.Y) - (v1.Y * v2.X));
        return angulo;
    }

    private struct Punto<T>
    {
        T x;
        T y;

        public Punto(T a, T b)
        {
            x = a;
            y = b;
        }

        public T X
        {
            get { return x; }
            set { x = value; }
        }

        public T Y
        {
            get { return y; }
            set { y = value; }
        }
    }

刚刚翻译成英文方法

listaPuntoPorZona =多边形点

相关问题