您好我正在尋找一種方法來檢查一個點是否存在於我的C#代碼中的一個多邊形內。我使用成功實現了相同的JavaScript地圖幾何庫作爲參考this link。現在我需要從c#代碼做同樣的事情。是否谷歌提供任何Web服務或DLL的相同?c#檢查點是否存在於一個多邊形
如果沒有,任何人都可以提出任何第三方的API或插件對於同一purpose.I已經嘗試了一些第三方的項目的,但沒有找到任何一個給準確性像谷歌地圖的幾何庫
您好我正在尋找一種方法來檢查一個點是否存在於我的C#代碼中的一個多邊形內。我使用成功實現了相同的JavaScript地圖幾何庫作爲參考this link。現在我需要從c#代碼做同樣的事情。是否谷歌提供任何Web服務或DLL的相同?c#檢查點是否存在於一個多邊形
如果沒有,任何人都可以提出任何第三方的API或插件對於同一purpose.I已經嘗試了一些第三方的項目的,但沒有找到任何一個給準確性像谷歌地圖的幾何庫
這個問題是微不足道編程。
爲了簡化,首先假設測試點位於原點。您需要檢查正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
。
對於不在原點的測試點,只需轉換所有多邊形頂點的座標即可,而不用實際修改多邊形。
如果多邊形跨過180°子午線,重複點在多邊形測試與經度±360°。
中是否有任何API或Web服務從谷歌這樣做從服務器端 – user136252
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 =點多邊形的
gis.stackexchange.com可能更適合於這種問題 – pvdev