Ответ maxb дает хорошую производительность, но может легко привести к потере точности, когда значения координат или количество точек велики. Это может быть смягчено простым сдвигом координат:
def polygon_area(x,y):
# coordinate shift
x_ = x - x.mean()
y_ = y - y.mean()
# everything else is the same as maxb's code
correction = x_[-1] * y_[0] - y_[-1]* x_[0]
main_area = np.dot(x_[:-1], y_[1:]) - np.dot(y_[:-1], x_[1:])
return 0.5*np.abs(main_area + correction)
Например, общей системой географической привязки является UTM, которая может иметь (x, y) координаты (488685.984, 7133035.984)
. Произведение этих двух значений равно 3485814708748.448
. Вы можете видеть, что этот единственный продукт уже на грани точности (он имеет то же количество десятичных разрядов, что и входные данные). Добавление лишь нескольких из этих продуктов, не говоря уже о тысячах, приведет к потере точности.
Простой способ смягчить это - сдвинуть многоугольник от больших положительных координат к чему-то ближе к (0,0), например, вычитая центроид, как в коде выше. Это помогает двумя способами:
,x.mean() * y.mean()
для каждого продукта Смещение координат не изменяет общую площадь, оно просто делает расчет более устойчивым в численном отношении.
Есть ли причина, по которой вы должны преобразовать эти пользовательские элементы управления в серверные? Помните, что можно скомпилировать пользовательский элемент управления в сборку .
Вы здесь нет волшебной пули, но поскольку у вас уже есть пользовательский элемент управления, это не так уж и сложно.
, переопределите метод Render для каждого дочернего элемента управления, вызовите метод RenderControl, передавая его в предоставленном HtmlTextWriter
защищенное переопределение void Render (HtmlTextWriter writer)
{
Поле TextBox = новое TextBox ();
// Устанавливаем здесь все свойства
box.RenderControl (писатель);
base.Render (писатель);
}