У меня проблема с этой функцией. Я пытаюсь обнаружить в Bing Maps AJAX, если точка находится внутри многоугольника. Поскольку у Bing-карт v7 API нет никакой функции, чтобы проверить это, я был вынужден создать собственный код. Теоретически все правильно, но всегда возвращает ложь. Есть идеи? Я что-то упустил? Вот мой код,
using System.Data.SqlTypes;
using Microsoft.SqlServer.Types;
...
[WebMethod]
public static bool PointIntersectPolygon(string PoiLat, string PoiLng, string[] PolyArr)
{
SqlGeography Point;
SqlGeography PolyGeo;
string PolyStr = "", LatStr = "", LngStr = "";
int Cnt=0;
while(Cnt < PolyArr.Length) {
LatStr = PolyArr[Cnt];
LngStr = PolyArr[Cnt + 1];
PolyStr = PolyStr + LngStr + " " + LatStr;
Cnt=Cnt+2;
if (Cnt < PolyArr.Length) { PolyStr = PolyStr + ", "; }
}
//Point = SqlGeography.STPointFromText(new SqlChars("point(" + PoiLng + " " + PoiLat + ")"), 4326);
//PolyGeo = SqlGeography.STPolyFromText(new SqlChars("polygon((" + PolyStr + "))"), 4326);
Point = SqlGeography.STPointFromText(new SqlChars("point(-95.2267532349 29.6912727356)"), 4326);
PolyGeo = SqlGeography.STPolyFromText(new SqlChars("polygon((-95.8686820418 30.0354040414, -95.1099929810 30.1058311462, -95.0110397339 29.5988826752, -95.5437927246 29.5567703247, -95.8686820418 30.0354040414))"), 4326);
MessageBox.Show(PolyGeo.STContains(Point).ToString());
bool PolyPoi = (bool)PolyGeo.STContains(Point);
return PolyPoi;
}
Я прокомментировал некоторые строки и поставил жестко закодированные значения, чтобы проверить, И у меня все тот же результат. Я уверен, что точка внутри полигона.
Типы географии сервера Sql используют левый подход. То есть, когда вы создаете многоугольник, все, что находится слева, когда вы заключите многоугольник, является внутренностью многоугольника.
Вы можете прочитать больше: SqlGeography: Ориентация полигонов на кольца