SqlGeography STIntersect всегда возвращает false

#c# #sql-server #geospatial

#c# #sql-сервер #геопространственный

Вопрос:

У меня проблема с этой функцией. Я пытаюсь определить в Bing Maps AJAX, находится ли точка внутри многоугольника. Поскольку в API Bing maps v7 нет никакой функции для проверки этого, я был вынужден создать свой собственный код. Теоретически все правильно, но всегда возвращает false . Есть идеи? Я что-то упускаю? Вот мой код,

 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;
}
  

Я закомментировал некоторые строки и ввел жестко закодированные значения для проверки, и у меня все тот же результат. Я почти уверен, что точка внутри многоугольника.

Комментарии:

1. Знаете ли вы о разнице между многоугольником по часовой стрелке и многоугольником против часовой стрелки?

2. @ErikPhilips если вы проверяете значения, точки в многоугольнике расположены по часовой стрелке.

3. Тогда все наоборот . Включительно против часовой стрелки.

4. @ErikPhilips Спасибо за информацию и за отрицательный отзыв. Я ценю тот факт, что вы предоставили мне информацию, но я думаю, что это касается обучения начинающих пользователей (таких как я), а не наказания, если пользователь не найдет информацию простым способом. Я не разработчик C #, и я целую неделю пытаюсь найти информацию о C # и Bing Maps. И, как вы уже можете знать, информация в API карт Bing более ограничена по сравнению с Google.

5. Интересно, я не голосовал против вас. в 99% случаев я не помогаю с вопросом с отрицательным ответом, потому что, по моему собственному мнению, это не очень хорошие вопросы.

Ответ №1:

Типы географии Sql Server используют левый подход. То есть, когда вы создаете полигон, все, что находится слева, когда вы заключаете полигон, находится внутри полигона.

Вы можете прочитать больше: SqlGeography: кольцевая ориентация полигонов