Quais linguagens de programação são usadas por diferentes plataformas GIS? [fechadas]

8

Suponha que um programador não tenha conhecimento de GIS, mas queira aproveitar suas habilidades de programação para entrar no GIS. Por favor, liste diferentes plataformas GIS, pacotes, etc. que usam um idioma específico.

(Eu estava pensando, como sugerido , em fazer um teste simples do recurso de formatação de código do StackExchange. Acho que isso pode ser feito no contexto de uma resposta útil.)

Quando você responder, se o idioma for um dos listados abaixo, publique um trecho de código e teste a formatação para garantir que ele funcione. Aqui está um trecho da resposta de Jeff Atwood sobre o meta-stackoverflow .

A especificação é:

<!-- language: lang-or-tag-here -->

    code goes here

<!-- language: lang-or-tag-here -->

    code goes here

Você pode usar uma tag ou um código de idioma de pré -identificação para especificar, embora os códigos de idioma de pré-identificação sempre garantam que funcione, independentemente do idioma em que a marca estiver definida.

Use <!-- language-all: lang-or-tag -->para usar o realce fornecido para todos os seguintes blocos de código.

A lista completa dos idiomas de código de pré-identificação suportados é:

  • lang-none
  • lang-default
  • lang-bsh
  • lang-c
  • lang-cpp
  • lang-cs
  • lang-csh
  • lang-css
  • lang-hs
  • lang-html
  • lang-java
  • lang-js
  • lang-lisp
  • lang-lua
  • lang-ml
  • lang-perl
  • lang-php
  • lang-py
  • lang-proto
  • lang-rb
  • lang-scala
  • lang-sh
  • lang-sql
  • lang-vb
  • lang-xml
desconhecidos
fonte

Respostas:

11

Algumas linguagens de script geoespacial:

1) Python / Jython

Somente Python / Jython:

Python e Jython podem ser usados ​​sozinhos para processar dados geoespaciais sem nenhum software, usando módulos como osgeo (GDAL / OGR), PySAL, Shapely, Fiona, Pyshp, ..., consulte Índice de Pacotes Python, Tópico: GIS ou Geoscript (Jython) . Existem muitos exemplos em GST

como linguagem de script em aplicativos

QGIS, GRASS GIS, GvSIG, OpenJump ou Geoserver (e ArcGIS, veja acima) usam Python / Jython para scripts:

  • Quantum GIS ( Python , 1.8, alterações na versão master)
from qgis.core import *
layer = qgis.utils.iface.activeLayer()
for elem in layer.selectedFeatures():
        geom= elem.geometry()
        attrs = elem.attributeMap()
  • GRIS GIS ( Python )
from grass.script import raster as grassr
grassr.raster_info('s_newfrst3@moi')
{'north':118869.900569, 'timestamp': '"none"', 'min': -456.08587646484398,
'datatype': 'FCELL', 'max': 265.500732421875, 'ewres':
 14.008076920000001, 'vertical_datum': '', 'west': 164160.653425,
 'units': '', 'title': ' (s_newfrst3)', 'east': 176641.849961, 'nsres':
  13.976472729999999, 'south': 112552.534895}
  • GvSIG ( Jython )
from gvsig import *
layer = currentLayer()
features = layer.features()
for feature in features:
  geom = feature.geometry()
  values = feature.getValues()
  • OpenJump ( Jython )
from org.openjump.util.python.JUMP_GIS_Framework import *
layer = getSelectedLayers()
for i in layer.iterator():
    print layer.name  
# first element of the layer
fc = layer[0].featureCollectionWrapper
for elem in range(fc.size):
    obj = fc.features[elem] 
    geom = obj.getGeometry()
  • GeoServer ( Jython )
from geoserver import Catalog
cat = Catalog('aff_geol')
print cat.stores()
[u'affleurements', u'cartes']
st = cat['affleurements']
print st.layers()
[u'affs']
l = st['affs']
print l.count()
3214
print l.bounds()
(107206.74,148102.45,114110.46,157514.40, EPSG:31370)

e você também pode usar outras bibliotecas Java, como o Java Topology Suite ( Jython ):

import sys
sys.path.append('.../jts-1.8.0/lib/jts-1.8.jar')   
from com.vividsolutions.jts.geom import Point

2) Bash

O GRASS GIS usa Bash (shell e scripts (.sh))

GRASS 6.4.2 (geol):~ > v.out.ascii in=ligneprofil format=standard | grep '^ '|\r.profile -c in=MNT res=30 output=profil.pts

3) R (sem linguagem de código de prettify)

Você pode usar R para todos os tratamentos geoespaciais, consulte Visão da Tarefa CRAN: Análise de Dados Espaciais :

library(maptools)
geol <-readShapePoly("cal.shp")
library(rgdal)
geol = readOGR(dsn=".", layer="cal")
library(PBSmapping)
geol = importShapefile("cal.shp")
library(shapefiles)
geol <- read.shapefile("cal")
# PostGIS
geol = readOGR("PG:dbname=test", "cal")

mas o GRASS GIS também pode usar R diretamente:

GRASS 6.4.2 (geol):~ > R
R version ....
> library(spgrass6) 
> G <- gmeta6() # paramètres de Grass, région etc.
> montrait <- readRAST6(c("geologie", "mnt"),cat=c(TRUE, FALSE),  ignore.stderr=TRUE,plugin=NULL)

4) BeanShell (Java)

O OpenJump também pode usar o Beanshell (console ou script)

layer = wc.layerManager .getLayer("road").featureCollectionWrapper;
getLongest() {
    max = -1;
    for (f : layer.features) { length = f.geometry.length; if (f.geometry.length > max) {max = length; result = f;}
}
return result;
print(getLongest().ID);

5) Groovy (Java), Scala e JavaScript

Você pode usar essas linguagens com o GeoScript, veja exemplos

6) Linguagem de Consulta JEQL

Conforme mostrado por Martin Davis ( label jeql )

shapefileReader t file: "agder/agder_buffer.shp";
t = select geomUnionMem(GEOMETRY) g from t;
ShapefileWriter t file: "result.shp";
5 rotações
fonte
6

SIG da velha escola sem computadores. lang-none

    Overlay acetate on paper maps, buffer with rulers,
    symbolize with dry-erase markers.
    No computers, so no language needed.
Kirk Kuykendall
fonte
3

C # pode ser usado para programar o ArcGIS. Com o ArcObjects, isso envolve lidar com muita interoperabilidade COM, portanto, qualquer conhecimento seria muito útil.

O C # também pode ser usado (sem lidar com muita interoperabilidade) no ArcGIS for WPF e no ArcGIS for Silverlight SDK.

public static IPolyline MakePolyline(IPoint p1, IPoint p2)
{
    var polyline = new PolylineClass() as IPolyline;
    ((IZAware)polyline).ZAware = true;
    ((IMAware)polyline).MAware = true;
    polyline.SpatialReference = p1.SpatialReference;
    ((IPointCollection)polyline).AddPoint(p1);
    ((IPointCollection)polyline).AddPoint(p2);
    return polyline;
}
Kirk Kuykendall
fonte
3

Muito desenvolvimento do WebGIS é feito via JavaScript. Aqui está um exemplo de código usando o OpenLayers:

        var lon = 5;
        var lat = 40;
        var zoom = 5;
        var map, layer;

        function init(){
            map = new OpenLayers.Map( 'map' );
            layer = new OpenLayers.Layer.WMS( "OpenLayers WMS",
                    "http://vmap0.tiles.osgeo.org/wms/vmap0", {layers: 'basic'} );
            map.addLayer(layer);

            map.setCenter(new OpenLayers.LonLat(lon, lat), zoom);
            map.addControl( new OpenLayers.Control.LayerSwitcher() );
        }
Devdatta Tengshe
fonte
3

O ArcGIS desde 10.0 usa Python através do arcpymódulo.

Usando o Python que acompanha o ArcGIS:

import arcpy

# Make dictionary of lookup table
dictCityProvince = {}
rows = arcpy.SearchCursor(r"C:\temp\test.gdb\CityProvinceLookup")
for row in rows:
    dictCityProvince[row.CITY] = row.PROVINCE
del row,rows

Se isso funcionar, você deve estar pronto.

Eric Brown
fonte
1

O desenvolvimento para a plataforma Android é feito usando Java.

Aqui está um código do projeto OsmDroid:

/**
 * Logs all Location-changes to <code>mRouteRecorder</code>.
 *
 * @author plusminus
 */
private class SampleLocationListener implements LocationListener {
    @Override
    public void onLocationChanged(final Location loc) {
        if (loc != null) {
            if (SampleMapActivity.this.mDoGPSRecordingAndContributing)
                SampleMapActivity.this.mRouteRecorder.add(loc,
                        SampleMapActivity.this.mNumSatellites);

            SampleMapActivity.this.onLocationChanged(loc);
        } else {
            SampleMapActivity.this.onLocationLost();
        }
    }
Devdatta Tengshe
fonte
1

Muitos projetos são desenvolvidos em C ++.

Aqui está um código-fonte do QGis:

/**
  Open the specified project file; prompt to save previous project if necessary.
  Used to process a commandline argument or OpenDocument AppleEvent.
  */
void QgisApp::openProject( const QString & fileName )
{
  // possibly save any pending work before opening a different project
  if ( saveDirty() )
  {
    // error handling and reporting is in addProject() function
    addProject( fileName );
  }
  return ;
}
Devdatta Tengshe
fonte
0

C pode ser usada com o API Arcsde C .

Vejo que ele pode ser baixado para a versão 10.1 aqui , mas não é mencionado na lista de APIs na página de ajuda . Não vejo ajuda on-line para 10.1, apenas 10.0 .

void check_rc_(SE_CONNECTION Connection, SE_STREAM Stream, LONG rc, 
                 char *comment, LONG line_no, char* file_name) ;
static LONG S_create_layer (SE_CONNECTION connection, CHAR *table,CHAR *keyword,LONG precision);
static LONG S_point_cases(SE_CONNECTION connection,const CHAR* table);
static LONG S_line_cases(SE_CONNECTION connection,const CHAR* table);
static LONG S_polygon_cases(SE_CONNECTION connection,const CHAR* table);

LONG  main(int argc, char *argv[]){
    CHAR            *server, 
                    *user, 
                    *passwd, 
                    *database,
                    *instance,
                    *rslt_layer_name;
    SE_CONNECTION   conn;
    SE_ERROR        error;
    LONG            result;
    BOOL            all_step_passed=TRUE;

    if(argc<7){
        printf("usage: %s <server> <instance> <database> <user> <passwd> <result_layer>",argv[0]);
        exit(1);
    }

    server=argv[1];
    instance=argv[2];
    database=argv[3];
    user=argv[4];
    passwd=argv[5];
    rslt_layer_name=argv[6];

    printf("\nConnecting to SDE server %s:%s as %s\n",server,instance,user);
    result = SE_connection_create( server, instance, database, user, passwd, &error, &conn );
    check_rc_return_on_failure(conn,NULL,result,"SE_connection_create");
    printf("\t---Connected");

    /*Create a layer to store results*/
    printf("\n\nCreating a layer to store results......\n");
    result=S_create_layer (conn,rslt_layer_name,"DEFAULTS",64);
    if(result!=SE_SUCCESS)
        return result;
    else
        printf("\tLayer %s created.\n",rslt_layer_name);

    /*point shapes*/
    printf("\n\n***************************************************************************\n");
    printf("* Generating buffer for point shapes......                                *\n");
    printf("***************************************************************************\n");
    result=S_point_cases(conn,rslt_layer_name);
    if(result!=SE_SUCCESS)
        return result;

    /* line shapes */
    printf("\n\n***************************************************************************\n");
    printf("* Generating buffer for line shapes......                                 *\n");
    printf("***************************************************************************\n");
    result=S_line_cases(conn,rslt_layer_name);
    if(result!=SE_SUCCESS)
        return result;

    /* polygon shapes */
    printf("\n\n***************************************************************************\n");
    printf("* Generating buffer for polygon shapes......                              *\n");
    printf("***************************************************************************\n");
    result=S_polygon_cases(conn,rslt_layer_name);
    if(result!=SE_SUCCESS)
        return result;

    SE_connection_free(conn);

}
Kirk Kuykendall
fonte
0

Visual básico

Sub SelectByBufferedLine()
    Dim xy As String
    xy = InputBox("Enter x,y coordinates for line in metres. x1,y1 x2,y2 ...xn,yn e.g. 200000,200000 250000,200000 280000,250000", "Select by buffered line (keyboard input)")
    If (xy = "") Then Exit Sub
    xy = Replace(xy, " ", ",")
    xy = Replace(xy, ",,", ",")
    Dim arr As Object
    arr = Split(xy, ",")
    Dim numvals As Integer, n As Object
    numvals = (UBound(arr, 1) - LBound(arr, 1)) + 1
    If (numvals < 4) Or ((numvals Mod 2) <> 0) Then Exit Sub
    For Each n In arr
        If (Not IsNumeric(n)) Then Exit Sub
    Next
    '
    ' Create polyline from array of x,y's
    '
    Dim pt As IPoint
    pt = New Geometry.Point
    Dim pGeometry As IGeometry
    pGeometry = New Polyline
    Dim thePointCollection As IPointCollection
    thePointCollection = pGeometry
    Dim i As Long
    For i = LBound(arr, 1) To UBound(arr, 1) - 1 Step 2
        pt.PutCoords(arr(i), arr(i + 1))
        thePointCollection.AddPoint(pt)
    Next
    '
    ' Buffer the line
    '
    Dim topoOP As ITopologicalOperator
    Dim theBufferPoly As IPolygon
    topoOP = pGeometry
    topoOP.Simplify()
    Dim bufdist As String
    bufdist = InputBox("Enter buffer distance(m)", "Select by buffered line", 0)
    If (Not IsNumeric(bufdist)) Then Exit Sub
    theBufferPoly = topoOP.Buffer(bufdist)
    pGeometry = theBufferPoly
    '
    ' Query the Active Layer
    '
    Call SpatialQuery(My.ArcMap.Application, pGeometry)
    '
    ' Set Visible Extent
    '
    Dim pDoc As IMxDocument = My.ArcMap.Document
    Dim theExtent As IEnvelope
    theExtent = pGeometry.Envelope
    theExtent.Expand(2, 2, True)
    pDoc.ActiveView.Extent = theExtent
    pDoc.ActiveView.Refresh()
End Sub
nmtoken
fonte