Сравнение функциональной полноты общих бесплатных баз данных ГИС / геоданных (PostgreSQL / PostGIS, SQLite / SpatiaLite, H2 / H2GIS, ...) - PullRequest
0 голосов
/ 10 октября 2018

Для реализации функций ГИС мы должны выбирать между различными альтернативами.Следует избегать уплаты лицензионных сборов, поэтому мы сузили их до 3 выше.Но, может быть, следует / можно подумать и о других?

Наши основные критерии:

  • нет лицензионных сборов
  • в идеале нет ограничений на использование всей системы(для государственных, правительственных организаций, корректировки / разработки)
  • (XML) входные данные в диапазоне xx ГБ (низкая избыточность)
  • (XML) выходные данные в диапазоне xx GB (низкая избыточность)(преобразованные входные данные)
  • хорошая производительность (использование ОЗУ, загрузка ЦП, использование диска) и пропускная способность
  • SFA-SQL (стандарт OGC)
    • ( фокус для вопроса )
    • совместимость желательна, но не обязательна
    • высокая функциональность покрытия не нужна, но желательна (по крайней мере, «основные» операции)
    • (другие поисковые теги: SFS , SFSQL , Простой доступ к функциям )
  • DB-GIS иОпыт пользователей sysadm / dbadm: нужно уметь устанавливать и настраивать систему БД
  • Опыт DB-GISразработчиков: большая часть опыта работы с PostgreSQL / PostGIS, другие незначительные

1 Ответ

0 голосов
/ 10 октября 2018

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

списки пространственных баз данных или сравнений

(1): приведенные ниже чистые вычисления «количества имен функций» не должны восприниматься как полностью квалифицируемая мера, поскольку дизайн подписи (перегрузка, компоновка и т. Д.) Может оказывать большее влияние на фактическуюгибкость и функциональный охват.(=> меньшее количество функций теоретически может быть «лучше»)

SQLite с SpatiaLite

  • встроенная база данных
  • записано в C
  • ~ 440 (1) гео-функций (2018-10-09 / 4.3.0)
    • см. Функцию calc внизу
  • SFA-SQL-покрытие :
    • SpatiaLite расширяет существующую пространственную поддержку SQLite до , охватывая спецификацию SGC OGC ( Wikipedia )

    • SpatiaLiteподдерживает несколько открытых стандартов от OGC и был указан в качестве эталонной реализации для предлагаемого стандарта GeoPackage ( Wikipedia )

H2 с H2GIS

  • встроенная база данных
  • написано на Java
  • ~ 191 (1) гео функции (2018-10-09 / 1.4.0)
  • SFA-SQL-покрытие :
    • H2GIS реализует подпрограммы SQLописать в " Стандарт внедрения OpenGIS ® для географической информации - Простой доступ к функциям. Часть 2. Параметр SQL " OGS (2018-10-09 / 06-104r4)

PostgreSQL с PostGIS

  • общая клиент-серверная база данных
  • ~ 310 (1) гео функции (2018-10-09 / 2.5)
    • см. Функцию расчетавнизу
  • SFA-SQL-покрытие :
    • PostGIS, зарегистрированный как , реализует указанный стандарт"для" Простых функций для SQL "OGC . 4 PostGIS не был сертифицирован как соответствующий OGC .( Википедия )

наше предпочтение / выбор

(Это очень субъективно и только по информативным причинамздесь!)

Мы решили использовать PostGIS просто потому, что

  • мы считаем, что риск в отношении производительности и массовой обработки данных является самым низким для наших нужд
  • мы можем использовать другие распространенныеили более продвинутая функциональность реляционной базы данных в будущем
  • у нас большой опыт работы с ней
  • мы поставляем всю систему в предустановленной ВМ, поэтому встраиваемость СУБД не важнадля нас или клиента на данный момент

приложение: вспомогательные функции для подсчета геофункций

(JavaScript основан на / протестирован с консолью Firefox)

JavaScript для подсчета функций на сайте функций SpatiaLite

результат:

"-#19  version  (tr#0 - tr#21)
-#15  generic  (tr#21 - tr#38)
-#08  global  (tr#38 - tr#48)
-#26  math  (tr#48 - tr#76)
+#06  error  (tr#76 - tr#84)
+#20  length_cvt  (tr#84 - tr#106)
+#02  dms_cvt  (tr#106 - tr#110)
-#14  blob  (tr#110 - tr#126)
+#32  p0  (tr#126 - tr#160)
+#11  p1  (tr#160 - tr#173)
+#11  p2  (tr#173 - tr#186)
+#03  p3  (tr#186 - tr#191)
+#13  p3misc  (tr#191 - tr#206)
+#20  p4  (tr#206 - tr#228)
+#01  repair  (tr#228 - tr#231)
+#02  compress  (tr#231 - tr#235)
+#09  cast  (tr#235 - tr#246)
+#04  dims-cast  (tr#246 - tr#252)
+#04  p5  (tr#252 - tr#258)
+#14  p6  (tr#258 - tr#274)
+#07  p7  (tr#274 - tr#283)
+#03  p8  (tr#283 - tr#288)
+#03  p9  (tr#288 - tr#293)
+#02  p10  (tr#293 - tr#297)
+#08  p11  (tr#297 - tr#307)
+#11  p12  (tr#307 - tr#320)
+#03  p13  (tr#320 - tr#325)
+#08  p14  (tr#325 - tr#335)
+#28  p14b  (tr#335 - tr#365)
+#03  p14c  (tr#365 - tr#370)
+#16  p14d  (tr#370 - tr#388)
+#10  p15  (tr#388 - tr#400)
+#23  p15plus  (tr#400 - tr#425)
+#22  p16  (tr#425 - tr#449)
-#02  p16metacatalog  (tr#449 - tr#453)
+#41  p16style  (tr#453 - tr#496)
-#03  p16isometa  (tr#496 - tr#501)
+#07  p16fdo  (tr#501 - tr#510)
+#23  p16gpkg  (tr#510 - tr#535)
+#04  p17  (tr#535 - tr#541)
+#04  p18  (tr#541 - tr#547)
+#33  xmlBlob  (tr#547 - tr#582)
+#12  srid  (tr#582 - tr#596)
+#17  advanced  (tr#596 - tr#615)
gis functions: 440"

function:

x=$x("//tr/td/h3/a[@name]")   // header anchors
os=''                         // output string
trs=$x("//tr")                // tr nodes
gf=0                          // gis functions
nongis= ['version','generic','global','math','blob','p16metacatalog','p16isometa']  // non-gis function sections/anchors
for (var i=0; i< x.length; i++ ) {
  isgs = nongis.indexOf( x[i].attributes['name'].value ) == -1  // is gis section
  c= trs.indexOf( x[i].parentNode.parentNode.parentNode )       // current header index
  n= (i == x.length-1) ? trs.length+1 : trs.indexOf( x[i+1].parentNode.parentNode.parentNode )  // next header index
  os+= (!isgs ? '-' : '+' ) + '#' + ((n-c-2 > 9 ? '' : '0') + (n-c-2)) + '  ' + x[i].attributes['name'].value + '  (tr#' + c + ' - tr#' + n + ')\n'
  gf+= isgs ? n-c-2 : 0
}
os += 'gis functions: ' + gf

JavaScript для подсчета функций на PostGIS функционирует сайт

$x('//a[@name="PostGIS_TypeFunctionMatrix"]/../../../../..//tbody/tr').length
...