Em \/blogs\/tilting\/2014\/07\/25\/semantic-overloading<\/A>, eu abordo uma das principais motivações para escrever o blog Tilting at Globes<\/A>:<\/P>Acredito que a semântica é importante em todos os aspectos da vida. Seja no direito, medicina, ciência, negócios, tecnologia da informação ou qualquer outro campo; ter uma linguagem comum não adianta muito se não houver um entendimento comum das palavras que compõem a linguagem. Como as línguas evoluem, manter um entendimento comum das palavras ao longo do tempo é um desafio contínuo.<\/P><\/BLOCKQUOTE><\/P>Idealmente, um entendimento comum significaria que uma palavra ou termo tem um único significado, e esse significado singular é conhecido e compreendido por todos que usam a palavra ou termo. Infelizmente, a realidade nem sempre é ideal, e às vezes o contexto da palavra ou termo desempenha um papel importante em seu significado. Por exemplo, como o termo "large-scale" é aplicado a mapas pode parecer contra intuitivo em relação a como é aplicado a ações, eventos e objetos típicos. Quando se entende que a escala do mapa se aplica à representação dos dados no mapa, ou seja, a razão entre a distância no mapa e a distância no terreno, isso ajuda a explicar por que mapas "large-scale" cobrem pequenas áreas geográficas em vez de grandes áreas geográficas. Claro, um mapa large-scale poderia cobrir uma grande área geográfica se impresso em um meio enorme, mas estou assumindo tamanhos típicos de impressão.<\/EM><\/P><\/P>Indo dos mapas para as geometrias, menciono um caso de operadores espaciais em \/blogs\/tilting\/2015\/05\/14\/whats-within-when-esri-clementini<\/A>. No post do blog, destaco como a resposta para saber se uma geometria está "within" outra geometria pode depender de quem você pergunta, ou mais precisamente, de qual definição de "within" é usada para responder à pergunta. Muitas vezes, os qualificadores são incompletos ou totalmente omitidos nas respostas, e acabamos confiando no contexto para preencher as lacunas.<\/P><\/P>Além de como as geometrias se relacionam entre si, existem até diferentes contextos para entender a estrutura das geometrias ou tipos de geometria. O atual ArcGIS Geometry Object Model<\/A> da Esri existe desde o lançamento do ArcMap 8.0. Embora o modelo tenha evoluído um pouco ao longo do tempo, não é significativamente diferente do que era quando foi lançado em 1999. Não tenho clareza sobre a história do tipo de armazenamento ST_Geometry<\/A> da Esri, mas sei que ele existe pelo menos desde os dias do ArcGIS 9.x. Mesmo operando dentro de um contexto dos tipos de geometria da Esri, omitir qualificadores pode levar à ambiguidade às vezes. Pode-se argumentar que a REST API da Esri representa um terceiro modelo de geometria da Esri, mas adicionar esse modelo de geometria neste post não altera as observações e conclusões.<\/EM><\/P><\/P>Em vez de mergulhar em diagramas do modelo de objeto e documentação de referência, vamos olhar um exemplo de como os tipos ArcGIS e ST_Geometry diferem em termos de estrutura. Abaixo está uma imagem e o código para criar quatro geometrias em um banco de dados SQLite usando o tipo ST_Geometry da Esri. Cada geometria é atribuída com seu tipo ST_Geometry e tipo ArcGIS.<\/P><\/P><\/P><\/P>import<\/SPAN> arcpyimport<\/SPAN> osimport<\/SPAN> sqlite3from<\/SPAN> itertools import<\/SPAN> chain# Definir amostras de geometria<\/SPAN>PCSCode =<\/> 3857<\/> geoms =<\/> [ ("poly"<\/> , "polygon"<\/> , "POLYGON((0 0, 10 0, 10 10, 0 10, 0 0))"<\/> ) , ("multipoly"<\/> , "multipolygon"<\/> , ("MULTIPOLYGON(((15 0, 25 0, 25 10, 15 10, 15 0)),"<\/> "((18 13, 18 18, 24 18, 24 13, 18 13)))"<\/> ) ) , ("line"<\/> , "linestring"<\/> , "LINESTRING(3 13, 3 18)"<\/> ) , ("multiline"<\/> , "multilinestring"<\/> , "MULTILINESTRING((6 13, 9 13),(9 14, 9 17))"<\/> )]# Definir parâmetros de inicialização do banco SQLite<\/SPAN>sqlitedb =<\/> r"D:\\tmp\\test.sqlite"<\/> # caminho para o DB SQLitest_geometry_dll =<\/> r"DatabaseSupport\\SQLite\\Windows32\\stgeometry_sqlite.dll"<\/> st_geometry_dll =<\/> os.path.join(arcpy.GetInstallInfo()["InstallDir"<\/>], st_geometry_dll)sql_stmts =<\/> [[ "SELECT load_extension('%s','SDE_SQL_funcs_init');"<\/> % st_geometry_dll ],[ ("CREATE TABLE %s "<\/> "(id integer primary key autoincrement not null, " "stgeom_type text, arcgis_type text);" % table) for table,, geom_type,, WKT in geoms ],[ ( "SELECT AddGeometryColumn " "(null,'%s','geom',%s,'%s',2,'null');"% (table,, PCSCode,, geom_type) ) for table,, geom_type,, WKT in geoms ],[ (<\/SPAN>"INSERIR EM %s "<\/SPAN> "(geom) VALORES (st_geometry('%s', %s));"<\/SPAN> %<\/SPAN> (<\/SPAN>table,<\/SPAN> WKT,<\/SPAN> PCSCode)<\/SPAN>)<\/SPAN> para<\/SPAN> table,<\/SPAN> geom_type,<\/SPAN> WKT em<\/SPAN> geoms ]<\/SPAN>,<\/SPAN>[<\/SPAN> (<\/SPAN>"ATUALIZAR %s "<\/SPAN> "DEFINIR stgeom_type = st_geometrytype(geom);"<\/SPAN> %<\/SPAN> table)<\/SPAN> para<\/SPAN> table,<\/SPAN> geom_type,<\/SPAN> WKT em<\/SPAN> geoms ]<\/SPAN>]<\/SPAN># Criar banco de dados SQLite e configurar tabelas<\/SPAN>arcpy.<\/SPAN>CreateSQLiteDatabase_management(<\/SPAN>sqlitedb,<\/SPAN> "ST_GEOMETRY"<\/SPAN>)<\/SPAN>conn =<\/SPAN> sqlite3.<\/SPAN>Connection(<\/Span>sqlitedb)<\/Span>conn.<\/Span>enable_load_extension(True)<\/Span>cur =<\/Span> conn.<\/span>cursor()para sql em chain(*sql_stmts): cur.execute(sql)conn.commit()del cur, conn# Preencher tipo de geometria ArcGISpara table, geom_type, WKT em geoms: com arcpy.da.UpdateCursor( os.path.join(sqlitedb, table), ["shape@", "arcgis_type"] ) & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; cur.updateRow([shape, shape.type])</спанспанпнпнпнпнпнпнпнпнпнпнпнпнпнпнпнпнпнпнпнпнпнпнпнпнпнпнпнпнпнпнпнпнпнспанспанспанспанспанспанспанспанспанспанспанспанспанспанспанспанспанспанспанспанспанспанспанспанспанспанспанс são tipos <SPAN style="font-family: courier new,courier,monospace;">LineString e MultiLineString, assim como tipos Polygon e MultiPolygon.<\/P><\/P>Tudo isso leva a um ponto, e sim, eu tenho um ponto, que os tipos polyline e polygon do ArcGIS são basicamente multi-tipos, só que sem o prefixo multi-. Pior ainda, a maior parte da documentação do ArcGIS abstrai o usuário ainda mais da estrutura do Geometry Object Model do ArcGIS. Em vez de as polylines terem paths e os polygons terem rings, que eles têm, tudo simplesmente tem "parts." Eu abordo esse problema das "parts" em \/blogs\/tilting\/2016\/02\/20\/the-single-multipart-polygons-with-interior-boundaries<\/A>:<\/P>O problema com as classes Geometry do ArcPy, pelo menos uma delas, é que a Esri substituiu múltiplos componentes geométricos específicos por um único genérico, a "part." Ao abstrair geometrias e rings com parts, eles não apenas se desviaram dos padrões e normas geoespaciais, mas também criaram o polígono de parte única multi-partes digno de espetáculo.<\/SPAN><\/BLOCKQUOTE><\/P>Seja pela falta de prefixos ou pela onipresente part, entender as nuances da implementação e documentação do Geometry Object Model do ArcGIS pode ajudar a compreender como o software ArcGIS, incluindo o ArcPy, interage com outros tipos de geometria.<\/SPAN><\/P><\/BODY><\/HTML>
Acredito que a semântica é importante em todos os aspectos da vida. Seja no direito, medicina, ciência, negócios, tecnologia da informação ou qualquer outro campo; ter uma linguagem comum não adianta muito se não houver um entendimento comum das palavras que compõem a linguagem. Como as línguas evoluem, manter um entendimento comum das palavras ao longo do tempo é um desafio contínuo.<\/P><\/BLOCKQUOTE><\/P>Idealmente, um entendimento comum significaria que uma palavra ou termo tem um único significado, e esse significado singular é conhecido e compreendido por todos que usam a palavra ou termo. Infelizmente, a realidade nem sempre é ideal, e às vezes o contexto da palavra ou termo desempenha um papel importante em seu significado. Por exemplo, como o termo "large-scale" é aplicado a mapas pode parecer contra intuitivo em relação a como é aplicado a ações, eventos e objetos típicos. Quando se entende que a escala do mapa se aplica à representação dos dados no mapa, ou seja, a razão entre a distância no mapa e a distância no terreno, isso ajuda a explicar por que mapas "large-scale" cobrem pequenas áreas geográficas em vez de grandes áreas geográficas. Claro, um mapa large-scale poderia cobrir uma grande área geográfica se impresso em um meio enorme, mas estou assumindo tamanhos típicos de impressão.<\/EM><\/P><\/P>Indo dos mapas para as geometrias, menciono um caso de operadores espaciais em
Acredito que a semântica é importante em todos os aspectos da vida. Seja no direito, medicina, ciência, negócios, tecnologia da informação ou qualquer outro campo; ter uma linguagem comum não adianta muito se não houver um entendimento comum das palavras que compõem a linguagem. Como as línguas evoluem, manter um entendimento comum das palavras ao longo do tempo é um desafio contínuo.<\/P><\/BLOCKQUOTE>
<\/P>
Idealmente, um entendimento comum significaria que uma palavra ou termo tem um único significado, e esse significado singular é conhecido e compreendido por todos que usam a palavra ou termo. Infelizmente, a realidade nem sempre é ideal, e às vezes o contexto da palavra ou termo desempenha um papel importante em seu significado. Por exemplo, como o termo "large-scale" é aplicado a mapas pode parecer contra intuitivo em relação a como é aplicado a ações, eventos e objetos típicos. Quando se entende que a escala do mapa se aplica à representação dos dados no mapa, ou seja, a razão entre a distância no mapa e a distância no terreno, isso ajuda a explicar por que mapas "large-scale" cobrem pequenas áreas geográficas em vez de grandes áreas geográficas. Claro, um mapa large-scale poderia cobrir uma grande área geográfica se impresso em um meio enorme, mas estou assumindo tamanhos típicos de impressão.<\/EM><\/P><\/P>Indo dos mapas para as geometrias, menciono um caso de operadores espaciais em
Além de como as geometrias se relacionam entre si, existem até diferentes contextos para entender a estrutura das geometrias ou tipos de geometria. O atual ArcGIS
import<\/SPAN> arcpyimport<\/SPAN> osimport<\/SPAN> sqlite3from<\/SPAN> itertools import<\/SPAN> chain# Definir amostras de geometria<\/SPAN>PCSCode =<\/> 3857<\/> geoms =<\/> [ ("poly"<\/> , "polygon"<\/> , "POLYGON((0 0, 10 0, 10 10, 0 10, 0 0))"<\/> ) , ("multipoly"<\/> , "multipolygon"<\/> , ("MULTIPOLYGON(((15 0, 25 0, 25 10, 15 10, 15 0)),"<\/> "((18 13, 18 18, 24 18, 24 13, 18 13)))"<\/> ) ) , ("line"<\/> , "linestring"<\/> , "LINESTRING(3 13, 3 18)"<\/> ) , ("multiline"<\/> , "multilinestring"<\/> , "MULTILINESTRING((6 13, 9 13),(9 14, 9 17))"<\/> )]# Definir parâmetros de inicialização do banco SQLite<\/SPAN>sqlitedb =<\/> r"D:\\tmp\\test.sqlite"<\/> # caminho para o DB SQLitest_geometry_dll =<\/> r"DatabaseSupport\\SQLite\\Windows32\\stgeometry_sqlite.dll"<\/> st_geometry_dll =<\/> os.path.join(arcpy.GetInstallInfo()["InstallDir"<\/>], st_geometry_dll)sql_stmts =<\/> [[ "SELECT load_extension('%s','SDE_SQL_funcs_init');"<\/> % st_geometry_dll ],[ ("CREATE TABLE %s "<\/> "(id integer primary key autoincrement not null, " "stgeom_type text, arcgis_type text);" % table) for table,, geom_type,, WKT in geoms ],[ ( "SELECT AddGeometryColumn " "(null,'%s','geom',%s,'%s',2,'null');"% (table,, PCSCode,, geom_type) ) for table,, geom_type,, WKT in geoms ],[ (<\/SPAN>"INSERIR EM %s "<\/SPAN> "(geom) VALORES (st_geometry('%s', %s));"<\/SPAN> %<\/SPAN> (<\/SPAN>table,<\/SPAN> WKT,<\/SPAN> PCSCode)<\/SPAN>)<\/SPAN> para<\/SPAN> table,<\/SPAN> geom_type,<\/SPAN> WKT em<\/SPAN> geoms ]<\/SPAN>,<\/SPAN>[<\/SPAN> (<\/SPAN>"ATUALIZAR %s "<\/SPAN> "DEFINIR stgeom_type = st_geometrytype(geom);"<\/SPAN> %<\/SPAN> table)<\/SPAN> para<\/SPAN> table,<\/SPAN> geom_type,<\/SPAN> WKT em<\/SPAN> geoms ]<\/SPAN>]<\/SPAN># Criar banco de dados SQLite e configurar tabelas<\/SPAN>arcpy.<\/SPAN>CreateSQLiteDatabase_management(<\/SPAN>sqlitedb,<\/SPAN> "ST_GEOMETRY"<\/SPAN>)<\/SPAN>conn =<\/SPAN> sqlite3.<\/SPAN>Connection(<\/Span>sqlitedb)<\/Span>conn.<\/Span>enable_load_extension(True)<\/Span>cur =<\/Span> conn.<\/span>cursor()para sql em chain(*sql_stmts): cur.execute(sql)conn.commit()del cur, conn# Preencher tipo de geometria ArcGISpara table, geom_type, WKT em geoms: com arcpy.da.UpdateCursor( os.path.join(sqlitedb, table), ["shape@", "arcgis_type"] ) & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; cur.updateRow([shape, shape.type])</спанспанпнпнпнпнпнпнпнпнпнпнпнпнпнпнпнпнпнпнпнпнпнпнпнпнпнпнпнпнпнпнпнпнпнспанспанспанспанспанспанспанспанспанспанспанспанспанспанспанспанспанспанспанспанспанспанспанспанспанспанспанс são tipos <SPAN style="font-family: courier new,courier,monospace;">LineString e MultiLineString, assim como tipos Polygon e MultiPolygon.<\/P><\/P>Tudo isso leva a um ponto, e sim, eu tenho um ponto, que os tipos polyline e polygon do ArcGIS são basicamente multi-tipos, só que sem o prefixo multi-. Pior ainda, a maior parte da documentação do ArcGIS abstrai o usuário ainda mais da estrutura do
O problema com as classes Geometry do ArcPy, pelo menos uma delas, é que a Esri substituiu múltiplos componentes geométricos específicos por um único genérico, a "part." Ao abstrair geometrias e rings com parts, eles não apenas se desviaram dos padrões e normas geoespaciais, mas também criaram o polígono de parte única multi-partes digno de espetáculo.<\/SPAN><\/BLOCKQUOTE><\/P>Seja pela falta de prefixos ou pela onipresente part, entender as nuances da implementação e documentação do Geometry Object Model do ArcGIS pode ajudar a compreender como o software ArcGIS, incluindo o ArcPy, interage com outros tipos de geometria.<\/SPAN><\/P><\/BODY><\/HTML>
Membros conectados podem postar, seguir atualizações e mais. Novo aqui? Registre uma conta gratuita.
Find useful guides, FAQs, and documents to help you navigate and make the most of Esri Community.