OSGeo Planet

Jody Garnett: JTS 1.15.1 and XYZM development

OSGeo Planet - Thu, 2018-08-02 05:29
One of the things I have been working on with the LocationTech crew is the JTS Topology Suite project.

JTS logo

We have had an exciting couple of months with James Hughes and myself taking a code-sprint to:


The other bit of RnD I have been working has been Explicit support for XYZM coordinates. Previously this has been left as an exercise for the reader, designed for in the API but something for downstream applications to figure out. The motivation to address this in JTS is to support a WKTReader / WKT Writer enhancements Felix Obermaier has been working on, but now that it has started a wide range of projects have expressed interest.

The design trade off is between treating JTS Coordinate as a data object, managed in arrays and created and deleted as required. JTS itself only makes use of coordinate.x and coordinate.y fields (which are public as befitting a data structure).

Here is what adding XYZM support looks like for Coordinate:




Methods have beed added for getX(), getY(), getZ() and getM() - and the methods return NaN for anything they do not support.

The cloud projects at LocationTech, such as GeoMesa, run into a bit of trouble with this approach as creating and deleting Coordinate constantly during processing causes a lot of memory pressure. The alternative is to manage information as a CoordinateSequence, such as Packed CoordinateSequence which is backed by an array of doubles. There is lots of room for JTS to improve in this area and we have watched downstream projects come up with all kinds of fascinating CoordinateSequence implementations we can learn from.

Here is what adding XYZM support looks like for CoordinateSequence:




The key addition here is clarifying the definition of dimension (the number of ordinates in each coordinate) and adding measures (the number of measures included in dimension for each coordinate). For for XY data dimension is 2 and measures is 0. For XYZM data dimension is 4 and measures is 1.

FOSS4G 2018If you are interested in hearing more about JTS Topology Suite join Rob Emanuele and myself at FOSS4G 2018 later this month for State of JTS 2018

Categories: OSGeo Planet

gvSIG Team: 14th International gvSIG Conference: Registrations are now open

OSGeo Planet - Wed, 2018-08-01 11:12

The registration period for the 14th International gvSIG Conference is now open. The conference will be held from October 24th to 26th at School of Engineering in Geodesy, Cartography and Surveying (Universitat Politècnica de València, Spain).

Registrations are free of cost (limited capacity) and must be done through the application form on the Conference web page.

The conference program and all the information about registration for workshops, and about the conference rooms will be available at the event website soon.

We also remind you that we have extended the deadline for submitting communication proposals. The extended deadline is September 11th. You can find all the information about communication sending in the conference website.

We expect your participation!

Categories: OSGeo Planet

gvSIG Team: 14as Jornadas Internacionales gvSIG: Inscripciones abiertas

OSGeo Planet - Wed, 2018-08-01 11:10

Ya está abierto el periodo de inscripción de las 14as Jornadas Internacionales gvSIG, que se celebrarán del 24 al 26 de octubre, en la Escuela Técnica Superior de Ingeniería Geodésica, Cartográfica y Topográfica (Universitat Politècnica de València, España).

La inscripción es totalmente gratuita (con aforo limitado) y se ha de realizar a través del formulario existente en la página web de las Jornadas.

En unas semanas se publicará el programa con todas las ponencias y talleres previstos, tanto para usuarios como para desarrolladores, con toda la información sobre cómo inscribirse en ellos.

Por otro lado, os recordamos que se ha ampliado el plazo de envío de resúmenes, siendo la nueva fecha límite el 11 de septiembre. Las normas para el envío de comunicaciones podéis encontrarlas en la web del evento.

¡Esperamos vuestra participación!

Categories: OSGeo Planet

GIS for Thought: Anaconda install with OSGeo4W

OSGeo Planet - Wed, 2018-08-01 08:00

I was coming across some errors when installing Anaconda, Miniconda specifically.

https://conda.io/miniconda.html

I think part of the reason is I have quite a few installs of Python due to OSGeo4W.

My error:

Fatal Python error: Py_Initialize: unable to load the file system codec ModuleNotFoundError: No module named 'encodings' Current thread 0x00002554 (most recent call first):

The solution:

Update the activate.bat file that is called when launching from the start menu. For me located in:

C:\ProgramData\Anaconda\Scripts

We need to add in the following to clear out and reset the python environment before launching anaconda:

@SET PYTHONPATH= @SET PYTHONHOME=C:\ProgramData\Anaconda @PATH C:\ProgramData\Anaconda;C:\ProgramData\Anaconda\Scripts;%PATH%

So, editing the file from:

@REM Test first character and last character of %1 to see if first character is a " @REM but the last character isn't. @REM This was a bug as described in https://github.com/ContinuumIO/menuinst/issues/60 @REM When Anaconda Prompt has the form @REM %windir%\system32\cmd.exe "/K" "C:\Users\builder\Miniconda3\Scripts\activate.bat" "C:\Users\builder\Miniconda3" @REM Rather than the correct @REM %windir%\system32\cmd.exe /K ""C:\Users\builder\Miniconda3\Scripts\activate.bat" "C:\Users\builder\Miniconda3"" @REM this solution taken from https://stackoverflow.com/a/31359867 @set "_args1=%1" @set _args1_first=%_args1:~0,1% @set _args1_last=%_args1:~-1% @set _args1_first=%_args1_first:"=+% @set _args1_last=%_args1_last:"=+% @set _args1= @if "%_args1_first%"=="+" if NOT "%_args1_last%"=="+" ( @CALL "%~dp0..\Library\bin\conda.bat" activate @GOTO :End ) @CALL "%~dp0..\Library\bin\conda.bat" activate %* :End @set _args1_first= @set _args1_last=

To:

@REM Test first character and last character of %1 to see if first character is a " @REM but the last character isn't. @REM This was a bug as described in https://github.com/ContinuumIO/menuinst/issues/60 @REM When Anaconda Prompt has the form @REM %windir%\system32\cmd.exe "/K" "C:\Users\builder\Miniconda3\Scripts\activate.bat" "C:\Users\builder\Miniconda3" @REM Rather than the correct @REM %windir%\system32\cmd.exe /K ""C:\Users\builder\Miniconda3\Scripts\activate.bat" "C:\Users\builder\Miniconda3"" @REM this solution taken from https://stackoverflow.com/a/31359867 @set "_args1=%1" @set _args1_first=%_args1:~0,1% @set _args1_last=%_args1:~-1% @set _args1_first=%_args1_first:"=+% @set _args1_last=%_args1_last:"=+% @set _args1= @SET PYTHONPATH= @SET PYTHONHOME=C:\ProgramData\Anaconda @PATH C:\ProgramData\Anaconda;C:\ProgramData\Anaconda\Scripts;%PATH% @if "%_args1_first%"=="+" if NOT "%_args1_last%"=="+" ( @CALL "%~dp0..\Library\bin\conda.bat" activate @GOTO :End ) @CALL "%~dp0..\Library\bin\conda.bat" activate %* :End @set _args1_first= @set _args1_last=

Updating the paths as required.

This just clears out the python and windows environmental variables before launching, similar to what OSGeo4W does.

Categories: OSGeo Planet

Blog 2 Engenheiros: Como criar seu primeiro plugin para QGIS usando Python e Qt Designer? Parte III

OSGeo Planet - Tue, 2018-07-31 06:07

E chegamos à última parte do nosso tutorial de criação de plugins para o QGIS utilizando Python e o Qt Designer. Na primeira postagem, ensinamos como criar os arquivos base do plugin e como solicitar ao usuário pontos temporários para serem inseridos no mapa.

Na segunda postagem, vimos como salvar o shapefile do ponto inserido, como avaliar em qual região de um determinado zoneamento o ponto esta localizado e como corrigir erros no Python.

Caso você não tenha lido a primeira e segunda parte, você pode ler elas clicando nos links abaixo.

Nesta terceira parte do tutorial, iremos mostrar como criar um mapa no compositor de impressão, de forma que possamos exportar o ponto inserido e o zoneamento avaliado para outros usuários no formato PDF e PNG.

Preparando o Compositor de Impressão com PyQGIS

Antes de começarmos a inserirmos as funções relacionadas ao compositor de impressão, precisamos importar elas. Você deve inserir nas linhas iniciais do arquivo python (.py) as seguintes linhas:

from PyQt4.QtGui import QAction, QIcon, QFileDialog, QPrinter, QPainter, QImage, QColor # Nesta linha, foram adicionados os itens QPrinter, QPainter, QImage e QColor from qgis.utils import iface # Adicione esta linha para importar o item iface

Agora que já importamos as funções necessárias, vamos incorporar, passo a passo, os itens do nosso mapa.

As próximas linhas de código serão inseridas no final do nosso arquivo python, logo após a verificação se os checkbox da área de estudo estão selecionados ou não.

Primeiro, iremos criar uma composição do tipo QgsComposition a qual irá receber a informação visual do nosso mapa. Confira o código abaixo.

# Criação de uma composição QgsComposition mapRenderer = iface.mapCanvas().mapRenderer() c = QgsComposition(mapRenderer) c.setPlotStyle(QgsComposition.Print)

O próximo passo é definir onde será impresso nosso mapa em uma folha A4 (o QGIS define como padrão de saída folha A4 com resolução de 300 dpi). Note que após criar as variáveis, elas são inseridas dentro do nosso mapa usando a função addItem().

# Adicionando e definindo onde o mapa será inserido na folha x, y = 0, 0 w, h = c.paperWidth(), c.paperHeight() composerMap = QgsComposerMap(c, x, y, w, h) c.addItem(composerMap)

Agora, vamos criar um item que receberá nossos textos e irá colocar eles em uma determinada parte da impressão.

Veja que dentro da função setText() devemos inserir o texto que será apresentado e na função setItemPosition() recebe a posição do nosso texto.

# Adiciona texto (label) ao mapa gerado composerLabel = QgsComposerLabel(c) composerLabel.setText("Blog 2 Engenheiros") composerLabel.adjustSizeToText() composerLabel.setItemPosition(100, 0) c.addItem(composerLabel)

Por fim, vamos adicionar agora a legenda do nosso mapa.

# Adiciona legenda ao mapa legend = QgsComposerLegend(c) legend.model().setLayerSet(mapRenderer.layerSet()) legend.setItemPosition(10,10) c.addItem(legend)

Já temos os elementos do nosso mapa no formato de código Python. Podemos também incluir outros itens, tais como escala (QgsComposerScaleBar) e polígonos baseados em pontos (QgsComposerPolygon), mas deixaremos eles de fora, neste tutorial.

Itens como figuras, flechas e tabelas ainda não suportados, ou seja, não podem ser inseridos por meio de python no QGIS (Documentation QGIS 2.18).

Com os itens inseridos, precisamos agora exportar o resultado para PDF ou para PNG.

Exportando mapa no formato PDF

Para exportar o mapa criado, utilize o código abaixo, lembrando de substituir (na função setOutputFileName) o caminho onde será gerado o arquivo pdf.

Neste exemplo, utilizei o mesmo caminho onde foi salvo o arquivo shapefile.

# Exportando o resultado para PDF printer = QPrinter() printer.setOutputFormat(QPrinter.PdfFormat) printer.setOutputFileName(localSalvo+"_mapa.pdf") printer.setPaperSize(QSizeF(c.paperWidth(), c.paperHeight()), QPrinter.Millimeter) printer.setFullPage(True) printer.setColorMode(QPrinter.Color) printer.setResolution(c.printResolution()) pdfPainter = QPainter(printer) paperRectMM = printer.pageRect(QPrinter.Millimeter) paperRectPixel = printer.pageRect(QPrinter.DevicePixel) c.render(pdfPainter, paperRectPixel, paperRectMM) pdfPainter.end()

Veja que podemos modificar várias opções, tais como tamanho do papel (setPaperSize), se a impressão é na folha toda (setFullPage) e resolução (setResolution).

Exportando o mapa no formato PNG

Agora, se você quer ter o mapa no formato png, você deverá utilizar o código abaixo, ao invés do código previamente apresentado.

# Exportando o mapa para PNG dpi = c.printResolution() dpmm = dpi / 25.4 width = int(dpmm * c.paperWidth()) height = int(dpmm * c.paperHeight()) # Cria uma imagem de saída e inicializa ela image = QImage(QSize(width, height), QImage.Format_ARGB32) image.setDotsPerMeterX(dpmm * 1000) image.setDotsPerMeterY(dpmm * 1000) image.fill(0) # Cria a composição imagePainter = QPainter(image) c.renderPage( imagePainter, 0 ) imagePainter.end() image.save(localSalvo+"_mapa.png", "png")

Caso você tenha seguido os passos corretamente e nenhum erro tenha acontecido, você obterá o seguinte mapa.

Mapa gerado após seguir os procedimentos que apresentamos.Mapa gerado após seguir os procedimentos que apresentamos.

A aparência do nosso mapa não é a melhor de todas, por isso, vamos modificar um pouco os códigos que apresentamos para que ele fique mais apresentável, acrescentando também, em qual região de planejamento e bacia hidrográfica o ponto se encontra.

Melhorando a aparência do nosso mapa

A legenda será o primeiro item que iremos melhorar. Confira o código abaixo (as linhas com comentários são aquelas que foram inseridas).

# Adiciona legenda ao mapa legend = QgsComposerLegend(c) legend.model().setLayerSet(mapRenderer.layerSet()) legend.setItemPosition(10,10) legend.setTitle("Legenda: ") # Acrescenta ou modifica o título da legenda legend.setFrameOutlineWidth(0.5) # Modifica tamanho da linha no entorno da legenda legend.setFrameEnabled(1) # Acrescenta linha no entorno da legenda c.addItem(legend)

Com a legenda corrigida, vamos modificar o texto que foi inserido.

Além de aparecer “Blog 2 Engenheiros”, vamos fazer ele mostrar o local onde o ponto inserido pelo usuário caiu (conforme bacia hidrográfica e região de planejamento).

# Adiciona texto (label) ao mapa gerado composerLabel = QgsComposerLabel(c) composerLabel.setText("Blog 2 Engenheiros: ") composerLabel.adjustSizeToText() composerLabel.setItemPosition(c.paperWidth() - 100, c.paperHeight() - 24) c.addItem(composerLabel) # Adiciona texto referente à localização do ponto adicionado regiaoLabel = QgsComposerLabel(c) if self.dlg.checkBoxRP.isChecked(): try: regiaoLabel.setText(pnt_selection[0] + u" esta localizado em " + rp_selection[0]) except: regiaoLabel.setText(u"O ponto fornecido esta fora da área de interesse!!") else: regiaoLabel.setText(u"O item Região de Planejamento não foi selecionado.") regiaoLabel.adjustSizeToText() regiaoLabel.setItemPosition(c.paperWidth() - 100, c.paperHeight() - 19) c.addItem(regiaoLabel) baciaLabel = QgsComposerLabel(c) if self.dlg.checkBoxBH.isChecked(): try: baciaLabel.setText(pnt_selection[0] + " esta na " + bh_selection[0]) except: baciaLabel.setText(u"O ponto fornecido esta fora da área de interesse!!") else: baciaLabel.setText(u"O item Bacias Hidrográficas não foi selecionado.") baciaLabel.adjustSizeToText() baciaLabel.setItemPosition(c.paperWidth() - 100, c.paperHeight() - 14) c.addItem(baciaLabel)

Agora vamos adicionar uma grade de coordenadas e uma borda ao nosso mapa, lembrando que devemos modificar, para isso, a posição que o nosso mapa foi inserido.

# Adicionando e definindo onde o mapa será inserido na folha x, y = 25, 25 # Variáveis que mostram a origem do nosso mapa na folha de impressão w, h = c.paperWidth() - 50, c.paperHeight() - 50 # Variáveis mostrando o tamanho do nosso mapa composerMap = QgsComposerMap(c, x, y, w, h) composerMap.setFrameEnabled(1) # Liga a borda do nosso mapa composerMap.setGridEnabled(True) # Liga a grade de coordenadas composerMap.setGridIntervalX(20000) # Determina o intervalo da grade no eixo X composerMap.setGridIntervalY(20000) # Determina o intervalo da grade no eixo X composerMap.setShowGridAnnotation(True) # Mostra os valores das coordenadas #composerMap.setGridAnnotationPrecision(0) # Precisão das coordenadas (Zero = não há casas decimais) (Por alguma razão, essa função não funciona). composerMap.setGridStyle(QgsComposerMap.Cross) # Estilo da Grade # Determina a posição e direção das coordenadas no topo do mapa composerMap.setGridAnnotationPosition(QgsComposerMap.OutsideMapFrame, QgsComposerMap.Top) composerMap.setGridAnnotationDirection(QgsComposerMap.Horizontal, QgsComposerMap.Top) # Desabilita coordenadas na parte inferior do mapa composerMap.setGridAnnotationPosition(QgsComposerMap.Disabled, QgsComposerMap.Bottom) # Desabilita coordenadas na esquerda do mapa composerMap.setGridAnnotationPosition(QgsComposerMap.Disabled, QgsComposerMap.Left) # Determina a posição e direção das coordenadas na direita do mapa composerMap.setGridAnnotationPosition(QgsComposerMap.OutsideMapFrame, QgsComposerMap.Right) composerMap.setGridAnnotationDirection(QgsComposerMap.Vertical, QgsComposerMap.Right) #composerMap.setAnnotationFrameDistance(1) # Distância da coordenada do mapa (Por alguma razão, essa função não funciona). composerMap.setAnnotationFontColor(QColor(0, 0, 0)) # Cor da coordenada c.addItem(composerMap)

O resultado das nossas modificação é apresentado na figura abaixo.

Após abrir o shapefile com os municípios do RJ, rodamos nosso plugin e este é o resultado.Após abrir o shapefile com os municípios do RJ, rodamos nosso plugin e este é o resultado.

Lembre-se de, antes de utilizar o plugin, determinar corretamente o sistema de coordenadas, ajustar a legenda e as cores do seu mapa, para que, ao utilizar o plugin, o mapa final sai corretamente.

Você pode baixar o arquivo python clicando em ponto_exato_final.

Confira o vídeo (aqui) que realizamos mostrando como o plugin funciona (aproveite e se inscreva no nosso canal do Youtube) e se você quer conferir as postagens anteriores deste plugin, confira os links abaixo:

Ficou com alguma dúvida? Deixa ela nos comentários que iremos responder assim que possível.

Referências Consultadas: Documentation QGIS 2.18: https://docs.qgis.org/2.18/en/docs/pyqgis_developer_cookbook/composer.html GIS StackExchange “Setting an item position (variable) from LowerRight?”: https://gis.stackexchange.com/questions/206150/setting-an-item-position-variable-from-lowerright GIS StackExchange “How can I add grid lines to a print composition using pyqgis?”: https://gis.stackexchange.com/questions/85724/how-can-i-add-grid-lines-to-a-print-composition-using-pyqgis
Categories: OSGeo Planet

Markus Neteler: Celebrating 35 years of GRASS GIS!

OSGeo Planet - Sun, 2018-07-29 17:16

Today marks 35 years of GRASS GIS development – with frequent releases the project keeps pushing the limits in terms of geospatial data processing quality and performance.

GRASS (Geographic Resources Analysis Support System) is a free and open source Geographic Information System (GIS) software suite used for geospatial data management and analysis, image processing, graphics and map production, spatial modeling, and 3D visualization. Since the major GRASS GIS 7 version, it also comes with a feature rich engine for space-time cubes useful for time series processing of Landsat and Copernicus Sentinel satellite data and more. GRASS GIS can be either used as a desktop application or as a backend for other software packages such as QGIS and R. Furthermore, it is frequently used on HPC and cloud infrastructures for massive parallelized data processing.

Brief history
In 1982, under the direction of Bill Goran at the U.S. Army Corps of Engineers Construction Engineering Research Laboratory (CERL), two GIS development efforts were undertaken. First, Lloyd Van Warren, a University of Illinois engineering student, began development on a new computer program that allowed analysis of mapped data.  Second, Jim Westervelt (CERL) developed a GIS package called “LAGRID – the Landscape Architecture Gridcell analysis system” as his master’s thesis. Thirty five years ago, on 29 July 1983, the user manual for this new system titled “GIS Version 1 Reference Manual” was first published by J. Westervelt and M. O’Shea. With the technical guidance of Michael Shapiro (CERL), the software continued its development at the U.S. Army Corps of Engineers Construction Engineering Research Laboratory (USA/CERL) in Champaign, Illinois; and after further expansion version 1.0 was released in 1985 under the name Geographic Resources Analysis Support System (GRASS). The GRASS GIS community was established the same year with the first annual user meeting and the launch of GRASSnet, one of the internet’s early mailing lists. The user community expanded to a larger audience in 1991 with the “Grasshopper” mailing list and the introduction of the World Wide Web. The users’ and programmers’ mailing lists archives for these early years are still available online.
In the mid 1990s the development transferred from USA/CERL to The Open GRASS Consortium (a group who would later generalize to become today’s Open Geospatial Consortium — the OGC). The project coordination eventually shifted to the international development team made up of governmental and academic researchers and university scientists. Reflecting this shift to a project run by the users, for the users, in 1999 GRASS GIS was released under the terms of the GNU General Public License (GPL). A detailed history of GRASS GIS can be found at https://grass.osgeo.org/history/.

Where to next?
The development on GRASS GIS continues with more energy and interest than ever. Parallel to the long-term maintenance of the GRASS 7.4 stable series, effort is well underway on the new upcoming cutting-edge 7.6 release, which will bring many new features, enhancements, and cleanups. As in the past, the GRASS GIS community is open to any contribution, be it in the form of programming, documentation, testing, and financial sponsorship. Please contact us!

About GRASS GIS

The Geographic Resources Analysis Support System (https://grass.osgeo.org/), commonly referred to as GRASS GIS, is an Open Source Geographic Information System providing powerful raster, vector and geospatial processing capabilities in a single integrated software suite. GRASS GIS includes tools for spatial modeling, visualization of raster and vector data, management and analysis of geospatial data, and the processing of satellite and aerial imagery. It also provides the capability to produce sophisticated presentation graphics and hardcopy maps. GRASS GIS has been translated into about twenty languages and supports a huge array of data formats. It can be used either as a stand-alone application or as backend for other software packages such as QGIS and R geostatistics. It is distributed freely under the terms of the GNU General Public License (GPL). GRASS GIS is a founding member of the Open Source Geospatial Foundation (OSGeo).

The GRASS Development Team, July 2018

The post Celebrating 35 years of GRASS GIS! appeared first on GFOSS Blog | GRASS GIS and OSGeo News.

Categories: OSGeo Planet

GRASS GIS: 35 years of GRASS GIS development

OSGeo Planet - Sun, 2018-07-29 10:46
Celebrating 35 years of GRASS GIS!
Categories: OSGeo Planet
Syndicate content