2015-03-01 5 views
1

У меня есть многоугольник пар длиной/длинной. Я хочу как-то составить список адресов, и после исследования я знаю, что это будет чрезвычайно сложно. Я знаю, что нет никакого способа автоматически сделать это из любой службы.Найти все строительные лат/длинные координаты в полигоне

Из чего я понимаю, я мог бы попытаться построить базу данных с адресами и координатами lat/long и сопоставить их со всеми возможными точками внутри многоугольника. Было бы здорово, если бы я мог легко найти свободные данные. Самое близкое, что я могу найти, это http://openaddresses.io, который по-прежнему очень неполный, и мне нужны все США.

Есть ли служба (программное обеспечение, онлайн, API), которая может по крайней мере найти все здания в полигоне? Я мог бы по крайней мере затем отменить геокодирование точки и получить адрес, если он действителен.

Может ли кто-нибудь предложить что-либо, чтобы помочь достичь моей конечной цели - найти все адреса в полигоне? Единственное требование - это быть свободным.

ответ

0

Если у вас есть резорбции, вы можете запрограммировать его самостоятельно. Просто используйте формулу, которая вычисляет, является ли данная точка внутри многоугольника и адаптирует ее для работы с вашими координатами.

У меня была аналогичная проблема. Мое приложение должно было проверить окрестности, в которые был включен latLgn. API Викимапии вернул мне все окрестности в радиусе, но не имел координаты в пределах его границ.

Мне пришлось самостоятельно адаптировать эту функцию, потому что API этого не делал (хотя он предоставил мне все данные, необходимые для извлечения информации).

Вот функция, которую я сделал. (в C#)

public bool NoPoligono(PointCollection poligono) 
    { 
     bool result = false; 
     Point local = new Point(double.Parse(this.Lng, CultureInfo.InvariantCulture), double.Parse(this.Lat, CultureInfo.InvariantCulture)); 
     int j = poligono.Count - 1; 
     for (int i = 0; i < poligono.Count(); i++) 
     { 
      if (Math.Abs(poligono[i].Y) < Math.Abs(local.Y) && Math.Abs(poligono[j].Y) >= Math.Abs(local.Y) || Math.Abs(poligono[j].Y) < Math.Abs(local.Y) && Math.Abs(poligono[i].Y) >= Math.Abs(local.Y)) 
      { 
       if (Math.Abs(poligono[i].X) + (Math.Abs(local.Y) - Math.Abs(poligono[i].Y))/(Math.Abs(poligono[j].Y) - Math.Abs(poligono[i].Y)) * (Math.Abs(poligono[j].X) - Math.Abs(poligono[i].X)) < Math.Abs(local.X)) 
        result = !result;     
      } 
      j = i; 
     } 
     return result; 
    } 

Он принадлежит классу Ponto, который представляет собой координату в логике моего приложения. Он служил для проверки того, был ли он внутри многоугольника (PointCollection) передан как параметр.