Как отобразить данные с помощью openlayers с OpenStreetMap в geodjango?

Вместо того, чтобы группировать, затем объединять, затем снова группировать, почему бы не объединить таблицы заказов и не работать оттуда:

SELECT c1.customer ,MAX(s2.dt_created) AS last_order_date
FROM customers c1
INNER JOIN (select customer, dt_created from archive_orders
union all select customer, dt_created from orders) s2
ON c1.customer = s2.customer
GROUP BY c1.customer

Помните, что в SQL ваша задача - сообщить системе , что вы хотите , а не , какие шаги / процедуры нужно выполнить, чтобы получить эти результаты . Вышеприведенное, логически, описывает то, что мы хотим - мы хотим, чтобы дата последнего заказа от заказов каждого клиента, и нас не волнует, был ли это заархивированный заказ или неархивированный.

Так как мы собираемся уменьшить информацию о заказе до одной строки (для каждого клиента) во время поведения GROUP BY, нам также не нужно UNION для удаления дубликатов, чтобы Я переключился на UNION ALL.

(Признаюсь, я не мог реально увидеть, что ORDER BY должен был добавить к миксу в этот момент, поэтому я не пытался включить его сюда. Если это входит в CTE, то подумайте на том факте, что CTE, как и таблицы и представления, не имеют присущего порядка . Единственное предложение ORDER BY, которое влияет на порядок строк результатов, - это то, которое применяется к внешнему / окончательному SELECT) [ 1117]


Дать orders приоритет над archived_orders:

;With CTE1 as (
    SELECT c1.customer,group,MAX(s2.dt_created) as MaxInGroup
    FROM customers c1
    INNER JOIN (select customer, dt_created,2 as group from archive_orders
    union all select customer, dt_created,1 from orders) s2
    ON c1.customer = s2.customer
    GROUP BY c1.customer,group
), CTE2 as (
    SELECT *,ROW_NUMBER() OVER (PARTITION BY customer ORDER BY group) as rn
    from CTE2
)
select * from CTE2 where rn = 1
12
задан monkut 18 February 2009 в 05:53
поделиться

2 ответа

Я думаю, что Ваше решение осуществимо и вероятно самый легкий подход. Просто templatize JavaScript и использование Django для введения точек данных как шаблона представляется.

Если бы Вы хотели стать более необычными, то Вы могли бы сделать, чтобы Django просмотрел, который подал точки данных как JSON (application/json), и затем используйте Ajax, чтобы перезвонить и получить данные на основе событий, которые происходят в браузере. Если Вы хотите, чтобы Ваше приложение было очень интерактивным выше и вне того, что обеспечивает OpenLayers, это могло бы стоить добавленной сложности, но конечно все это зависит от потребностей Вашего приложения.

2
ответ дан 2 December 2019 в 22:38
поделиться

Другим решением является создание формы, использующей виджет GeoDjango Admin. Для этого я:

Настройка GeneratePolygonAdminClass:

class GeneratePolygonAdmin(admin.GeoModelAdmin):
    list_filter=('polygon',)
    list_display=('object', 'polygon')

Где строится форма:

geoAdmin=GeneratePolygonAdmin(ModelWithPolygonField, admin.site)
PolygonFormField=GeneratePolygon._meta.get_field('Polygon')
PolygonWidget=geoAdmin.get_map_widget(PolygonFormField)
Dict['Polygon']=forms.CharField(widget=PolygonWidget())  #In this case, I am creating a Dict to use for a dynamic form

Заполнение виджета формы:

def SetupPolygonWidget(form, LayerName, MapFileName, DefaultPolygon=''):
    form.setData({'Polygon':DefaultPolygon})
    form.fields['Polygon'].widget.params['wms_layer']=LayerName
    form.fields['Polygon'].widget.params['wms_url']='/cgi-bin/mapserv?MAP=' + MapFileName
    form.fields['Polygon'].widget.params['default_lon']=-80.9
    form.fields['Polygon'].widget.params['default_lat']=33.7
    form.fields['Polygon'].widget.params['default_zoom']=11
    form.fields['Polygon'].widget.params['wms_name']=YOURWMSLayerName
    form.fields['Polygon'].widget.params['map_width']=800
    form.fields['Polygon'].widget.params['map_height']=600
    form.fields['Polygon'].widget.params['map_srid']=YOUR_SRID
    form.fields['Polygon'].widget.params['modifiable']=True
    form.fields['Polygon'].widget.params['map_options']={}
    form.fields['Polygon'].widget.params['map_options']['buffer'] = 0   
    return form

На основе кода at: http://code.djangoproject.com/browser/django/branches/gis/django/contrib/gis/admin/options.py?rev=7980

Похоже, что вы можете использовать опцию extra_js для включения OpenStreetMap (я этого не тестировал).

.
4
ответ дан 2 December 2019 в 22:38
поделиться
Другие вопросы по тегам:

Похожие вопросы: