2015-10-19 118 views
-1

您好我正在尋找一種方法來檢查一個點是否存在於我的C#代碼中的一個多邊形內。我使用成功實現了相同的JavaScript地圖幾何庫作爲參考this link。現在我需要從c#代碼做同樣的事情。是否谷歌提供任何Web服務或DLL的相同?c#檢查點是否存在於一個多邊形

如果沒有,任何人都可以提出任何第三方的API或插件對於同一purpose.I已經嘗試了一些第三方的項目的,但沒有找到任何一個給準確性像谷歌地圖的幾何庫

+0

gis.stackexchange.com可能更適合於這種問題 – pvdev

回答

0

這個問題是微不足道編程。

爲了簡化,首先假設測試點位於原點。您需要檢查正X軸與多邊形邊的交點數的奇偶性。

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,使N≡0

對於不在原點的測試點,只需轉換所有多邊形頂點的座標即可,而不用實際修改多邊形。

enter image description here

如果多邊形跨過180°子午線,重複點在多邊形測試與經度±360°。

+0

中是否有任何API或Web服務從谷歌這樣做從服務器端 – user136252

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 =點多邊形的

相關問題